具有独立分类结果的Scikit SGD分类器?

时间:2019-04-10 10:52:20

标签: python scikit-learn

我已经使用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个样本。

使用MultiOutputClassifier

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

1 个答案:

答案 0 :(得分:2)

如果您想解决多标签问题,请使用multiOutput包装器,而不要使用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的概率。