【数据分析/挖掘】如何处理类别型特征?常用编码方式?Python实现?

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(序号编码)独热编码二进制编码
A11 0 0 00 0 1
B20 1 0 00 1 0
AB30 0 1 00 1 1
O40 0 0 11 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))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值