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

我用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 个班级。


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


GCT1015
浏览 121回答 1
1回答

饮歌长啸

如果您想将问题作为多标签问题来解决,则使用multiOutput包装器而不是OneVsRestClassifier().下面是一个例子:from sklearn.multioutput import MultiOutputClassifierfrom sklearn.linear_model import SGDClassifierfrom sklearn.datasets import load_irisfrom sklearn import preprocessingX,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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python