Sklearn中的数值分类变量

-1 投票
1 回答
1648 浏览
提问于 2025-04-18 13:26

我有点好奇,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.]]

撰写回答