数据预处理 | 处理类别变量(categorical variable)python-sklearn实现 | 三种常用方法| Kaggle 学习笔记(四)

方法一:移除法(Drop)
将含有类别变量的列移除。

import pandas as pd

# 读取数据
data = pd.read_csv("filename.csv")

# 获取数据集中的含有类别变量的列的列名,并用列表表示
s = (data.dtypes == 'object')
object_cols = list(s[s].index)

# 移除含有类别变量的列
drop_data = data.select_dtypes(exclude=['object'])

方法二: 标签编码(Label Encoding)
标签编码为每一个不同的类别值赋上不同的整数值。而且这个方法为这些类别假定一个顺序,若下列例子所示:“Never”(0)<“Rarely”(1)<“Most days(2)”<“Every day”(3)。
当然,并不是所有的类别变量都有一个明确的顺序。如果有的话,我们则称那些正数为序级变量(ordinal variables)。在那些基于树形结构的模型(如决策树和随机森林),标签编码得到的序级变量工作很好。

数据预处理 | 处理类别变量(categorical variable)python-sklearn实现 | 三种常用方法| Kaggle 学习笔记(四)_第1张图片

from sklearn.preprocessing import LabelEncoder

# 复制数据集,以免之后的操作修改原数据集里的值
label_data = data.copy()

# 将每一个含有类别变量的列都转化为含有整数值的列
label_encoder = LabelEncoder()
for col in object_cols:
	label_data[col] = label_encoder.fit_transform(data[col])

上面的方法,我们为每一个含有类别变量的列里的不同的类别值,都随机地赋上不同的整数值,这个方法比自定义标签(custom label)好的多。当然,如果这些整数值是序列变量,则能够优化最终结果。
但是这种做法会让机器学习的算法认为两个临近的值比两个疏远的值要更相似。显然这样是不对的。因为不是所有的类别变量之间都有一个明确的顺序。

方法三: 独热编码(One-Hot Encoding)
独热编码创建新的列来表示原数据集中类别变量存在或不存在的状态。给每一个分类建立一个二元属性。
数据预处理 | 处理类别变量(categorical variable)python-sklearn实现 | 三种常用方法| Kaggle 学习笔记(四)_第2张图片
在独热编码里,没有假定序列变量的存在。因此,这个方法对没有明显排列顺序的类别变量很好用。通常我们称没有本质上排名的变量为名义变量(nominal variables)。
当然,如果类别变量的数量太多,独热编码的方法就不太好用(通常,我们使用该方法时,类别变量的数量不超过15个)

from sklearn.preprocessing import OneHotEncoder

# 对每一个含有类别变量的列都使用独热编码
# handle_unknown='ignore' 是为了避免验证集中出现了训练集中没有的新类别向量,sparse=False 是为了确保返回的经编码过的列,是以numpy的数组形式出现,而不是以稀疏矩阵的形式返回
OH_encoder = OneHotEncoder(handle_unknown='ignore', sparse=False)
OH_cols_data = pd.DataFrame(OH_encoder.fit_transform(data[object_cols]))

# 独热编码会移除索引,因此要将它们取回
OH_cols_data.index = data.index

# 移除数据集含有类别变量的列(因为我们已经获得了含有独热编码的列)
num_data = data.drop(object_cols, axis=1)

# 将含有独热编码的列与经过处理的数据集(不包含类别变量)连接
OH_data = pd.concat([num_data, OH_cols_data], axis=1)

你可能感兴趣的:(数据挖掘)