多标签分类格式
对于多标签分类问题而言,一个样本可能同时属于多个类别。如一个新闻属于多个话题。这种情况下,因变量yy需要使用一个矩阵表达出来。
而多类别分类指的是y的可能取值大于2,但是y所属类别是唯一的。它与多标签分类问题是有严格区别的。所有的scikit-learn分类器都是默认支持多类别分类的。但是,当你需要自己修改算法的时候,也是可以使用scikit-learn
实现多类别分类的前期数据准备的。
多类别或多标签分类问题,有两种构建分类器的策略:One-vs-All及One-vs-One。下面,通过一些例子进行演示如何实现这两类策略。
#
from sklearn.preprocessing import MultiLabelBinarizer
y = [[2,3,4],[2],[0,1,3],[0,1,2,3,4],[0,1,2]]
MultiLabelBinarizer().fit_transform(y) #这里没指名classes 则classes从训练数据获取这里为
#[0,1,2,3,4]
array([[0, 0, 1, 1, 1],
[0, 0, 1, 0, 0],
[1, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0]])
其实classes是设置label位置,为了好理解我举个例子吧
若 classes= [2,3,4,5,6,1] ,则2值的索引为0,3值的索引为1,依次类推
所以当y=[(1, 2), (3,4),(5,)] , 1值在classes中的索引为5,所以经fit_transform后变成[0,0,0,0,1],对应索引为5的位置为1
2值在classes中的索引为0,所以经fit_transform后变成[1,0,0,0,0],对应索引为0的位置为1
看下面的结果:我猜你应该明白了~
In [3]: from sklearn.preprocessing import MultiLabelBinarizer
...: mlb = MultiLabelBinarizer(classes = [2,3,4,5,6,1])
...: mlb.fit_transform([(1, 2), (3,4),(5,)])
...:
Out[3]:
array([[1, 0, 0, 0, 0, 1],
[0, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0]])
In [4]: mlb.classes_
Out[4]: array([2, 3, 4, 5, 6, 1])