今天是生信星球陪你的第1000天
公众号里的文章大多数需要编程基础,如果因为代码看不懂,而跟不上正文的节奏,可以来找我学习,相当于给自己一个新手保护期。我的课程都是循环开课,点进去咨询微信↓
生信分析直播课程(每月初开一期,春节休一个月)
生信新手保护学习小组(每月两期)
单细胞陪伴学习小组(每月两期)
评估准确率并不适用于所有的情况。
分类不平衡的数据不能只计算准确率
假如构建一个预测银行交易是否为欺诈的模型,99%是合法交易,1%是欺诈,那么可以构建一个模型,预测所有交易都是合法交易,正确率高达99%。
但是,它无法真正预测欺诈,未能达到建模的初衷。所以需要采用不同的方法来评估模型的性能。
那还有什么其他的指标可以用呢?
接下来要迎接一串名词的暴击:
混淆矩阵 准确率 精确度 召回率 F1分数
混淆矩阵和它的小伙伴们
直观的理解一下,假如我们做的分类模型是诊断模型,0是没病,1是有病。那么:
感兴趣的类别(欺诈/有病)是阳性。从混淆矩阵中可以计算多个统计量:
准确率:正确预测的次数/总预测次数
精确度(precision):TP/TP+FP,高精确度意味着较低的误报率(把合法交易说成欺诈就是误报)
召回率(recall): TP/TP+FN, 高召回率意味着较低的假阴性率(把欺诈说成合法交易就是假阴性)
F1 score :综合考虑精确度和召回率
依然使用前面的建模数据,构建KNN分类模型
import pandas as pd
import numpy as np
churn_df = pd.read_csv("Discriminant-analysis-churn-dataset.csv")
churn_df
X = churn_df[["total_day_charge", "total_eve_charge"]].values
y = churn_df["churn"].values
print(X.shape, y.shape)
(5000, 2) (5000,)
confusion_matrix 函数可以计算混淆矩阵,而classification_report函数可以计算其他指标。
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
knn = KNeighborsClassifier(n_neighbors=7)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,
random_state=42)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(confusion_matrix(y_test, y_pred))
## [[1677 50]
## [ 185 88]]
print(classification_report(y_test, y_pred))
precision recall f1-score support
0 0.90 0.97 0.93 1727
1 0.64 0.32 0.43 273
accuracy 0.88 2000
macro avg 0.77 0.65 0.68 2000
weighted avg 0.86 0.88 0.87 2000
这个报告按照类别计算了刚才提到的几项指标,0对应的一行就是以0为阳性,1对应的一行就是以1为阳性,我们应该看的是1对应的那一行。
support是每个类别都有多少样本。
最后三行是各个指标计算结果的平均值,宏平均和加权平均(最后一列除外)。