Почему мои оценки f1_ отличаются, когда я вычисляю их вручную по сравнению с выводом sklearn.metrics

#python #artificial-intelligence

Вопрос:

Привет, я относительно новичок в python и искусственном интеллекте, и я пытался объяснить свои оценки f1, и я понял, что если я рассчитаю свой балл f1 вручную, используя F1 = 2TP / (2TP FP FN) на основе моей матрицы путаницы, это отличается от того, что возвращает мне sklearn.metrics.

Это мой код

 dataset = pd.read_csv('diabetes-data.csv')

zero_not_accepted = ['Glucose', 'BloodPressure', 'SkinThickness', 'BMI', 'Insulin']

for column in zero_not_accepted:
    dataset[column] = dataset[column].replace(0, np.NaN)
    mean = int(dataset[column].mean(skipna=True))
    dataset[column] = dataset[column].replace(np.NaN, mean)
    
X = dataset.iloc[:, 0:8]
y = dataset.iloc[:, 8]
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.2)

print(X_test)

sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

classifier = KNeighborsClassifier(n_neighbors=11, p=2, metric="euclidean")

import math
math.sqrt(len(y_test))

classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
 

Моя последняя матрица путаницы такова
[[94 13]
[15 32]]

Именно здесь возникает путаница, если я рассчитаю оценку F1 вручную, я получу 0,8704. Однако в python он вернул мне 0,6956, используя f1_score(y_test, y_pred). Кто-нибудь может, пожалуйста, объяснить мне, в чем были проблемы?

Дополнительная информация: Я попытался распечатать classification_report(y_test, y_pred)), и это результат: *

Отчет о классификации:

                precision    recall  f1-score   support

           0       0.86      0.88      0.87       107
           1       0.71      0.68      0.70        47

    accuracy                           0.82       154
   macro avg       0.79      0.78      0.78       154
weighted avg       0.82      0.82      0.82       154
 

Комментарии:

1. Не могли бы вы показать, как вы точно вычисляли числа ? иногда оси или столбцы смешиваются и не всегда в одном и том же порядке, когда вы говорите о матрице путаницы. Согласно документу scikit, первое число C(0,0) — это TN, возможно, не то, что вы ожидали в первую очередь.

Ответ №1:

Порядок чисел Scikit в матрице путаницы не совпадает с порядком, который вы ожидаете / имеете в своих книгах/лекции.

Для scikit узнайте порядок чисел в матрице таков :

 TN FN
FP TP

So F1 = 2TP / (2TP   FP   FN) 
F1 = 2*32 / (2*32   15   13)
F1 = 0.6956
 

это хороший ответ.

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

 TP FP
FN TN

F1 = 2*94 / 2*94 13 15
F1 = 0.8703
 

Что неверно, так как матричные числа scikit не расположены в этом порядке.

Комментарии:

1. Здесь нет TP=32, это ловушка, так как scikit doe не использует обычный порядок