Python ROC曲线显示我的预测比随机预测更糟糕,但我的混淆矩阵显示了相反的结果
我正在使用数据对手写数字从0到9进行分类。我使用PCA将维度降低到6个主成分,并使用KNN对数据进行建模 当我创建混淆矩阵时,我得到了合理的答案。它不是完美的,也不期望它是完美的,但考虑到我的k值的精度约为0.8885,它是有意义的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,
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分。