为什么我手动计算的 f1_scores 与 sklearn.metrics 的输出不同
Why is my f1_scores different when i calculate them manually vs output by sklearn.metrics
嗨,我对 python 和 AI 比较陌生,我试图解释我的 f1_scores,我意识到如果我使用 F1 = 2TP / (2TP + FP 手动计算我的 f1 分数+ FN) 基于我的混淆矩阵,它与 sklearn.metrics returns 我的不同。
这是我的代码
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。谁能给我解释一下问题是什么?
附加信息:
我尝试打印 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
混淆矩阵中的 Scikit 数字顺序与您在 books/lecture 中期望/拥有的顺序不同。
对于 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 矩阵编号不是按此顺序排列的。
嗨,我对 python 和 AI 比较陌生,我试图解释我的 f1_scores,我意识到如果我使用 F1 = 2TP / (2TP + FP 手动计算我的 f1 分数+ FN) 基于我的混淆矩阵,它与 sklearn.metrics returns 我的不同。
这是我的代码
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。谁能给我解释一下问题是什么?
附加信息: 我尝试打印 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
混淆矩阵中的 Scikit 数字顺序与您在 books/lecture 中期望/拥有的顺序不同。
对于 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 矩阵编号不是按此顺序排列的。