Python ROC曲线显示我的预测比随机预测更糟糕,但我的混淆矩阵显示了相反的结果

Python ROC曲线显示我的预测比随机预测更糟糕,但我的混淆矩阵显示了相反的结果,python,roc,confusion-matrix,auc,Python,Roc,Confusion Matrix,Auc,我正在使用数据对手写数字从0到9进行分类。我使用PCA将维度降低到6个主成分,并使用KNN对数据进行建模 当我创建混淆矩阵时,我得到了合理的答案。它不是完美的,也不期望它是完美的,但考虑到我的k值的精度约为0.8885,它是有意义的 array([[ 952, 0, 2, 1, 0, 9, 9, 0, 7, 0], [ 0, 1125, 0, 3, 0, 0, 5, 1, 1,

我正在使用数据对手写数字从0到9进行分类。我使用PCA将维度降低到6个主成分,并使用KNN对数据进行建模

当我创建混淆矩阵时,我得到了合理的答案。它不是完美的,也不期望它是完美的,但考虑到我的k值的精度约为0.8885,它是有意义的

array([[ 952,    0,    2,    1,    0,    9,    9,    0,    7,    0],
       [   0, 1125,    0,    3,    0,    0,    5,    1,    1,    0],
       [   7,    5,  973,   11,    4,    2,    9,    3,   18,    0],
       [   4,    9,   15,  846,    2,   40,    2,    7,   82,    3],
       [   3,    4,    9,    6,  830,    5,   16,   11,    0,   98],
       [  23,    1,    9,   38,    9,  787,    9,    2,   10,    4],
       [  17,    8,   16,    2,   13,    9,  893,    0,    0,    0],
       [   2,   14,   13,    3,   54,    4,    0,  909,    6,   23],
       [  16,    2,   25,   60,   23,   23,    4,    6,  802,   13],
       [  11,    5,    7,   16,  155,   15,    4,   21,    7,  768]],
      dtype=int64)
然而,当我尝试绘制ROC曲线时,我要么得到3个点输出到fpr和tpr,曲线似乎异常高。我确信我需要更多的分数,所以我尝试改变我计算roc_曲线的方法,但现在我从曲线中得到的结果非常低,这对我的混淆矩阵没有意义。在我查看课程列表时,ROC的准确度似乎有所提高

我想知道我在ROC计算中会做错什么

accuracy = 0;
predicted_class = np.zeros((np.size(y_test),1))
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(test_projected,y_test)
for i in range (0,np.size(test_projected[:,0])):
    query_point = test_projected[i,:]
    true_class_of_query_point = y_test[i]

    predicted_class[i] = knn.predict([query_point])
    if(predicted_class[i] == true_class_of_query_point):
        accuracy += 1;
print('Accuracy of k = 3 is ', accuracy/np.size(test_projected[:,0]), '\n')

fig,axs = plt.subplots(5,2,figsize=(15,15))
fig.tight_layout()
j = 0;
k = 0;
y_gnd = np.zeros((10000,1))
for i in range (0,10):
    for m in range(0,10000):
        if(y_test[m]==i):
            y_gnd[m] = 1
        else:
            y_gnd[m] = 0
    fpr,tpr,threshold = metrics.roc_curve(y_gnd,predicted_class)
    auc = metrics.roc_auc_score(y_gnd,predicted_class)
此外,roc_auc_分数的输入应该是fpr和tpr吗?我看到了标签和预测作为输入,以及fpr和tpr

    axs[j][k].plot(fpr,tpr)
    axs[j][k].set_title('AUC Score for ' +str(i)+ ' is = ' +str(auc)+ '.')

    if(k == 1):
        j += 1;
    k += 1;
    if(k > 1):
        k = 0;

编辑:使用预测类的predict_proba创建新的ROC曲线

pred = knn.predict_proba(test_projected)
fpr,tpr,threshold = metrics.roc_curve(y_gnd,pred[:,i])
auc = metrics.roc_auc_score(y_gnd,pred[:,i])


鉴于您的混淆矩阵,基于预测概率的ROC图对我来说是有意义的。例如,ROC图表明,当错误分类一小部分其他数字时,您将能够识别所有真实的零。考虑到混淆矩阵,这似乎是有意义的,它显示了非常高的零精度。ROC图也反映了三分或九分的精确度较低

然而,我认为ROC可能不是解决您问题的正确指标:ROC曲线基本上显示了给定任务的误报和误报之间的权衡(例如识别9)。在您的情况下,我想您对识别单个数字不太感兴趣,而是对所有数字的整体模型精度更感兴趣。所以你最好看看分类交叉熵损失之类的度量


然而,我认为,在你的情况下,观察整个ROC曲线可能有点误导:你可能不愿意错误分类,你应该使用
predict\u probaa
,而不是预测得到类概率,然后由
ROC\u曲线
ROC\u auc\u分数
使用。你的情节(我相信)把预测的类标签看作非阈值预测分数(它们不是)。@ SIM帮助我回到更合理的曲线,但我觉得它们仍然太高。我得到了0.9866作为我的最低AUC值,这似乎有什么东西仍然走错了。我的fpr、tpr现在得到5分,而不是3分。