1、如何处理类别型特征
类别特征(Categorical Feature)主要是指性别(男、女)、血型(A、B、AB、O)等只在有限选项内取值的特征。类别型特征的原始输入通常是字符串形式,除了决策树等少数模型能直接处理字符串的输入,对于逻辑回归、支持向量机等模型来说,类别型特征必须经过处理转换成数值型才能正确工作。
在处理类别型特征,可以通过各种方式的编码来处理。比如序号编码、 独热编码、二进制编码等

2、常用编码方法
2.1 序号编码
序号编码通常用于处理类别间具有大小关系的数据。例如成绩,一般分为不及格、及格、良好、优秀,并且存在“不及格 < 及格 < 良好 < 优秀”的排序关系。序号编码会按照大小关系对类别型特征赋值一个数值ID,例如不及格表示为0、及格表示为1、良好表示为2、优秀表示为3,转换后依然保留大小关系。

2.2 独热编码
独热编码通常用于处理类别间具备大小关系的特征。例如血型,一共有四个取值,独热编码会把血型变成一个四维稀疏矩阵,A型血表示为(1,0,0,0),B血型为(0,1,0,0),AB表示为(0,0,1,0),O型血表示为(0,0,0,1)。
对于类别取值较多的情况下使用独热编码需要注意以下问题:
1.使用稀疏向量来节省空间
2. 配合特征选择来降低维度
2.3 二进制编码
二进制编码主要分为两步,先用序号编码给每一个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。
| 血型 | 类别 ID(序号编码) | 独热编码 | 二进制编码 |
|---|---|---|---|
| A | 1 | 1 0 0 0 | 0 0 1 |
| B | 2 | 0 1 0 0 | 0 1 0 |
| AB | 3 | 0 0 1 0 | 0 1 1 |
| O | 4 | 0 0 0 1 | 1 0 0 |
3、其他类型编码
3.1 Helmert Contrast
https://www.ibm.com/support/knowledgecenter/en/SSLVMB_24.0.0/spss/base/contrasts.html
Helmert. Compares the mean of each level of the factor (except the last) to the mean of subsequent levels.(将因子的每个级别的均值(最后一个级别除外)与后续级别的均值进行比较)
3.2 Sum Contrast

3.3 Polynomial Contrast
Polynomial. Compares the linear effect, quadratic effect, cubic effect, and so on. The first degree of freedom contains the linear effect across all categories; the second degree of freedom, the quadratic effect; and so on. These contrasts are often used to estimate polynomial trends.
3.4 Backward Difference Contrast
Difference. Compares the mean of each level (except the first) to the mean of previous levels. (Sometimes called reverse Helmert contrasts.)
能力有限,其他类型编码还需大佬们一一解释!!
4、Python实现
有个第三方开源包—— category_encoders,可以使用多种不同的编码技术把类别型变量转换成数值型变量,并符合Sklearn模型的转换。
4.1 下载
pip install category_encoders

4.2 使用
序号编码
import category_encoders as ce
import pandas as pd
import numpy as np
X = pd.DataFrame(np.array([['A',1],['B', 2], ['AB',2],['A',1],['O',4],['AB',3],['B',2],
['A',1],['B', 2], ['A',1],['AB',3],['O',3],['B',2],['O',4]]),
columns=['Blood Type','ID'])
y = np.array([1,2,3,1,4,3,2,1,2,1,3,4,2,4])
encoder1 = ce.OrdinalEncoder(cols=['Blood Type','ID']).fit(X,y)
print(encoder1.transform(X))

独热编码
encoder2 = ce.OneHotEncoder(cols=['Blood Type','ID']).fit(X,y)
print(encoder2.transform(X))

二进制编码
encoder3 = ce.BinaryEncoder(cols=['Blood Type',"ID"]).fit(X,y)
print(encoder3.transform(X))

Helmert Contrast
encoder4 = ce.HelmertEncoder(cols=['Blood Type',"ID"]).fit(X,y)
print(encoder4.transform(X))

Sum Contrast
encoder5 = ce.SumEncoder(cols=['Blood Type',"ID"]).fit(X,y)
print(encoder5.transform(X))

1万+

被折叠的 条评论
为什么被折叠?



