使用 pd.get_dummies() 清理输入数据

数据挖掘 特征选择 熊猫
2021-10-15 13:26:25

转换系列有什么好处

>>> df
   Color
0    Red
1   Blue
2  Green
3    Red

像下面这样的多个系列?

>>> pd.get_dummies(df)
   Color_Blue  Color_Green  Color_Red
0           0            0          1
1           1            0          0
2           0            1          0
3           0            0          1

也可以为颜色列设置一个热编码值,如下所示?

>>> labels=list(set(df.Color))
>>> pd.DataFrame(df.Color.map({x:labels.index(x) for x in labels}).rename('Color_Code'))
   Color_Code
0           1
1           2
2           0
3           1

我知道在语法上pd.get_dummies看起来要简单得多,但不知何故,我想倾向于使用更少的功能而不是更多的功能......

1个回答

分类特征需要转换为数值。它们有多种方法可以做到这一点。我建议阅读此博客和此博客,以了解选择每个的优点和缺点您展示的第一种方法称为单热编码,正如您所提到的,您可以通过 pd.get_dummies 轻松获得,并且经常在 XGBoost 等算法中使用。第一种方法 OHE 的最大缺点之一是经常不必要地增加特征空间的维数。其他缺点可能不能很好地代表特征空间以及测试数据中缺少特征的问题。第二种方法是LabelEncoding,通常用于目标变量或分类特征很少时。

当您开始拥有大量分类特征(> 50 % 的特征空间)并且每个特征都有许多子级别时,问题就会浮出水面。在这里,您需要更聪明的特征编码方式,例如基于目标的均值编码(平滑,您可以在 Kaggle 中找到一些类似这样的内核)。如果您是 Python 用户,我在 scikit-learn-contrib 下发现了一个相当新的,它提供了广泛的分类编码方法。这篇Kdnuggets 帖子还比较了使用不同方法的一些方面。