将分类数据传递到Sklearn Decision T

关于如何将分类数据编码到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传递分类数据,这可能吗?

0xhfff asked 2020-01-14T04:50:41Z
4个解决方案
17 votes

(这只是我从2016年开始的上述评论的格式,它仍然成立。)

该问题的公认答案具有误导性。

就目前而言,sklearn决策树不处理分类数据-请参阅问题#5442。

推荐的使用标签编码的方法将转换为OneHotEncoder将视为整数的整数。 如果您的分类数据不是序数,那将是不好的-您将得到没有意义的拆分。

使用OneHotEncoder是当前唯一有效的方法,它允许不依赖标签顺序的任意分割,但是计算量大。

James Owers answered 2020-01-14T04:52:06Z
8 votes

(..)

能够处理数字和分类数据。

这仅意味着您可以使用

  • 分类问题的DecisionTreeClassifier类
  • 用于回归的DecisionTreeRegressor类。

无论如何,在使用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'])
Guillaume answered 2020-01-14T04:52:48Z
4 votes

与接受的答案相反,我更愿意为此目的使用Scikit-Learn提供的工具。 这样做的主要原因是它们可以轻松集成到管道中。

Scikit-Learn本身提供了很好的类来处理分类数据。 除了应编写自定义函数外,还应使用为此目的专门设计的OneHotEncoder

请参考文档中的以下代码:

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
le.transform(["tokyo", "tokyo", "paris"]) 

这会自动将它们编码为适合您的机器学习算法的数字。 现在,这也支持从整数返回到字符串。 您可以通过简单地调用OneHotEncoder来做到这一点,如下所示:

list(le.inverse_transform([2, 2, 1]))

这将返回OneHotEncoder

还要注意,对于其他许多分类器,除了决策树(例如逻辑回归或SVM)之外,您还想使用One-Hot编码对分类变量进行编码。 Scikit-learn也通过OneHotEncoder类对此提供支持。

希望这可以帮助!

Abhinav Arora answered 2020-01-14T04:51:28Z
3 votes

Sklearn决策树不处理分类字符串到数字的转换。 我建议您在Sklearn中找到一个函数(也许是这样),或者手动编写一些代码,例如:

def cat2int(column):
    vals = list(set(column))
    for i, string in enumerate(column):
        column[i] = vals.index(string)
    return column
mrwyatt answered 2020-01-14T04:53:08Z
translate from https://stackoverflow.com:/questions/38108832/passing-categorical-data-to-sklearn-decision-tree