我有10个类,我的y_test有一个(1000, 10)形状,如下所示:
array([[0, 0, 1, ..., 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]], dtype=int64)如果我使用以下方法,其中i是类号
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_pred[:, i])y_pred是否应该
y_pred = model.predict(x_test)
OR
y_pred = np.argmax(model.predict(x_test), axis=1)
lb = LabelBinarizer()
lb.fit(y_test)
y_pred = lb.transform(y_pred)第一种选择给了我这样的选择:
[[6.87280996e-11 6.28617670e-07 9.96915460e-01 ... 3.08361766e-03
3.47333212e-14 2.83545876e-09]
[7.04240659e-30 1.51786850e-07 8.49807921e-28 ... 6.62584656e-33
6.97696034e-19 1.01019222e-20]
[2.97537670e-14 2.67199534e-24 2.85646610e-19 ... 2.19898160e-15
7.03626012e-22 7.56072279e-18]
...
[1.63774752e-15 1.32784101e-06 1.23182635e-05 ... 3.60217566e-14
6.01247484e-05 2.61179358e-01]
[2.09420733e-35 6.94865276e-10 1.14242395e-22 ... 5.08080394e-22
1.20934697e-19 1.77760468e-17]
[1.68334747e-13 8.53335252e-04 4.40571597e-07 ... 1.70050384e-06
1.48684137e-06 2.93400045e-03]]形状为(1000,10)。
后一种选择所提供的
[[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]]带形状(1000,10)
哪种方法是正确的?换句话说,当传递给y_pred时,这个sklearn.metrics.roc_curve()会是什么。
忘记提到,使用第一个选项可以为所有类提供非常高(几乎1)的AUC值,而第二个选项似乎会生成合理的AUC值。
使用这两个选项的ROC曲线如下,哪一个看起来更正确?


发布于 2022-02-24 11:59:17
第一个选项没有什么问题,这正是文档所要求的:
y_scorendarray of shape (n_samples,) 目标分数,既可以是正类的概率估计、置信度值,也可以是决策的非阈值测度(由“decision_function”对某些分类器返回)。
另外,第一张图看起来像一条ROC曲线,而第二张是奇怪的。
最后,ROC曲线打算研究“不同的分类阈值”。这意味着你需要预测“作为概率”(信心),而不是0和1。
当你选择一个argmax时,你会抛弃那些可能性/自信,这使得你不可能去研究阈值。
https://stackoverflow.com/questions/71250317
复制相似问题