Sklearn中的数值分类变量
我有点好奇,sklearn是怎么处理用数字表示的分类变量的,比如纽约=1,波士顿=2,芝加哥=3。Python会知道这些是分类变量,还是只是把它们当作有序的数字来处理呢?我在这里看到有人讨论这个问题,但我不确定那是否正确。
另外,我也不太清楚我是否应该把它们都转换成稀疏矩阵格式,比如:
[1,0,0]
[0,1,0]
[0,0,1]
在sklearn库中,这两种格式有什么区别呢?
如果sklearn对分类变量处理得不好,那R会在这方面更强吗?
谢谢!
更新:
我看到@larsmans推荐的重复问题,但实际上并没有回答我关于这篇帖子中提到的内容,帖子里说sklearn对分类变量处理不好,以及它和R中的包相比如何。我之前也看到一些帖子说在处理大数据集时没问题,但会影响小数据集。从@larsmans的回答来看,除了树算法,其他方法应该把数字分类变量转换成虚拟变量。实际上,我每个变量都有3000多个类别。我觉得用DictVectorizer或oneHotEncoder把它们都转换成稀疏矩阵并不是一个高效的方法。
1 个回答
2
看起来你需要的是DictVectorizer这个工具。
用简单的数字来表示多类别的分类变量可能不是个好主意。更好的做法是把这个有n个类别的变量转换成n个布尔变量。在你的例子中,应该创建3个新的布尔变量,分别用来标记“==纽约”、“==波士顿”和“==芝加哥”。
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.]]