假设我从训练集中选择了一个训练文档,并将其转换为我所选择的特征的特征向量X。
我尝试做的是:
self.clf = LogisticRegression()self.clf.fit(X, Y)
我的Y看起来像这样:[0 0 0 1 1 0 1 0 0 1 0]
我想训练一个单一模型,使其同时最佳拟合这11个输出值。然而,这似乎对fit
方法不起作用,因为我得到了一个unhashable type 'list'
错误,因为它期望的是一个单一值,可以是二元或多类,但不允许超过一个值。
有没有办法用sci-kit learn来实现这个目标?
回答:
多标签分类与普通分类有一点不同的API。你的Y
应该是一个序列的序列,例如一个列表的列表,像这样
Y = [["foo", "bar"], # 第一个样本是foo和bar ["foo"], # 第二个样本只有foo ["bar", "baz"]] # 第三个样本是bar和baz
这样的Y
可以被输入到一个能够处理多重分类的估计器中。你可以使用OneVsRestClassifier
包装器来构建这样的估计器:
from sklearn.multiclass import OneVsRestClassifierclf = OneVsRestClassifier(LogisticRegression())
然后用clf.fit(X, Y)
进行训练。clf.predict
现在也会产生序列的序列。
更新 自scikit-learn 0.15起,由于其输入模糊不清,该API已被废弃。你应该将我上面给出的Y
转换为使用MultiLabelBinarizer
的矩阵:
>>> from sklearn.preprocessing import MultiLabelBinarizer>>> mlb = MultiLabelBinarizer()>>> mlb.fit_transform(Y)array([[1, 0, 1], [0, 0, 1], [1, 1, 0]])
然后将这个输入到估计器的fit
方法中。转换回来可以通过在相同的二值化器上使用inverse_transform
来完成:
>>> mlb.inverse_transform(mlb.transform(Y))[('bar', 'foo'), ('foo',), ('bar', 'baz')]