在scikit中绘制ROC曲线只有3个点

32

TLDR:scikit的roc_curve函数对于某些数据集仅返回3个点。可能原因是什么,我们如何控制返回的点数?

我试图绘制ROC曲线,但始终得到“ROC三角形”。

lr = LogisticRegression(multi_class = 'multinomial', solver = 'newton-cg')
y = data['target'].values
X = data[['feature']].values

model = lr.fit(X,y)

# get probabilities for clf
probas_ = model.predict_log_proba(X)

只是为了确保长度没问题:

print len(y)
print len(probas_[:, 1])

两者都返回13759。

然后运行:

false_pos_rate, true_pos_rate, thresholds = roc_curve(y, probas_[:, 1])
print false_pos_rate

返回 [ 0. 0.28240129 1. ]。

如果我调用' threasholds',我会得到数组([ 0.4822225 , -0.5177775 , -0.84595197])(始终只有3个点)。

因此,我的 ROC 曲线看起来像一个三角形并不奇怪。

我不理解的是为什么 scikit 的roc_curve 只返回 3 个点。 非常感谢您的帮助。

enter image description here


你有检查过 probas_[:,1] 中的值吗?尽管它的长度为13759,但它可能只包含3个值... - pyan
谢谢你的帮助,我执行了 [print pd.Series(probas_[:,1]).unique()],确实只返回了两个唯一值 ([-0.84595197, -0.5177775])。 - sapo_cosmico
1
很高兴能够帮到您。如果您喜欢的话,请接受这个答案。 - pyan
4个回答

20

点数取决于输入值的唯一数量。由于输入向量仅有两个唯一值,该函数会给出正确的输出。


15

我在不同的例子中遇到了相同的问题。我的错误是将 给定阈值 的结果输入,而不是在 roc_curve 的参数 y_score 中输入概率。这也会生成一个带有三个点的图形,但这是错误的!


这里是一个如何完成绘制ROC曲线的示例:https://dev59.com/S8Dqa4cB1Zd3GeqPnODA#67754984 - s2t2

5

我遇到了同样的问题,仔细阅读文档后我意识到错误在于:

probas_ = model.predict_log_proba(X)

尽管其他人通过检查唯一性给出了提示,但实际上应该是:

probas_ = model.decisions(X)

文档示例还在拟合模型后使用 Y_score = model.decision(x_test) 并将 Y_score 传递给 roc_curve。 - Neela

0

除了(0,0)和(1,1)之外,不必获得1分。

我正在使用来自kaggle的蘑菇数据集进行二元分类问题。

从roc_curve中获取fpr和tpr,我得到了4个更多的点,尽管它们的值或多或少相同。

fpr = {0, 0, 0.02290076, 0.0267176, 0.832061, 1}

tpr = {0, 0.0315361, 0.985758, 0.996948, 1, 1}

我不确定我们是否可以将其视为1个点,因为使用此绘制曲线看起来像问题中显示的曲线。


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