我用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
1 回答
饮歌长啸
TA贡献1951条经验 获得超3个赞
如果您想将问题作为多标签问题来解决,则使用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。
添加回答
举报
0/150
提交
取消