2

假设我从训练集中选择了一个训练文档。我已将它放入我选择的特征的特征向量 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 做到这一点?

4

2 回答 2

7

多标签分类与普通分类有一些不同的 API。你Y应该是一个序列序列,例如一个列表列表,比如

Y = [["foo", "bar"],          # the first sample is a foo and a bar
     ["foo"],                 # the second is only a foo
     ["bar", "baz"]]          # the third is a bar and a baz

Y然后可以将这样的 a馈送到处理多个分类的估计器。OneVsRestClassifier您可以使用包装器构造这样的估计器:

from sklearn.multiclass import OneVsRestClassifier
clf = OneVsRestClassifier(LogisticRegression())

然后用 训练clf.fit(X, Y)clf.predict现在也将产生序列序列。

从 scikit-learn 0.15 开始更新,此 API 已被弃用,因为它的输入不明确。您应该将Y我上面给出的转换为带有 a 的矩阵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')]
于 2013-01-03T10:27:42.380 回答
0

您能否更具体地说明您的任务是什么?标签是二进制变量的固定长度向量吗?那么这将被称为多标签分类(即多个标签是打开或关闭)。如果每个标签可以有两个以上的值,则在 scikit-learn 中称为“多输出”,并且只能由树和集成来完成。

PS:如果您使用线性分类器,例如逻辑回归,则输出变量将以任何方式独立处理。

于 2013-01-03T09:20:52.763 回答