【问题标题】:roc_curve: indices must be integers, not tupleroc_curve:索引必须是整数,而不是元组
【发布时间】:2017-11-27 22:54:21
【问题描述】:

我正在尝试绘制 ROC,从而使用 sklearn.metrics.roc_curve 函数计算误报率和误报率。

roc_data = *somedataframeimport*

X_train, X_test, y_train, y_test = split_vect_trans(roc_data)

在这里用我自己的函数对我的数据进行矢量化和转换后,我用它拟合一个 NN 并进行预测。

nn_roc = OneVsRestClassifier(MLPClassifier())
nn_roc = nn_roc.fit(X_train, y_train)

pred = nn_roc.predict(X_test)


fpr = dict()
tpr = dict()
roc_auc = dict()

for i in range(len(y_score)):
    fpr[i], tpr[i], _ = metrics.roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = metrics.auc(fpr[i], tpr[i])

不过,在将数据传递到 roc_curve 函数时,总是会收到以下错误消息。

          5 for i in range(len(y_score)):
    ----> 6     fpr[i], tpr[i], _ = metrics.roc_curve(y_test[:, i], y_score[:, i])
          7     roc_auc[i] = metrics.auc(fpr[i], tpr[i])
TypeError: list indices must be integers, not tuple

我尝试添加一行,将输入数据显式转换为数组(我在另一篇文章中阅读了相同错误消息的建议)。现在这会给出 IndexError: too many indices for array 作为错误消息。

y_test_array = np.asarray(y_test)
y_score = np.asarray(pred)

for i in range(len(y_score)):
    fpr[i], tpr[i], _ = metrics.roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = metrics.auc(fpr[i], tpr[i])

【问题讨论】:

  • y_test 是不是一个 numpy 数组?
  • 不,这是一个如下所示的列表:[1, 1, 1, 1, 1, 1, 1, ..., 1, 1, 1, 0, 1, 1, 1 , 1, 0, 1, 1, 1, 1] 这就是我尝试添加 np.asarray() 部分的原因。
  • 但是我的问题是:你在 y_test_array 中改变了 y_test,但是在代码中你还在使用 y_test 不是吗?因为错误提示我 y_test 是一个列表而不是一个 numpy 数组。你能给我y_test.shape的结果吗
  • 我错过了,是的。将其更改为输入为形状为 (705,) 的 y_test_array 给出: IndexError: too many indices for array for the same row。相应地编辑了问题。
  • 好的,现在我们正在解决问题。您正在将列表转换为数组。然后,您尝试使用两个索引来访问平面数组(就像它是矩阵一样),因此出现了问题。我们现在要了解的是:在“asarray()”调用之前的 y_test 是什么?

标签: python scikit-learn neural-network roc


【解决方案1】:

数组只是一个元素序列。您可以访问元素 i 并使用它在数组中的位置来寻址它:

| a | b | c | ...... |z|  

“b”元素1(从零开始)

当您使用二维数组(也称为矩阵)时,您需要两个索引来唯一标识一个元素:

| aa | ab | .... | az |  
| ba | bb | ....   .  
| ca | ...         .  
  .                .  
  .                .  

| za | zb | .... | zz |  

“ca”是元素[2,0]

在 NumPy 中,您可以通过“:”来处理整行或整列 所以 mat[:,0] 表示“第 0 列(也就是第一列)的所有行

或者您可以访问一系列元素。 mat[2:5,0] 表示“矩阵第一行2到4(包括)的元素”

遇到您的问题,您正在尝试使用两个索引访问一个平面数组。可能昏迷是错误的,因为您想访问从 0 到“i”的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2015-07-11
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多