0xh*_*fff 58 python decision-tree scikit-learn
关于如何将分类数据编码为Sklearn Decission树有几篇帖子,但是从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'])
Run Code Online (Sandbox Code Playgroud)
输出以下错误:
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
Run Code Online (Sandbox Code Playgroud)
我知道在R中可以传递分类数据,Sklearn是否可能?
Jam*_*ers 19
该问题的公认答案具有误导性。
就目前而言,sklearn决策树不处理分类数据- 请参阅问题#5442。
推荐的使用标签编码的方法将转换为DecisionTreeClassifier()将被视为数字的整数。如果您的分类数据不是序数,那么这不好-您将得到没有意义的拆分。
使用a OneHotEncoder是当前唯一有效的方法,它允许任意分割而不依赖于标签顺序,但计算量大。
(..)
能够处理数字和分类数据。
这仅意味着您可以使用
无论如何,在使用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()
one_hot_data = pd.get_dummies(data[['A','B','C']],drop_first=True)
tree.fit(one_hot_data, data['Class'])
Run Code Online (Sandbox Code Playgroud)
小智 7
对于名义分类变量,我不会使用LabelEncoderbut sklearn.preprocessing.OneHotEncoder或pandas.get_dummies代替,因为这些类型的变量通常没有顺序。
从v0.24.0开始,scikit 支持在HistGradientBoostingClassifier和HistGradientBoostingRegressor 中使用分类特征!
要启用分类支持,可以将布尔掩码传递给 categorical_features 参数,指示哪个特征是分类的。在下文中,第一个特征将被视为分类特征,第二个特征将被视为数值特征:
Run Code Online (Sandbox Code Playgroud)>>> gbdt = HistGradientBoostingClassifier(categorical_features=[True, False])同样,可以传递指示分类特征索引的整数列表:
Run Code Online (Sandbox Code Playgroud)>>> gbdt = HistGradientBoostingClassifier(categorical_features=[0])
您仍然需要对字符串进行编码,否则您将收到“无法将字符串转换为浮点数”错误。有关使用将字符串转换为整数的示例,请参阅此处。OrdinalEncoder
小智 5
与接受的答案相反,我更倾向于使用Scikit-Learn提供的工具来实现此目的.这样做的主要原因是它们可以很容易地集成到管道中.
Scikit-Learn本身提供了非常好的类来处理分类数据.你不想编写自定义函数,你应该使用LabelEncoder它专门为此设计的.
请参阅文档中的以下代码:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
le.transform(["tokyo", "tokyo", "paris"])
Run Code Online (Sandbox Code Playgroud)
这会自动将它们编码为机器学习算法的数字.现在这也支持从整数返回字符串.你可以通过简单地调用inverse_transform如下来做到这一点:
list(le.inverse_transform([2, 2, 1]))
Run Code Online (Sandbox Code Playgroud)
这会回来['tokyo', 'tokyo', 'paris'].
另请注意,对于许多其他分类器,除了逻辑回归或SVM等决策树之外,您还希望使用One-Hot编码对分类变量进行编码.Scikit-learn也通过OneHotEncoder课程支持这一点.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
48986 次 |
| 最近记录: |