【发布时间】: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