使用sci-kit learn进行多值输出分类

假设我从训练集中选择了一个训练文档,并将其转换为我所选择的特征的特征向量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')]

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注