在机器学习中,特征经常不是数值型的而是枚举型的.举个例子,一个人可能有 ["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-K
或one-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]:
In [3]:
le = preprocessing.LabelEncoder()
le.fit([1, 2, 2, 6])
le.classes_
Out[3]:
In [5]:
le.transform([1, 1, 2, 6])# 编码
Out[5]:
In [6]:
le.inverse_transform([0, 0, 1, 2]) # 解码
Out[6]:
In [8]:
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
list(le.classes_)
Out[8]:
In [9]:
le.transform(["tokyo", "tokyo", "paris"])
Out[9]:
In [10]:
list(le.inverse_transform([2, 2, 1]))
Out[10]:
In [11]:
lb = preprocessing.LabelBinarizer()
lb.fit([1, 2, 6, 4, 2])
lb.classes_
Out[11]:
In [12]:
lb.transform([1, 6])
Out[12]:
In [13]:
lb = preprocessing.MultiLabelBinarizer()
lb.fit_transform([(1, 2), (3,)])
lb.classes_
Out[13]: