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

sap*_*ico 15 python validation machine-learning roc scikit-learn

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)
Run Code Online (Sandbox Code Playgroud)

只是为了确保长度合适:

print len(y)
print len(probas_[:, 1])
Run Code Online (Sandbox Code Playgroud)

两者都返回13759.

然后运行:

false_pos_rate, true_pos_rate, thresholds = roc_curve(y, probas_[:, 1])
print false_pos_rate
Run Code Online (Sandbox Code Playgroud)

返回[0. 0.28240129 1.]

如果我调用threasholds,我得到数组([0.4822225,-0.5177775,-0.84595197])(总是只有3分).

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

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

在此输入图像描述

pya*_*yan 11

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


Tho*_* G. 8

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


小智 5

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

probas_ = model.predict_log_proba(X)
Run Code Online (Sandbox Code Playgroud)

不过,其他人通过检查唯一性也指出了一些提示。应该是:

probas_ = model.decisions(X)
Run Code Online (Sandbox Code Playgroud)