Python金融数据挖掘与分析实战
上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()