在Python中绘制RidgeClassifier的ROC曲线

4

我想画出 RidgeClassifier 的 ROC 曲线,但是代码出现了错误:我在谷歌上搜索解决方案时发现要将 predict_proba 更改为 predict,但是这种更改并没有起作用!

predY = classifier.predict_proba(X_test)

错误:
AttributeError: 'RidgeClassifier' object has no attribute 'predict_proba'

这是我使用 predict 时得到的结果:
IndexError: too many indices for array

这个回答解决了你的问题吗?Scikit-learn Ridge分类器:提取类别概率 - Maura Pintor
@MauraPintor 你的意思是:d = classifier.decision_function(X)[0] predY = np.exp(d) / np.sum(np.exp(d)) 吗? - Flodude
2个回答

3

这里的问题是,并非所有的scikit-learn分类器都有一个predict_proba方法,因为这些模型并不总是有合理的概率计算定义。在这种情况下,可以尝试使用decision_function方法:

confidence = classifier.decision_function(X_test)

你的意思是:predY = 置信度? - Flodude
是的,那应该可以解决问题。有关如何计算的更多信息,请参见此处 - dstilesr
嗯. . . predY是什么形状呢?也许可以尝试 predY = predY.flatten()predY = predY[:, 1],具体取决于列数是1还是2。 - dstilesr
仍然是同样的错误。与其他分类器的predY不同,这种情况下的predY包含负值。 - Flodude

2
根据文档Ridge.Classifier没有predict_proba属性。这可能是因为对象在拟合过程中自动选择阈值。
根据文档,我认为无法为此模型绘制ROC曲线。幸运的是,您可以使用sklearn.linear_model.LogisticRegression并设置penalty='l2'。通过这样做,您正在设置RidgeClassifier考虑的相同优化问题。
from sklearn.linear_model import LogisticRegression

classifier = LogisticRegression(penalty='l2')
classifier.fit(X, y)
predY = classifier.predict_proba(X_test)

现在,您可以将 predY 传递给 sklearn.metrics.roc_curve

我使用了你的代码,但是它出现了一个错误: IndexError: 数组索引过多 - Flodude
对不起!我相信我有一个未匹配的)。现在可以工作了吗? - Arturo Sbr
我建议使用适合我的版本。因此,使用 LogisticRegression(penalty='l2') 将会得到与 RidgeClassifier 相同的结果吗? - Flodude
是的,它应该给你相同的结果。只需注意 L2 回归返回概率,因此您选择的每个阈值都会产生一个新的预测类数组。例如,假设您有 predY = [0.1, 0.2, 0.3, 0.4]。如果您设置阈值为 0.2,则预测的类将是 [0, 1, 1, 1]。如果您设置阈值为 0.3,则预测的类将是 [0, 0, 1, 1] - Arturo Sbr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接