详解 Scikit-learn 的 preprocessing.OneHotEncoder函数:独热编码

  • Post category:Python

sklearn.preprocessing.OneHotEncoder 是 Scikit-learn 中预处理模块中的一个函数,用于将分类数据编码为独热编码。独热编码是一种对离散值进行编码的方法,可以将非数值型特征转换为可用于机器学习算法的数值型特征。

使用方法:

  1. 导入包和加载数据:
import numpy as np
import pandas as pd
from sklearn.preprocessing import OneHotEncoder

data = pd.read_csv('data.csv')
  1. 定义需要进行独热编码处理的列:
cat_cols = ['color', 'size']
  1. 初始化 OneHotEncoder 对象:
onehot_encoder = OneHotEncoder()
  1. 对需要进行独热编码处理的数据进行拟合和变换:
onehot_encoder.fit(data[cat_cols])
onehot_encoded = onehot_encoder.transform(data[cat_cols])

其中,拟合方法和变换方法可以通过 fit_transform() 方法来实现:

onehot_encoder.fit_transform(data[cat_cols])
  1. 将变换后的独热编码结果存储到 DataFrame 中:
onehot_encoded_df = pd.DataFrame(onehot_encoded.toarray(), columns = onehot_encoder.get_feature_names(cat_cols))

这样,我们就得到了一个 DataFrame,其中包含了使用独热编码处理后的结果。

实例1:

假设我们要对一批产品数据进行独热编码处理,其中颜色和尺寸是分类数据:

data = pd.DataFrame({'product': ['A', 'B', 'C', 'D'], 'color': ['red', 'blue', 'green', 'red'], 'size': ['M', 'L', 'S', 'M']})

产品 颜色 尺码

A 红 M
B 蓝 L
C 绿 S
D 红 M

我们需要将颜色和尺寸这两列分类数据进行独热编码处理:

cat_cols = ['color', 'size']
onehot_encoder = OneHotEncoder()

onehot_encoder.fit(data[cat_cols])
onehot_encoded = onehot_encoder.transform(data[cat_cols])
onehot_encoded_df = pd.DataFrame(onehot_encoded.toarray(), columns = onehot_encoder.get_feature_names(cat_cols))

将变换后的数据存储到 DataFrame 中:

result = pd.concat([data, onehot_encoded_df], axis=1).drop(cat_cols, axis=1)

print(result)

输出结果:

  product  color_blue  color_green  color_red  size_L  size_M  size_S
0       A         0.0          0.0        1.0     0.0     1.0     0.0
1       B         1.0          0.0        0.0     1.0     0.0     0.0
2       C         0.0          1.0        0.0     0.0     0.0     1.0
3       D         0.0          0.0        1.0     0.0     1.0     0.0

实例2:

对于多类别分类问题,这一函数也是很有用的。下面我们使用一个鸢尾花数据集,该数据集有三个类别,就是鸢尾花的三个品种:山鸢尾(Iris Setosa)、变色鸢尾(Iris Versicolour)和维吉尼亚鸢尾(Iris Virginica),然后我们对这三个品种进行编码。

from sklearn.datasets import load_iris

dataset = load_iris()
data = pd.DataFrame(dataset.data, columns=dataset.feature_names)
target = pd.DataFrame(dataset.target, columns=["target"])

数据集长这样:

数据集长这样:

     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                  5.1               3.5                1.4               0.2
1                  4.9               3.0                1.4               0.2
2                  4.7               3.2                1.3               0.2
3                  4.6               3.1                1.5               0.2
4                  5.0               3.6                1.4               0.2
..                 ...               ...                ...               ...
145                6.7               3.0                5.2               2.3
146                6.3               2.5                5.0               1.9
147                6.5               3.0                5.2               2.0
148                6.2               3.4                5.4               2.3
149                5.9               3.0                5.1               1.8

[150 rows x 4 columns]

然后我们对target列进行编码:

onehot_encoder = OneHotEncoder()
target_ohc = onehot_encoder.fit_transform(target)
print(pd.DataFrame(target_ohc.toarray()).head())

输出结果:

     0    1    2
0  1.0  0.0  0.0
1  1.0  0.0  0.0
2  1.0  0.0  0.0
3  1.0  0.0  0.0
4  1.0  0.0  0.0