python - 索引错误 : too many indices for array while plotting ROC curve with scikit-learn?

标签 python numpy matplotlib scikit-learn

我想绘制 scikit-lern 实现的 ROC 曲线,所以我尝试了以下操作:

from sklearn.metrics import roc_curve, auc
false_positive_rate, recall, thresholds = roc_curve(y_test, prediction[:, 1])
roc_auc = auc(false_positive_rate, recall)
plt.title('Receiver Operating Characteristic')
plt.plot(false_positive_rate, recall, 'b', label='AUC = %0.2f' % roc_auc)
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.ylabel('Recall')
plt.xlabel('Fall-out')
plt.show()

这是输出:

Traceback (most recent call last):
  File "/Users/user/script.py", line 62, in <module>
    false_positive_rate, recall, thresholds = roc_curve(y_test, prediction[:, 1])
IndexError: too many indices for array

然后从 previous question我试过这个:

false_positive_rate, recall, thresholds = roc_curve(y_test, prediction)

并得到了这个回溯:

/usr/local/lib/python2.7/site-packages/sklearn/metrics/metrics.py:705: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.
  not (np.all(classes == [0, 1]) or
/usr/local/lib/python2.7/site-packages/sklearn/metrics/metrics.py:706: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.
  np.all(classes == [-1, 1]) or
Traceback (most recent call last):
  File "/Users/user/PycharmProjects/TESIS_CODE/clasificacion_simple_v1.py", line 62, in <module>
    false_positive_rate, recall, thresholds = roc_curve(y_test, prediction)
  File "/usr/local/lib/python2.7/site-packages/sklearn/metrics/metrics.py", line 890, in roc_curve
    y_true, y_score, pos_label=pos_label, sample_weight=sample_weight)
  File "/usr/local/lib/python2.7/site-packages/sklearn/metrics/metrics.py", line 710, in _binary_clf_curve
    raise ValueError("Data is not binary and pos_label is not specified")
ValueError: Data is not binary and pos_label is not specified

然后我也尝试了这个:

false_positive_rate, recall, thresholds = roc_curve(y_test, prediction[0].values)

这是回溯:

AttributeError: 'numpy.int64' object has no attribute 'values'

知道如何正确绘制此指标吗?提前致谢!

这是预测变量的形状:

print prediction.shape
(650,)

这是 testing_matrix 的形状:(650, 9596)

最佳答案

变量prediction 需要是一个一维数组(与y_test 形状相同)。您可以通过检查形状属性来检查,例如y_test.shape。我觉得

prediction[0].values 

返回

AttributeError: 'numpy.int64' object has no attribute 'values'

因为您正在尝试对预测元素调用 .values

更新:

ValueError: Data is not binary and pos_label is not specified

我之前没有注意到这一点。如果您的类不是二进制的,则必须在 roc_curve 中指定 pos_label 参数,以便绘制一个类与其余类的对比图。为此,您需要将类标签设为整数。您可以使用:

from sklearn.preprocessing import LabelEncoder
class_labels = LabelEncoder()
prediction_le = class_lables.fit_transform(prediction)

pediction_le<​​ 返回类重新编码为 int

更新 2:

你的预测器只返回一个类,所以你不能绘制 ROC 曲线

关于python - 索引错误 : too many indices for array while plotting ROC curve with scikit-learn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28389890/

相关文章:

python - 在 Python 中发送 100,000 个 HTTP 请求的最快方法是什么?

python - 不能使用 matplotlib.use ('Agg' ),图形总是显示在屏幕上

python - matplotlib imshow -- 使用任何向量作为轴

python - MatPlotlib 中的 FPS 较低

python - 如何在 python 中将打印作业发送到打印机

python - 在没有输入的情况下将Python3输入设置为默认数字

python - 对于每个日期 - 是否在任何提供的日期范围内?

python - Numpy:按最后一维堆叠数组

performance - numpy数组子维度上的python操作

python - Python中的十进制对齐格式