假若有一个癌症预测系统,输入体检信息,能够判断是否有癌症,准确度为99.9%,这个系统是好仍是坏?
若是癌症产生的几率原本就只有0.1%,那么即便不采用此预测系统,对于任何输入的体检信息,都预测全部人都是健康的,便可达到99.9%的准确率。若是癌症产生的几率原本就只有0.01%,预测全部人都是健康的几率可达99.99%,比预测系统的准确率还要高,这种状况下,准确率99.9%的预测系统是失败的。
由此能够得出结论:对于极度偏斜(Skewed Data)的数据,只使用分类准确度是远远不够的。git
对于二分类问题:算法
行表明真实值,列表明预测值
0表明阴性(Negative),1表明阳性(Positive)
预测阳性正确TP,预测阳性错误FP,预测阴性正确TN,预测阴性错误FNdom
精准率:\(Precision = \frac{TP}{TP+FP}\)
召回率:\(Recall = \frac{TP}{TP+FN}\),测试
在癌症预测系统中,精准率表示预测得癌症的总人数中预测对的比例,召回率表示实际得癌症的总人数中预测对的比例spa
假设有10000我的,有10我的患有癌症,咱们预测全部的人都是健康的,获得混淆矩阵:
code
算法各指标计算:blog
准确率=99.9%
精准率=0/(0+0)无心义
召回率=0/(10+0)=0ci
加载数据集get
import numpy from sklearn import datasets digits = datasets.load_digits() x = digits.data y = digits.target.copy() # 处理数据,使数据极度偏斜 y[digits.target==9] = 1 y[digits.target!=9] = 0 # 测试训练数据分离 from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=666) # 加载逻辑回归算法 from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression() log_reg.fit(x_train,y_train) y_predict = log_reg.predict(x_test)
def TN(y_true,y_predict): assert len(y_true)==len(y_predict) return numpy.sum((y_true==0)&(y_predict==0)) def TP(y_true,y_predict): assert len(y_true)==len(y_predict) return numpy.sum((y_true==1)&(y_predict==1)) def FN(y_true,y_predict): assert len(y_true)==len(y_predict) return numpy.sum((y_true==1)&(y_predict==0)) def FP(y_true,y_predict): assert len(y_true)==len(y_predict) return numpy.sum((y_true==0)&(y_predict==1)) def confusion_matrix(y_true,y_predict): assert len(y_true)==len(y_predict) return numpy.array([ [TN(y_true,y_predict),FP(y_true,y_predict)], [FN(y_true,y_predict),TP(y_true,y_predict)] ])
def precision_score(y_true,y_predict): tp = TP(y_test,y_predict) fp = FP(y_test,y_predict) try: return tp/(fp+tp) except: return 0 def recall_score(y_true,y_predict): tp = TP(y_test,y_predict) fn = FN(y_test,y_predict) try: return tp/(fn+tp) except: return 0
from sklearn.metrics import confusion_matrix,precision_score,recall_score