Я работаю с данными для классификации рукописных чисел от 0 до 9. Я использую PCA, чтобы уменьшить размерность до 6 основных компонентов, и KNN для моделирования данных.
Когда я создал матрицу путаницы, я получил разумные ответы. Он не был идеальным, не ожидал, что он будет, но это имело смысл, учитывая точность ~ 0,8885 для моего значения k.
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)
Однако, когда я пытаюсь построить RO C Кривая Я либо получаю 3 точки, выведенные на fpr и tpr, и кривая кажется ненормально высокой. Я был уверен, что мне нужно больше очков, поэтому я попытался изменить свой подход к вычислению roc_curve, но теперь я получаю непристойно низкие результаты из моей кривой, которые не имеют смысла для моей матрицы путаницы. Похоже, что RO C просто увеличивается в точности, когда я go опускаю список классов для проверки.
Мне было интересно, что я могу делать неправильно в моих вычислениях RO C.
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_score быть 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;
Редактировать: Новый RO C Кривые, использующие предикат_проба для прогнозируемого класса
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])