[Python]-sklearn模块-机器学习Python入门《Python机器学习手册》-05-处理分类数据

发布时间 2023-05-04 23:19:20作者: CAMILIA

《Python机器学习手册——从数据预处理到深度学习》

这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习中python常用的这些库有更深入的理解,在应用中也能更为熟练。

以下是根据书上的代码进行实操,注释基本写明了每句代码的作用(写在本句代码之前)和print的输出结果(写在print之后)。不一定严格按照书上内容进行,根据代码运行时具体情况稍作顺序调整,也加入了一些自己的理解。

如果复制到自己的环境下跑一遍输出,相信理解会更深刻更清楚。

博客中每个代码块代表一次完整的运行结果,可以直接以此为单位复制并运行。


05-处理分类数据

包括:

  1. 对nominal型分类特征编码
  2. 对ordinal型分类特征编码
  3. 对特征字典编码
  4. 填充缺失的分类值
  5. 处理不均衡分类

主要是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编码之后的特征矩阵是一个置换矩阵)

05-2 对ordinal型分类特征编码

05-3 对特征字典编码

05-4 填充缺失的分类值

05-5 处理不均衡分类