在 scikit 中绘制 ROC 曲线仅产生 3 个点

Posted

技术标签:

【中文标题】在 scikit 中绘制 ROC 曲线仅产生 3 个点【英文标题】:Plotting a ROC curve in scikit yields only 3 points 【发布时间】:2015-07-15 02:05:56 【问题描述】:

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. ]

如果我调用阈值,我会得到 array([ 0.4822225 , -0.5177775 , -0.84595197]) (总是只有 3 分)。

因此,我的 ROC 曲线看起来像一个三角形也就不足为奇了。

我无法理解的是为什么 scikit 的 roc_curve 只返回 3 分。非常感谢帮助。

【问题讨论】:

您检查了probas_[:,1] 中的值吗?虽然它的长度为 13759,但它可能只包含 3 个值... 感谢您的帮助,我做到了[print pd.Series(probas_[:,1]).unique()],确实只返回了 2 个唯一身份 ([-0.84595197 -0.5177775 ]) 很高兴它有帮助。如果您愿意,请接受答案。 【参考方案1】:

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

probas_ = model.predict_log_proba(X)

虽然,通过检查唯一性有其他人指出的提示。应该是:

probas_ = model.decisions(X)

【讨论】:

【参考方案2】:

除了 (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 点,因为使用它绘制曲线看起来像问题所示。

【讨论】:

【参考方案3】:

我在另一个例子中遇到了同样的问题。我犯的错误是输入给定阈值的结果,而不是roc_curve的参数y_score中的概率。它也给出了一个三点的情节,但这是一个错误!

【讨论】:

【参考方案4】:

点数取决于输入中唯一值的数量。由于输入向量只有 2 个唯一值,因此该函数给出了正确的输出。

【讨论】:

以上是关于在 scikit 中绘制 ROC 曲线仅产生 3 个点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Tensorflow 和 scikit-learn 绘制 ROC 曲线?

Scikit-learn 中 Kfold 的 ROC 曲线。对 StratifiedKfold 有效,但对 Kfold 显示错误

构建手动 bagging 分类器后绘制 ROC 曲线

ROC曲线的绘制,python实现

如何在 python scikit-learn 中优化精确召回曲线而不是 AUC-ROC 曲线?

在单个 ROC 图上绘制线性判别分析、分类树和朴素贝叶斯曲线