【发布时间】: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]])]
结果有 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