对于标称型数据,在特征处理的时候,需要对其进行编码
在编码之前,如果训练集和测试集是分开的,则需要对其进行合并,避免标称数据丢失
1 | # 合并 |
常用的编码方式如下
1.Label编码#
对于一个有m个category的特征,经过label encoding以后,每个category会映射到0到m-1之间的一个数。label encoding适用于ordinal feature (特征存在内在顺序)。
1 | from sklearn import preprocessing |
或者
1 | train_data = train_data.replace({'BsmtQual': {'Ex': 5, 'Gd': 4, 'TA': 3, 'Fa': 2, 'Po': 1, np.NaN: 0}}) |
2.顺序编码#
类似于Label编码
参考:数据转化
1 | from sklearn import preprocessing |
3.one-hot编码#
对于一个有m个category的特征,经过独热编码(OHE)处理后,会变为m个二元特征,每个特征对应于一个category。这m个二元特征互斥,每次只有一个激活。
独热编码解决了原始特征缺少内在顺序的问题,但是缺点是对于high-cardinality categorical feature (category数量很多),编码之后特征空间过大(此处可以考虑PCA降维),而且由于one-hot feature 比较unbalanced,树模型里每次的切分增益较小,树模型通常需要grow very deep才能得到不错的精度。因此OHE一般用于category数量 <4的情况。
参考:机器学习 | 数据缩放与转换方法(1) 和 kaggle编码categorical feature总结
使用sklearn来one-hot编码
1 | from sklearn import preprocessing |
使用pandas来one-hot编码
1 | import pandas as pd |
4.target编码#
参考:三种Target Encoding方式总结
和 kaggle编码categorical feature总结
Target Encoding是任何一种可以从目标中派生出数字替换特征类别的编码方式。这种目标编码有时被称为平均编码。应用于二进制目标时,也被称为bin counting。
target encoding的缺点主要有:
- 未知类别,会产生过拟合风险;
- 空值,采用填充的方法不能很好的进行评估;
- 长尾类别,对长尾类别这种少量数据的编码会导致过拟合;
target encoding的优点主要有:
- 高维数据特征:具有大量类别的可能很难编码:One-hot会生成太多维度,而替代方案(如标签编码)可能不适合该类型。Target encoding在此处就很好的解决了这个问题;
- 领域经验特征:根据之前的经验,即使某项数据它在特征度量方面得分很低,你也可能会觉得一个分类特征应该很重要。Target encoding有助于揭示特征的真实信息。
5.模型自动编码#
- XGBoost和Random Forest,不能直接处理categorical feature,必须先编码成为numerical feature。
- lightGBM和CatBoost,可以直接处理categorical feature。
- lightgbm: 需要先做label encoding。用特定算法(On Grouping for Maximum Homogeneity)找到optimal split,效果优于ONE。也可以选择采用one-hot encoding,。Features - LightGBM documentation
- CatBoost: 不需要先做label encoding。可以选择采用one-hot encoding,target encoding (with regularization)。CatBoost — Transforming categorical features to numerical features — Yandex Technologies