关于one-hot encoding的基本介绍因为网上有很多在此不再赘述。下面仅针对初学者首次使用时可能会遇到的问题进行解释说明。
Examples
(sklearn自带的实例sklearn.preprocessing.OneHotEncoder
)
给定具有三个特征和四个样本的数据集,让编码器找到每个特征的最大值并将数据转换为二进制one-hot encoding。
"""
Given a dataset with three features and four samples, we let the encoder find the maximum value per feature and transform the data to a binary one-hot encoding
from sklearn.preprocessing import OneHotEncoder
"""
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
print ("enc.n_values_ is:",enc.n_values_)
print ("enc.feature_indices_ is:",enc.feature_indices_)
print (enc.transform([[0, 1, 1]]).toarray())
运行结果如下图所示。
OneHotEncoder in
下面就来简单解释一下上面的代码,实际上主要是对enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
进行说明。
首先看看一下源文件对于fit的说明:
def fit(self, X, y=None):
"""Fit OneHotEncoder to X.
Parameters
----------
X : array-like, shape [n_samples, n_feature]
Input array of type int.
Returns
-------
self
"""
其中输入参数X是一个数组,行数等于样本的个数,列数等于特征种类数,样本个数的取值应等于取值最多的特征类的特征个数。对于上面的代码,共四个样本,三种特征。第一类特征取值为0,1;第二类特征取值为0,1,2;第三类特征取值为0,1,2,3。可以发现第三类特征取值最多为4个所以样本个数也取值为4,也就是说所有的样本加起来必须保证取值最多的特征类的每个特征值都被取到。
尝试对上面的example中的样本修改为:enc.fit([[0, 0, 0], [1, 1, 1], [0, 2, 2],[0, 0, 3]])
,保证每个特征类中的特征值个数不变,则结果不会改变。若将数组的第三类特征的取值2删除或取为0,1,3中的一个数后结果输出会减少一个维度。
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1]]) #删除取值2
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[0, 0, 3]]) #将2改为3
最后enc.transform([[0, 1, 1]]).toarray()
就是将样本进行one-hot encoding。