Расчет производительности модели, когда метки классов не соответствуют ожиданиям - PullRequest
0 голосов
/ 27 октября 2018

Привет, я тренирую нейронную сеть. Обучающий набор данных имеет метки как доброкачественные или злокачественные. Так что я жаждал его в числовые значения, используя,

class_data= pd.factorize(class_data)[0]

Так что теперь злокачественной опухоли дали-0 (что является злокачественной) и доброкачественные - 1 (не раковые)

Теперь матрица путаницы выглядела как ниже

enter image description here Мне нужно рассчитать чувствительность, специфичность. И это было рассчитано, как показано ниже

tn, fp, fn, tp = confusion_matrix(test_y,y_pred).ravel()

# Accuracy : 
acc_ = (tp + tn) / (tp + tn + fn + fp)
print("Accuracy  : ", acc_)
# Sensitivity : 
sens_ = tp / (tp + fn)
print("Sensitivity  : ", sens_)
# Specificity 
sp_ = tn / (tn + fp)
print("Specificity  : ", sp_)
# False positive rate (FPR)
FPR = fp / (tn + fp)
print("False positive rate  : ", FPR)

Так как метки моего класса имеют неверные метки, может кто-нибудь сообщить мне, что вычисления неправильно интерпретируются? PS:

...tn... 29
...fp... 15
...fn... 14
...tp... 85

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Чтобы убедиться, что ваши расчеты верны, вы можете найти счет F1 вручную как

F1Score= 2tp/(2tp+fp+fn)

Затем сравните ваше значение с

sklearn.metrics.f1_score(test_y, y_pred)

Вы также можете использовать параметр метки, чтобы убедиться, чтометки правильные.

confusion_matrix(test_y,y_pred,labels=[0,1]).ravel()
0 голосов
/ 27 октября 2018

Чтобы быть в безопасности, вы можете просто вычислить каждую ячейку вместо использования sklearn.metrics.confusion_matrix(), а затем перейдите оттуда:

# some fake data (assumes labels are boolean)
test_y = [True, True, False, False, True]
y_pred = [True, False, True, False, True]

idx_range = range(len(test_y))

tn = sum([not test_y[idx] and not y_pred[idx] for idx in idx_range])
fp = sum([not test_y[idx] and y_pred[idx] for idx in idx_range])
fn = sum([test_y[idx] and not y_pred[idx] for idx in idx_range])
tp = sum([test_y[idx] and y_pred[idx] for idx in idx_range])

# ... and then calculate the metrics 

Если вы предпочитаете использовать pandas.factorize(), вы также можете принудительно настроить отображение True на 1 и False на 0, установив sort=True:

test_y = [True, True, False, False, True]
y_pred = [True, False, True, False, True]

# pd.factorize() returns a tuple so get the data (0th elem)
test_y_factor = pd.factorize(test_y, sort=True)[0]
y_pred_factor = pd.factorize(y_pred, sort=True)[0]

# confirm that the translation happened properly:
[*zip(test_y, test_y_factor[0])]
## 
## output: 
## [(True, 1), (True, 1), (False, 0), (False, 0), (True, 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...