《Python机器学习手册——从数据预处理到深度学习》
这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习中python常用的这些库有更深入的理解,在应用中也能更为熟练。
以下是根据书上的代码进行实操,注释基本写明了每句代码的作用(写在本句代码之前)和print的输出结果(写在print之后)。不一定严格按照书上内容进行,根据代码运行时具体情况稍作顺序调整,也加入了一些自己的理解。
如果复制到自己的环境下跑一遍输出,相信理解会更深刻更清楚。
博客中每个代码块代表一次完整的运行结果,可以直接以此为单位复制并运行。
05-处理分类数据
包括:
- 对nominal型分类特征编码
- 对ordinal型分类特征编码
- 对特征字典编码
- 填充缺失的分类值
- 处理不均衡分类
主要是sklearn
模块,对分类特征处理的一些应用。
- nominal型分类特征:无内部顺序,例如水果、颜色、性别等
- ordinal型分类特征:有内部顺序,例如(高、中、低)、(同意、中立、反对)等
05-1 对nominal型分类特征编码
首先,sklearn.preprocessing中有LabelBinarizer()编码器支持one-hot编码:
import numpy as np
from sklearn.preprocessing import LabelBinarizer
# 创建特征
feature = np.array([["Texas"], ["California"], ["Texas"], ["Delaware"], ["Texas"]])
print(feature)
# 创建one-hot编码器
one_hot = LabelBinarizer()
# 对特征进行one-hot编码
print(one_hot.fit_transform(feature))
# [[0 0 1]
# [1 0 0]
# [0 0 1]
# [0 1 0]
# [0 0 1]]
# 查看特征的分类,类似去重
print(one_hot.classes_)
# ['California' 'Delaware' 'Texas']
# 对one-hot特征进行逆转换
print(one_hot.inverse_transform(one_hot.transform(feature)))
# ['Texas' 'California' 'Texas' 'Delaware' 'Texas']
另一个方法是采用pandas库来进行one-hot编码:
import pandas as pd
print(pd.get_dummies(feature[:,0]))
# California Delaware Texas
# 0 0 0 1
# 1 1 0 0
# 2 0 0 1
# 3 0 1 0
# 4 0 0 1
每个观察值有多个分类的情况,采用sklearn.preprocessing中MultiLabelBinarizer()编码器,支持多分类的one-hot编码:
import numpy as np
from sklearn.preprocessing import MultiLabelBinarizer
# 创建多分类特征
multi_feature = [["Texas", "Florida"], ["California", "Alabama"], ["Texas", "Florida"], ["Delaware", "Florida"], ["Texas", "Alabama"]]
# 创建处理多分类的one-hot编码器
one_hot_multi = MultiLabelBinarizer()
# 对特征进行one-hot编码
print(one_hot_multi.fit_transform(multi_feature))
# [[0 0 0 1 1]
# [1 1 0 0 0]
# [0 0 0 1 1]
# [0 0 1 1 0]
# [1 0 0 0 1]]
# 查看特征的分类,类似去重
print(one_hot_multi.classes_)
# ['Alabama' 'California' 'Delaware' 'Florida' 'Texas']
注意观察,实际上对每个分类生成了一次二元分类的特征,避免了对多个分类赋值时可能会出现顺序的干扰(0,1,2,3)
特别地:为避免线性依赖,进行one-hot编码之后最好将生成的特征矩阵删除一列。(one-hot编码之后的特征矩阵是一个置换矩阵)