【问题标题】:Why is my f1_scores different when i calculate them manually vs output by sklearn.metrics为什么我手动计算 f1_scores 与 sklearn.metrics 输出时不同
【发布时间】:2021-09-15 12:07:15
【问题描述】:

嗨,我对 python 和 AI 比较陌生,我试图解释我的 f1_scores,我意识到如果我根据我的混淆矩阵使用 F1 = 2TP / (2TP + FP + FN) 手动计算我的 f1 分数,它与 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 中,它使用 f1_score(y_test, y_pred) 返回了 0.6956。谁能给我解释一下是什么问题?

附加信息: 我试图打印分类报告(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

【问题讨论】:

  • 你能用数字显示你所做的微积分吗?当您谈论混淆矩阵时,有时轴或列是混合的,并且并不总是以相同的顺序排列。根据 scikit doc,第一个数字 C(0,0) 是 TN,可能不是您最初的预期。

标签: python artificial-intelligence


【解决方案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 矩阵编号不是按此顺序排列的。

【讨论】:

  • 这里没有 TP=32,这是陷阱,因为 scikit 不使用通常的命令
猜你喜欢
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2020-02-10
  • 2022-01-20
相关资源
最近更新 更多