编码分类特征

在机器学习中,特征经常不是数值型的而是枚举型的.举个例子,一个人可能有 ["male", "female"],["from Europe", "from US", "from Asia"],["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]等枚举类型的特征.这些特征能够被有效地编码成整数,比如["male", "from US", "uses Internet Explorer"]可以被表示为[0, 1, 3],["female", "from Asia", "uses Chrome"]表示为[1, 2, 1].

这个的整数特征表示并不能在scikit-learn的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的.

一种将分类特征转换为能够被scikit-learn中模型使用的编码是one-of-Kone-hot编码,在OneHotEncoder中实现.这个类使用m个可能值转换为m值化特征,将分类特征的每个元素转化为一个值.

sklearn中相关的接口有:

接口 说明
preprocessing.OneHotEncoder([n_values, …]) 独热编码,要求训练和转换的参数为int型,输出的为
preprocessing.LabelBinarizer([neg_label, …]) 将枚举型特征转换为二值化特征矩阵,输入为int型或者字符串型
preprocessing.MultiLabelBinarizer([classes, …]) 将复数枚举型特征转换为二值化特征矩阵,输入为int型或者字符串型组成的set
preprocessing.LabelEncoder 将枚举型特征编码,输入为int型或者字符串型

独热编码


In [1]:
from sklearn import preprocessing

In [7]:
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
enc.transform([[0, 1, 3]]).toarray()


Out[7]:
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])

枚举型特征编码

针对int类型


In [3]:
le = preprocessing.LabelEncoder()
le.fit([1, 2, 2, 6])
le.classes_


Out[3]:
array([1, 2, 6])

In [5]:
le.transform([1, 1, 2, 6])# 编码


Out[5]:
array([0, 0, 1, 2], dtype=int64)

In [6]:
le.inverse_transform([0, 0, 1, 2]) # 解码


Out[6]:
array([1, 1, 2, 6])

针对str类型


In [8]:
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
list(le.classes_)


Out[8]:
['amsterdam', 'paris', 'tokyo']

In [9]:
le.transform(["tokyo", "tokyo", "paris"])


Out[9]:
array([2, 2, 1], dtype=int64)

In [10]:
list(le.inverse_transform([2, 2, 1]))


Out[10]:
['tokyo', 'tokyo', 'paris']

二值化特征

针对单一枚举类型


In [11]:
lb = preprocessing.LabelBinarizer()
lb.fit([1, 2, 6, 4, 2])
lb.classes_


Out[11]:
array([1, 2, 4, 6])

In [12]:
lb.transform([1, 6])


Out[12]:
array([[1, 0, 0, 0],
       [0, 0, 0, 1]])

针对多枚举类型


In [13]:
lb = preprocessing.MultiLabelBinarizer()
lb.fit_transform([(1, 2), (3,)])
lb.classes_


Out[13]:
array([1, 2, 3])