Kaggle学习笔记之分类变量

Kaggle Intermediate Machine Learning 分类变量

分类变量一般只有几个固定的非数值取值,未经预处理直接使用机器学习模型处理大多数会报错。

处理分类变量的三种处理方法

  1. 删除分类变量

    只适用于不包含有用信息的列

  2. 序号编码(Ordinal Encoding)

    用不同的序号来表示不同的值,维度不变

  3. one-hot编码(One-Hot Encoding)

    将分类变量转换为相应数量的二进制列,1代表某个输入属于该列的类别。(one-hot编码会增加维度,一般在分类变量值不超过15个时使用)

# 找到分类变量的列表object_cols:
s = (X_train.dtypes == 'object')
object_cols = list(s[s].index)

举例实现

1. 删除分类变量

使用select_dtypes()方法排除object

drop_X_train = X_train.select_dtypes(exclude=['object'])
drop_X_valid = X_valid.select_dtypes(exclude=['object'])

2. 序号编码

使用OrdinalEncoder类,对每一列分类变量使用序号编码,分类变量列表为object_cols

from sklearn.preprocessing import OrdinalEncoder

# 使用copy防止原始数据被修改
label_X_train = X_train.copy()
label_X_valid = X_valid.copy()

# 对分类变量列使用序号编码
ordinal_encoder = OrdinalEncoder()
label_X_train[object_cols] = ordinal_encoder.fit_transform(X_train[object_cols])
label_X_valid[object_cols] = ordinal_encoder.transform(X_valid[object_cols])

3. one-hot编码

使用OneHotEncoder类,handle_unknown='ignore'表示忽略验证集中出现的未知分类变量,默认为'error'表示报错。sparse=False表示返回一个numpy数组,而不是稀疏矩阵。

from sklearn.preprocessing import OneHotEncoder

# 将one-hot编码应用到分类变量的每一列
OH_encoder = OneHotEncoder(handle_unknown='ignore', sparse=False)
OH_cols_train = pd.DataFrame(OH_encoder.fit_transform(X_train[object_cols]))
OH_cols_valid = pd.DataFrame(OH_encoder.transform(X_valid[object_cols]))

# one-hot编码会删除索引,需要重新设置
OH_cols_train.index = X_train.index
OH_cols_valid.index = X_valid.index

# 删除分类变量列(会被替换为one-hot列)
num_X_train = X_train.drop(object_cols, axis=1)
num_X_valid = X_valid.drop(object_cols, axis=1)

# 将one-hot编码后的列拼接到数值列上
OH_X_train = pd.concat([num_X_train, OH_cols_train], axis=1)
OH_X_valid = pd.concat([num_X_valid, OH_cols_valid], axis=1)

结果分析

使用MAE(mean absolute error,越小越好)评估三种方法的质量:

MAE from Approach 1 (Drop categorical variables):
175703.48185157913

MAE from Approach 2 (Ordinal Encoding):
165936.40548390493

MAE from Approach 3 (One-Hot Encoding):
166089.4893009678

从当前数据的结果看,删除分类变量列效果MAE最高,序号编码和one-hot编码差别不大。

一般来说,独热编码效果最好,删除分类变量列效果最差,但也会因具体情况而异。

posted @ 2022-03-17 11:50  ikventure  阅读(234)  评论(0编辑  收藏  举报