Sklearn中的数字分类变量

时间:2014-07-15 17:17:40

标签: python machine-learning scikit-learn categorical-data

我对sklearn如何处理由数字表示的分类变量感到好奇,例如New York = 1 Boston = 2 Chicago = 3。请问python是分类还是仅仅将其视为有序数字?我看到一篇帖子here讨论了这个问题。我不知道它是否正确。

此外,我不知道是否应将它们全部更改为稀疏矩阵格式,例如

[1,0,0]
[0,1,0]
[0,0,1]

这两种格式在应用于sklearn库时会有什么区别?

如果sklearn无法很好地处理分类变量,R会为此打败它吗?

谢谢!

更新

我看到了@larsmans推荐的重复问题,但它实际上没有回答我的问题in this post,它说sklearn不能很好地处理分类变量,它是如何比较的使用R中的包。我之前也看过一些帖子,大型数据集可以使用,但会影响小数据集。从@larsmans看来,除了树算法之外,其他方法似乎应该将数字分类变量转移到虚拟变量。实际上每个变量我有超过3000个类别。我不认为使用DictVectorizer或oneHotEncoder将它们全部更改为稀疏矩阵是有效的。

1 个答案:

答案 0 :(得分:2)

看起来这就是您所需要的DictVectorizer

用普通数字表示多类分类变量可能不是一个好主意。最佳实践应该是将n级分类变量转换为n个布尔变量。在您的示例中,应创建3个新的布尔变量来标记“== New York”,“== Boston”和“== Chicago”。

from sklearn.feature_extraction import DictVectorizer
v = DictVectorizer(sparse = True)


D = [{"Value" : 100, "City": "New York"},
     {"Value" : 70, "City": "Boston"},
     {"Value" : 99, "City": "Chicago"},
     ]

X = v.fit_transform(D)
print v.get_feature_names()
print X

输出:

['City=Boston', 'City=Chicago', 'City=New York', 'Value']
[[   0.    0.    1.  100.]
 [   1.    0.    0.   70.]
 [   0.    1.    0.   99.]]