解决TypeError:列表索引应为整数/切片而非元组(混淆矩阵场景)
问题:计算深度学习模型混淆矩阵时的TypeError及Label参数传入问题
习惯用R,刚转Python做项目,计算深度学习模型的混淆矩阵时持续遇到错误:TypeError: list indices must be integers or slices, not tuple。检查传入的3个参数类型后发现类型不同,怀疑是问题根源。
最初将Label从数据框取出转为列表:Label=data['Label'].tolist(),后来修正为Label=data['Label'],但尝试用Label[0,1]和Label[0][1]传入confusion_matrix都无效,相关代码及报错信息如下:
q_aware_model.evaluate(X_test, y_test) 3912/3912 [==============================] - 4s 1ms/step - loss: 0.2378 - accuracy: 0.9361 Out[64]: [0.23779138922691345, 0.9361117482185364] test_predict= q_aware_model.predict(X_test) 3912/3912 [==============================] - 4s 902us/step cm=confusion_matrix(y_test,test_predict,Label[0,1]) TypeError Traceback (most recent call last) <ipython-input-83-951a7f1f1671> in <module> ----> 1 cm=confusion_matrix(y_test,test_predict,Label[0,1]) TypeError: list indices must be integers or slices, not tuple type(Label) Out[66] list type(y_test) Out[67]: pandas.core.frame.DataFrame type(test_predict) Out[68]: numpy.ndarray
解决方案
核心问题梳理
sklearn.metrics.confusion_matrix的参数有严格要求:
y_true(真实标签)和y_pred(预测标签)必须是一维的类别标签序列/数组,不能是DataFrame或多维度的概率输出。labels参数是用来指定混淆矩阵的类别顺序,必须是完整的一维类别集合,不是单个元素。
分步修正代码
处理真实标签
y_test:将DataFrame转为一维数组/列表# 方式1:用values.ravel()展平为一维数组 y_test_flat = y_test.values.ravel() # 方式2:取DataFrame的第一列转为列表 y_test_flat = y_test.iloc[:, 0].tolist()处理预测结果
test_predict:如果模型返回的是类别概率矩阵(比如二分类是(n_samples,2)的数组),需要先转为类别标签import numpy as np test_predict_labels = np.argmax(test_predict, axis=1)处理类别标签集合
Label:确保它是去重后的一维类别列表,直接传入labels参数# 从原数据中提取去重并排序的类别集合 Label = sorted(data['Label'].unique().tolist())计算混淆矩阵
from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test_flat, test_predict_labels, labels=Label)
报错原因解释
Label[0,1]是用元组索引列表,而Python列表仅支持整数或切片索引,因此触发TypeError。- 另外,
y_test作为DataFrame不是一维序列,test_predict如果是概率矩阵而非类别标签,这两个参数不符合confusion_matrix的要求,也会引发后续问题。
内容的提问来源于stack exchange,提问作者Frenzy
相关产品推荐
相关产品推荐

