OneHotEncoder 可用于将分类特征的每个元素转化为一个可直接计算的数值,也即特征值数字化,常用于特征工程中的数据预处理。
其本质是One-Hot编码在scikit-learn中的实现。
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候只有一位有效。
One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值,然后,每个整数值被表示为二进制向量,将整数索引标记为1,其余都标为0。
直达官网: sklearn.preprocessing.OneHotEncoder
基本参数:
# Encode categorical integer features as a one-hot numeric array.
OneHotEncoder(n_values=None,
categorical_features=None,
categories=None,
drop=None,
sparse=True,
dtype=np.float64,
handle_unknown='error')
示例:
#-*- coding: utf-8 -*-
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3],
[1, 1, 0],
[0, 2, 1],
[1, 0, 2]])
ans = enc.transform([[0, 1, 3]]).toarray()
'''
如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定 sparse = False 来达到同样的效果
'''
print(ans)
#输出 [[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]
解释:
对于输入数组,依旧是把每一行当作一个样本,每一列当作一个特征,
先来看第一个特征,即第一列 [0,1,0,1],也就是说它有两个取值 0 或者 1,那么 one-hot 就会使用两位来表示这个特征,[1,0] 表示 0, [0,1] 表示 1,在上例输出结果中的前两位 [1,0…] 也就是表示该特征为 0;
第二个特征,第二列 [0,1,2,0],它有三种值,那么 one-hot 就会使用三位来表示这个特征,[1,0,0] 表示 0, [0,1,0] 表示 1,[0,0,1] 表示 2,在上例输出结果中的第三位到第六位 […0,1,0,0…] 也就是表示该特征为 1;
第二个特征,第三列 [3,0,1,2],它有四种值,那么 one-hot 就会使用四位来表示这个特征,[1,0,0,0] 表示 0, [0,1,0,0] 表示 1,[0,0,1,0] 表示 2,[0,0,0,1] 表示 3,在上例输出结果中的最后四位 […0,0,0,1] 也就是表示该特征为 3;
注意:
在scikit-learn 0.20版本中有一个比较重要的改动,就是sklearn.preprocessing.OneHotEncoder 除了支持整数外,还支持字符串。
否则如果特征是字符串,就需要先使用 sklearn.preprocessing.LabelEncoder 将离散特征值转换为数字。
表示每个特征使用几维的数值由数据集自动推断,即几种类别就使用几位来表示。当然也可以自己指定,示例:
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(categories= [2, 3, 4])
enc.fit([[0, 0, 3],
[1, 1, 0]])
ans = enc.transform([[0, 2, 3]]).toarray()
print(ans)
#输出 [[ 1. 0. 0. 0. 1. 0. 0. 0. 1.]]
drop=None
-用于从每个特征中舍去特定的分类,默认为None,且不能与categories、n_values同用。
dtype=np.float64
表示编码数值格式,默认是浮点型。
sparse=True
表示编码的格式,默认为 True,即为稀疏的格式,指定 False 则就不用 toarray() 了
handle_unknown=’error’
,其值可以指定为 “error” 或者 “ignore”,即如果碰到未知的类别,是返回一个错误还是忽略它。
categorical_features = 'all’
这个参数指定了对哪些特征进行编码,默认对所有类别都进行编码。也可以自己指定选择哪些特征,通过索引或者 bool 值来指定,看下例:
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(categorical_features = [0,2]) # 等价于 [True, False, True]
enc.fit([[0, 0, 3],
[1, 1, 0],
[0, 2, 1],
[1, 0, 2]])
ans = enc.transform([[0, 2, 3]]).toarray()
print(ans)
#输出 [[ 1. 0. 0. 0. 0. 1. 2.]]
以下为jupyter notebook 输出示例,可以看到运行结果之外,还有一串Warnings
出现 警告的原因 是:
scikit-learn 0.20 中将此参数进行了剥离,后续的OneHotEncoder将不再支持categorical_features 参数,但新增了sklearn.compose.ColumnTransformer 类,
通过这个类我们可以对输入的特征分别做不同的预处理,并且最终的结果还在一个特征空间里面。
ColumnTransformer 的具体使用方法在此不再展开,
下面示例演示 利用OneHotEncoder结合ColumnTransformer ,实现categorical_features 参数 对指定的特征类编码
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
categorical_features = [0,2]
enc = OneHotEncoder(handle_unknown='ignore')
clt = ColumnTransformer([('name',enc,categorical_features)],remainder='passthrough')
clt.fit([[0, 0, 3],
[1, 1, 0],
[0, 2, 1],
[1, 0, 2]])
ans = clt.transform([[0, 2, 3]]) # 此处不能再使用toarray()
print(ans)
#输出 [[1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2]]
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(sparse = False)
ans = enc.fit_transform([[0, 0, 3],
[1, 1, 0],
[0, 2, 1],
[1, 0, 2]])
print(ans)
''' 输出
[[ 1. 0. 1. ..., 0. 0. 1.]
[ 0. 1. 0. ..., 0. 0. 0.]
[ 1. 0. 0. ..., 1. 0. 0.]
[ 0. 1. 1. ..., 0. 1. 0.]]
'''
结束:
以上只是OneHotEncoder的基本用法演示,更多高级的应用,有待进一步研究学习。