上QQ阅读APP看书,第一时间看更新
3.2.4 类别变量转换
大多数后面用到的模型都需要数字类型的输入变量,但是很难避免源数据中不包含类别数据。这就意味着我们需要先将类别数据转换为数字,再进行模型训练和评估。这里我们继续结合前文提到的Income_n_onlineshopping案例进行介绍。
# 填补缺失值后的数据 dataset
结果如图3-11所示。
图3-11 缺失值处理后的数据
这里的Region(地区)和Online Shopper(是否为线上购物者)两个特征数据就是类别数据,需要进行转换,最为常用的转换方法就是通过独热编码(One Hot Encoder)实现,具体有三种实现方式,分析如下。
1.Pandas库中的get_dummies
将类别数据转换为虚拟变量(dummy variable,也称为哑变量)。
import pandas as pd # 导入pandas dataset = pd.get_dummies(data=dataset)
结果如图3-12所示。
图3-12 Region转换为虚拟变量
这里有一个问题,枚举一个类别特征中的所有取值情况时会产生出大量新的维度。比如源数据中的一个特征是表示中国的省级行政区,那么在进行虚拟变量转换后会产生34个新维度。新维度信息密度低,导致结果异常稀疏,难以进行优化,特别是对于神经网络算法不友好。当然,如果类别数量较少,这种方法还是可行的。
2.Sklearn库中的DictVectorizer
Python字典特征提取器DictVectorizer能够对字典数据结构进行向量化转换。类别特征借助原型特征名称,采用0、1二值方式进行向量化,而数值类型特征保持不变。
from sklearn.feature_extraction import DictVectorizer x = dataset[['Region']].copy() # 采用DictVectorizer需要先将数据集转换为dict # orient=records 表示转换为{'key':value}的形式 x_dict = x.to_dict(orient = 'records') x_dict[:5] # 设置 spares=Flase,输出的就不再是一个稀疏矩阵 dv_encoder = DictVectorizer(sparse = False) x_encoded = dv_encoder.fit_transform(x_dict) x_encoded array([[0., 1., 0.], [1., 0., 0.], [0., 0., 1.], [1., 0., 0.], [0., 0., 1.], [0., 1., 0.], [1., 0., 0.], [0., 1., 0.], [0., 0., 1.], [0., 1., 0.]]) x_encoded.shape (10, 3)
3.Sklearn库中的LabelEncoder
LabelEncoder主要用于对目标标签进行编码,值分布在0到class-1之间。对各种标签分配一个可数的连续编号,转换后的效果如图3-13所示。
图3-13 转换后的效果
from sklearn.preprocessing import LabelEncoder # 处理类别数据 le = LabelEncoder() col = ['Region', 'Online Shopper'] # 对每个数值进行编码 dataset[col] = dataset[col].apply(lambda c:le.fit_transform(c)) dataset.head()