跳转至
Windows 10
Python 3.7.3 @ MSC v.1915 64 bit (AMD64)
Latest build date 2020.05.14
sklearn version:  0.22.1

label编码

LabelBinarizer: 二分类或多分类

以 one-vs-all 的方式对label进行二值化。将二分类的算法推广到多分类任务的一个简单的方法是使用 one-vs-all 方案。

LabelBinarizer(neg_label=0, pos_label=1, sparse_output=False)
from sklearn.preprocessing import LabelBinarizer

lb = LabelBinarizer()
lb.fit([1, 2, 6, 4, 2])

print(lb.classes_)
lb.transform([1, 6])
[1 2 4 6]
array([[1, 0, 0, 0],
       [0, 0, 0, 1]])

上述过程和 OneHotEncoder 很像,但并不一样,OneHotEncoder用于转换特征,并且要求数据是二维的,以及fit的数据和transform的数据具有相同的维度。

将二分类转换为列向量表示:

lb = LabelBinarizer()
lb.fit_transform(['yes', 'no', 'no', 'yes'])
array([[1],
       [0],
       [0],
       [1]])

将多分类转换为二维矩阵表示:

import numpy as np
# fit 只学习了输入数组的形状
lb.fit(np.array([[0, 1, 1], 
                 [1, 0, 0]]))

print(lb.classes_)
lb.transform([0, 1, 2, 1])
[0 1 2]
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1],
       [0, 1, 0]])

MultiLabelBinarizer: 多标签

LabelBinarizer只适合多分类任务,而多标签的情况则需要MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
print(mlb.fit_transform([(1, 2), (3,)]))
mlb.classes_
[[1 1 0]
 [0 0 1]]
array([1, 2, 3])
print(mlb.fit_transform([{'sci-fi', 'thriller'}, 
                         {'comedy'}]))
list(mlb.classes_)
[[0 1 1]
 [1 0 0]]
['comedy', 'sci-fi', 'thriller']

一个常见的错误是给MultiLabelBinarizer传入一维列表:

mlb = MultiLabelBinarizer()
mlb.fit(['sci-fi', 'thriller', 'comedy'])
mlb.classes_

# 要更正此问题,标签列表应按以下方式传递:

mlb = MultiLabelBinarizer()
mlb.fit([['sci-fi', 'thriller', 'comedy']])
mlb.classes_
array(['comedy', 'sci-fi', 'thriller'], dtype=object)

LabelEncoder: label的整数编码

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
le.fit(['beijing', 'shanghai', 'guangzhou', 'hangzhou', 'nanjing', 'wuhan'])
print(le.classes_)
le.transform(['hangzhou', 'guangzhou', 'beijing', 
              'hangzhou', 'nanjing', 'guangzhou'])
['beijing' 'guangzhou' 'hangzhou' 'nanjing' 'shanghai' 'wuhan']
array([2, 1, 0, 2, 3, 1], dtype=int64)