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)