Python中可以使用sklearn库中的OneHotEncoder来对离散变量进行one-hot编码,下面是具体操作步骤:
1. 引入模块
首先我们需要引入相关的模块:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
2. 准备数据
接下来我们需要准备需要进行one-hot编码的数据。例如,我们有一个样本矩阵如下:
X = np.array([[0, 0, 3],
[1, 1, 0],
[0, 2, 1]])
其中,第一列有两个不同的值,第二列有三个不同的值,第三列有四个不同的值。
3. 进行编码
我们使用OneHotEncoder对第一列和第二列进行编码:
enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(X[:, 0:2])
result = enc.transform(X[:, 0:2]).toarray()
其中,handle_unknown='ignore'表示如果出现了未知类型的类别,直接忽略;fit用于拟合编码器的类别列表,transform用于将原始数据按照拟合的类别列表进行编码,toarray用于将稀疏矩阵转换成稠密矩阵。
此时,我们可以得到one-hot编码后的结果:
array([[1., 0., 1., 0., 0., 1.],
[0., 1., 0., 1., 1., 0.],
[1., 0., 0., 0., 1., 0.]])
最后一列是第二列中新出现的一种类别(2),其他列分别对应原始数据中出现过的不同类别(0、1)。
示例说明
现在,我们假设有一个电商网站,用户可以选择一个或多个喜欢的品牌,我们需要对这些品牌进行one-hot编码。
brands = ['Apple', 'Samsung', 'Huawei', 'Xiaomi', 'Oppo']
users = [['Apple', 'Samsung'], ['Huawei'], ['Xiaomi', 'Oppo'], ['Apple', 'Samsung', 'Huawei', 'Xiaomi', 'Oppo']]
# 构造样本矩阵
X = np.zeros((len(users), len(brands)), dtype=np.int)
for i, user in enumerate(users):
for brand in user:
X[i, brands.index(brand)] = 1
# 进行one-hot编码
enc = OneHotEncoder()
enc.fit(X)
result = enc.transform(X).toarray()
其中,我们首先定义了需要编码的品牌列表brands和各用户喜欢的品牌列表users,并通过构造样本矩阵X方便地将其转换成了one-hot编码需要的输入格式。最终,我们可以得到one-hot编码后的结果:
array([[1., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 1.],
[1., 1., 1., 1., 1.]])
从结果中可以看出,第一列和第二列都为1,则表示第一个用户同时喜欢Apple和Samsung品牌。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python对离散变量的one-hot编码方法 - Python技术站