我们说我从训练集中选择了一份培训文件。我把它放到了我选择的特征的特征向量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'
错误,因为它期望一个值为ether二进制或多类但不允许多个值。
有没有用sci-kit学习呢?
答案 0 :(得分: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
提供给处理多个分类的估计器。您可以使用OneVsRestClassifier
包装器构建这样的估算器:
from sklearn.multiclass import OneVsRestClassifier
clf = OneVsRestClassifier(LogisticRegression())
然后用clf.fit(X, Y)
训练。 clf.predict
现在也会生成序列序列。
UPDATE 自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')]
答案 1 :(得分:0)
请您具体说明您的任务是什么? 标签是二进制变量的固定长度向量吗?然后,这将被称为多标签分类(即,多个标签打开或关闭)。 如果每个标签可以有两个以上的值,则在scikit-learn中称为“多输出”,并且只能通过树和集合来完成。
PS:如果使用线性分类器(如逻辑回归),输出变量将以任何方式独立处理。