二分类(男女为10)、三分类、标准化处理、独热编码、二进制编码
二分类:
data["Sex"] = (data["Sex"]== "male").astype("int")
对其解析:
将 "Sex" 列中所有值为 "male" 的行转换为 1,而将所有值为 "female" 的行转换为 0,是通过先将 "Sex" 列中的每个值与 "male" 进行比较,将比较结果转换为布尔值(True 或 False),然后使用 astype() 函数将布尔值转换为整数(True 转换为 1,False 转换为 0)实现的。最后,将转换后的结果存储回 "Sex" 这一列中,从而完成了对 "Sex" 列的转换操作。
三分类:
labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))
对其解析:
-
使用 apply() 函数对 "Embarked" 列中的每个特征值进行遍历和操作。
-
对于每个特征值 x,使用匿名函数 lambda x: labels.index(x) 的方式,将其转换为该特征值在上一步中得到的特征值列表 labels 中的索引号(即将分类数据转换为数字值),并将转换结果赋值给原来的 "Embarked" 列。
eg:如果 "Embarked" 列包含三个不同的特征值 S, C, Q,则在应用上述代码后,S 将被转换为 0,C 将被转换为 1,Q 将被转换为 2。需要注意的是,这种转换只适用于特征包含枚举类型的分类变量。
标准化数据:
airline_features = pd.concat([L, airline_selection.iloc[:, 2:]], axis=1)
print('构建的LREMC特征前5行为:\n', airline_features.head())
# 对数据进行标准化处理,StandardScaler() 是一个用于特征缩放的类,它可以将特征缩放到均值为 0,标准差为 1 的标准正态分布中
from sklearn.preprocessing import StandardScaler
data = StandardScaler().fit_transform(airline_features)
np.savez('./airline_scale.npz',data)
print('标准化后LRFMC五个特征为:\n', data[:5,:])
运行结果:
拓展:独热编码或二进制编码
一.
独热编码又称为 one-hot 编码,是最常用的分类变量编码方法之一。对于一个有 N 个不同取值的分类变量,独热编码将其转换为一个 N 维向量,其中只有一维的值为 1,其余维度的值都为 0。例如,如果一个分类变量有三个取值 A, B, C,则独热编码将其转换为如下三维向量:
独热编码 | 取值 |
---|---|
[1, 0, 0] | A |
[0, 1, 0] | B |
[0, 0, 1] | C |
from sklearn.preprocessing import OneHotEncoder
# 定义一个包含三个取值的分类变量
categorical_values = ['A', 'B', 'C']
# 创建一个 OneHotEncoder 对象,并拟合数据
encoder = OneHotEncoder(categories=[categorical_values])
encoder.fit(categorical_values.reshape(-1, 1))
# 使用 encoder 进行独热编码
one_hot_encoded = encoder.transform(categorical_values.reshape(-1, 1))
print(one_hot_encoded.toarray())
二.
二进制编码是一种将分类变量转换为二进制数的编码方式。它的原理是将每个分类变量的取值映射到一个二进制数上,然后再将这些二进制数拆分成几个二进制位,在数据矩阵中占据相应的列。例如,假设有一个分类变量有四个取值 A, B, C 和 D,则可以将其转换为如下 2 位二进制数:
取值 | 二进制编码 |
---|---|
A | 00 |
B | 01 |
C | 10 |
D | 11 |
然后,将这些 2 位二进制数拆分成两列分别表示二进制数的第 1 和第 2 位,从而得到如下数据矩阵:
A | B | C | D |
---|---|---|---|
1 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 |
相比于独热编码,二进制编码能够使数据占用的空间更少,并且在存储和计算上的效率更高。但对于分类变量的取值数量较少的情况,使用独热编码更加简单明了。
from sklearn.preprocessing import LabelBinarizer
# 定义一个包含四个取值的分类变量
categorical_values = ['A', 'B', 'C', 'D']
# 创建一个 LabelBinarizer 对象,并拟合数据
encoder = LabelBinarizer()
encoder.fit(categorical_values)
# 使用 encoder 进行二进制编码
binary_encoded = encoder.transform(categorical_values)
print(binary_encoded)