我有一个关于几千个城市的学校数据的数据框。学校是行标识符,城市编码如下:
school city category capacity
1 azez6576sebd 45 23
2 dsqozbc765aj 12 236
3 sqdqsd12887s 8 63
4 azez6576sebd 7 234
...
如何知道我有几千个城市,我怎样才能将城市变量转换为数字?我想单热编码是不合适的,因为我会有太多列。将具有数千个级别的分类变量转换为数字的一般方法是什么?
谢谢。
答案 0 :(得分:5)
您可以在sklearn中使用类别dtype,它应该是labelencoder
df.city=df.city.astype('category').cat.codes
df
Out[385]:
school city category capacity
0 1 0 45 23
1 2 1 12 236
2 3 2 8 63
3 4 0 7 234
答案 1 :(得分:1)
在ML分类器的上下文中,仍然可以管理几千列。虽然您想要留意curse of dimensionality。
除此之外,您不希望get_dummies
调用导致内存井喷,因此您可以生成SparseDataFrame
-
v = pd.get_dummies(df.set_index('school').city, sparse=True)
v
azez6576sebd dsqozbc765aj sqdqsd12887s
school
1 1 0 0
2 0 1 0
3 0 0 1
4 1 0 0
type(v)
pandas.core.sparse.frame.SparseDataFrame
您可以使用sdf.to_coo
-
v.to_coo()
<4x3 sparse matrix of type '<class 'numpy.uint8'>'
with 4 stored elements in COOrdinate format>
答案 2 :(得分:1)
在生产ML系统和Kaggle竞赛中使用的一种最佳方法是使用嵌入,例如其目标统计信息。因此,对于二进制目标变量,您可以为每个不同的分类值计算以下内容。
1)阳性标签数 2)否定标签数 3)比率
这是一段解释它的视频-Large-Scale Learning - Dr. Mikhail Bilenko
哈希编码器也适合具有几千个不同值的“ city”列的情况。此方法可扩展性很好。您需要指定要作为输出的二进制输出列的数量。
监督学习案例的另一种选择是目标编码器或James Stein编码器。该技术用具有该类别的行的目标平均值替换每个类别。但是,如果您的数据集样本不是很大,并且每个类别只有几个示例,则此方法可能不是很有用。
这是我提到的有用的博客文章-Encoding Categorical Variables