大家好,我是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 mathmath.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]]
这里开始变得 confusing,如果我手动计算F1分数,得到的是0.8704。然而,在Python中使用f1_score(y_test, y_pred)返回的结果是0.6956。请问有人能解释一下问题出在哪里吗?
附加信息:我尝试打印classification_report(y_test, y_pred),这是输出结果:
分类报告:
精确度 召回率 f1分数 样本数 0 0.86 0.88 0.87 107 1 0.71 0.68 0.70 47 准确率 0.82 154 宏平均 0.79 0.78 0.78 154加权平均 0.82 0.82 0.82 154
回答:
Scikit的混淆矩阵中的数字顺序与您在书本/讲义中期望的顺序不同。
在scikit learn中,矩阵中数字的顺序是:
TN FNFP TP所以 F1 = 2TP / (2TP + FP + FN) F1 = 2*32 / (2*32 + 15 + 13)F1 = 0.6956
这是正确的答案。
您计算时假设矩阵数字的顺序是:
TP FPFN TNF1 = 2*94 / 2*94+13+15F1 = 0.8703
这是错误的,因为scikit的矩阵数字顺序并非如此。