Кривая RO C говорит о том, что мои прогнозы хуже случайных, но моя матрица путаницы говорит об обратном - PullRequest
4 голосов
/ 20 февраля 2020

Я работаю с данными для классификации рукописных чисел от 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;

enter image description here

enter image description here

Редактировать: Новый 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])

enter image description here

enter image description here

1 Ответ

0 голосов
/ 24 февраля 2020

Учитывая вашу матрицу путаницы, графики RO C, основанные на предсказанной вероятности, имеют для меня смысл. Например, графики RO C предполагают, что вы сможете идентифицировать все истинные нули при неправильной классификации небольшого процента других чисел. Это, кажется, имеет смысл с учетом матрицы путаницы, которая показывает очень высокую точность для нулей. Графики RO C также отражают более низкую точность для тройки или девятки.

Тем не менее, я думаю, что RO C может не подходить под метрику c для вашей проблемы: кривая RO C по существу, показывает компромисс между ложными отрицаниями и ложными срабатываниями для данной задачи (например, распознавание девяток). В вашем случае, я полагаю, вы не так заинтересованы в распознавании одного числа, но больше заинтересованы в общей точности модели для всех чисел. Так что, возможно, вам лучше взглянуть на такую ​​меру, как категориальная потеря кроссентропии.

Я думаю, однако, что рассмотрение всей кривой RO C может быть немного вводящим в заблуждение в вашем случае: вы, вероятно, не быть готовым неправильно классифицировать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...