关于如何将分类数据编码到Sklearn决策树中,有几篇文章,但是从Sklearn文档中,我们得到了这些。
决策树的一些优点是: (…) 能够处理数字和分类数据。其他技术通常专用于分析仅具有一种类型的变量的数据集。有关更多信息,请参见算法。
决策树的一些优点是:
(…)
能够处理数字和分类数据。其他技术通常专用于分析仅具有一种类型的变量的数据集。有关更多信息,请参见算法。
但是运行以下脚本
import pandas as pd from sklearn.tree import DecisionTreeClassifier data = pd.DataFrame() data['A'] = ['a','a','b','a'] data['B'] = ['b','b','a','b'] data['C'] = [0, 0, 1, 0] data['Class'] = ['n','n','y','n'] tree = DecisionTreeClassifier() tree.fit(data[['A','B','C']], data['Class'])
输出以下错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/site-packages/sklearn/tree/tree.py", line 154, in fit X = check_array(X, dtype=DTYPE, accept_sparse="csc") File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 377, in check_array array = np.array(array, dtype=dtype, order=order, copy=copy) ValueError: could not convert string to float: b
我知道在R中可以通过Sklearn传递分类数据,这可能吗?
与接受的答案相反,我更愿意使用Scikit- Learn提供的工具来实现此目的。这样做的主要原因是可以轻松地将它们集成到管道中。
Scikit-Learn本身提供了很好的类来处理分类数据。你不想编写自定义函数,你应该使用LabelEncoder它 专门为此设计的 。
LabelEncoder
请参考文档中的以下代码:
from sklearn import preprocessing le = preprocessing.LabelEncoder() le.fit(["paris", "paris", "tokyo", "amsterdam"]) le.transform(["tokyo", "tokyo", "paris"])
这会自动将它们编码为数字,以供您的机器学习算法使用。现在,这也支持从整数返回字符串。您可以通过简单地inverse_transform如下调用来做到这一点:
inverse_transform
list(le.inverse_transform([2, 2, 1]))
这将返回['tokyo', 'tokyo', 'paris']。
['tokyo', 'tokyo', 'paris']
还要注意,对于其他许多分类器,除了决策树(例如逻辑回归或SVM)之外,您还想使用One- Hot编码对分类变量进行编码。Scikit- learn也通过OneHotEncoder该类对此提供支持。
OneHotEncoder
希望这可以帮助!