Pandas数据帧编码具有数千个唯一值的分类变量

时间:2018-02-03 01:47:54

标签: python pandas categorical-data

我有一个关于几千个城市的学校数据的数据框。学校是行标识符,城市编码如下:

school city          category   capacity
1      azez6576sebd  45         23
2      dsqozbc765aj  12         236
3      sqdqsd12887s  8          63 
4      azez6576sebd  7          234 
...

如何知道我有几千个城市,我怎样才能将城市变量转换为数字?我想单热编码是不合适的,因为我会有太多列。将具有数千个级别的分类变量转换为数字的一般方法是什么?

谢谢。

3 个答案:

答案 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