【问题标题】:Scikit SGD classifier with independent class results?具有独立类结果的 Scikit SGD 分类器?
【发布时间】:2019-08-31 19:21:39
【问题描述】:

我已经用 scikit 做了多类分类。 但我希望独立预测每个类的结果,而不是把它们加起来为 1。

我知道,它类似于多标签。但必须为预测输出中的每个类生成独立的 0-1 值。

clf = OneVsRestClassifier(SGDClassifier(alpha=0.001, loss="log", random_state=42,
                                            max_iter=100, shuffle=True, verbose=1))


Output:
[0.04188954 0.01330129 0.01330501 0.02050405 0.03726504 0.01412006
 0.01753864 0.01250115 0.02342872 0.0124999  0.05234852 0.0161394
 0.01250032 0.01330749 0.01403075 0.0149792  0.0125048  0.01250406
 0.01412335 0.01413113 0.01412246 0.06543099 0.01249486 0.01250054
 0.01308784 0.01330463 0.01250242 0.02252353 0.02037271 0.0133038
 0.01250215 0.0125009  0.01537566 0.02023355 0.01600915 0.01762224
 0.01496796 0.01496522 0.01412407 0.01250198 0.01239722 0.01249967
 0.01763284 0.01573462 0.01250276 0.01451515 0.01330437 0.01329294
 0.01249999 0.01485671 0.01249419 0.01858113 0.01250192 0.01585085
 0.01330439 0.01250573 0.01250585 0.01715666 0.01249392]

总结一下,我得到了 1。但我希望他们每个人都独立地与 0-1 进行比较。怎么可能?

根据 scikit 的注释,“在单标签多类情况下,返回矩阵的行总和为 1。”

参考:https://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html

如何覆盖这个?

创建二维矩阵:

The shape of matrix is (342, 2)

[[  4   0]
 [  4   0]
 [  4   0]
 [ 21   0]
 [ 21   0]]

得到错误:

ValueError:标签二值化不支持多输出目标数据

使用标签二值化器我得到 (349,59) 有 59 个标签和 349 个样本。

使用多输出分类器

clf = SGDClassifier(loss="log", random_state=42, verbose=0)
clf = MultiOutputClassifier(clf)

结果:

clf.predict_proba(x_test)

[array([[0.99310559, 0.00689441]]), array([[0.9942846, 0.0057154]]), array([[0.0051056, 0.9948944]])]

根据评论,https://scikit-learn.org/stable/modules/generated/sklearn.multioutput.MultiOutputClassifier.html#sklearn.multioutput.MultiOutputClassifier.predict_proba

结果有 3 个类。

如何将其解释为单个值? 例如:array([[0.99310559, 0.00689441]]) => 0.5 或 o.6

【问题讨论】:

  • 您是在拟合标签向量还是矩阵? : 该策略也可用于多标签学习,其中分类器用于预测多个标签,例如,如果样本 i 具有标签 j,则通过拟合其中单元格 [i, j] 为 1 的二维矩阵否则为 0 .
  • @BornTbeWasted 我使用了 LabelBinarizer 并转换了标签。 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 如何将其转换为 [i, j] ?
  • 创建一个二维矩阵:对于每个样本,给它们转换标签的总和:例如 [0 0 ... 1 ... 1 ...0],然后添加行到您将提供给分类器的“标签”
  • @BornTbeWasted 我已经更新了这个问题。创建二维数组。但无法训练它。
  • 那么为每个样本创建一个大小为 59 的向量,代表他拥有的标签。

标签: python scikit-learn


【解决方案1】:

如果您想将问题解决为多标签问题,请使用multiOutput wrapper 而不是OneVsRestClassifier()

这是一个例子:

from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import SGDClassifier
from sklearn.datasets import load_iris
from sklearn import preprocessing

X,y = load_iris(return_X_y=True)

clf = MultiOutputClassifier(SGDClassifier(loss='log',max_iter =10))
lb = preprocessing.LabelBinarizer()
y_onehot = lb.fit_transform(y)
clf.fit(X, y_onehot)

clf.predict_proba([X[0]]) 

输出:

[array([[0., 1.]]),
 array([[1.00000000e+00, 5.63826474e-52]]),
 array([[1., 0.]])]

第二个元素是给定记录属于该类的概率。现在,您可以看到所有类的概率总和不等于 1。

【讨论】:

  • 我正在应用更改..!
  • 我已经更新了这个问题。检查。结果很奇怪。我有3节课。 @ai_learning
  • 为什么奇怪?该模型表示x_test 更有可能是第三类。
  • 看这里 [scikit-learn.org/stable/modules/generated/… 了解概率数组。这是概率。 3个二元分类模型的输出
  • 即使所有类都可以有正值,因为它是一个独立的模型。
猜你喜欢
  • 2014-12-02
  • 2014-09-02
  • 2016-09-01
  • 2016-05-25
  • 2016-01-02
  • 2019-08-17
  • 2016-09-04
  • 2019-07-09
  • 2017-01-11
相关资源
最近更新 更多