评价分类模型的性能指标
当一个模型构建完成之后,我们可以通过几个不同的性能指标来衡量分类模型的相关性能,常用的分类性能指标有准确率(precision)、召回率(recall)和F1分数(F1-score)。
一、混淆矩阵
混淆矩阵(confusion matrix):是展示分类学习算法的一种性能矩阵(方阵),包括分类器预测结果真正(true positive)、真负(true negative)、假正(false positive)、假负(false negative)的数量,如下图:
真正:实际是正类别,预测也是正类别
假负:实际是正类别,预测成了负类别
真负:实际是负类别,预测也是负类别
假正:实际是负类别,预测成了正类别
通过sklearn的confusion_matrix函数和matplotlib来实现混淆矩阵的绘制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC
if __name__ == "__main__":
#读取数据
data = pd.read_csv("G:/dataset/wdbc.csv")
#获取X
X = data.ix[:,2:32]
#获取字符标签
label_y = data.ix[:,1]
#将字符串标签转换成整数类型
label = LabelEncoder()
Y = label.fit_transform(label_y)
#将数据分为训练集和测试集
train_x,test_x,train_y,test_y = train_test_split(X,Y,test_size=0.2,random_state=1)
#训练模型
pipe = Pipeline([("std",StandardScaler()),
("svc",SVC(kernel="linear",C=0.1))])
pipe.fit(train_x,train_y)
#预测类标
pred_y = pipe.predict(test_x)
#计算混淆矩阵
confmat = confusion_matrix(y_pred=pred_y,y_true=test_y)
#绘制混淆矩阵
fig,ax = plt.subplots(figsize=(2.5,2.5))
ax.matshow(confmat,cmap=plt.cm.Blues,alpha=0.3)
for i in range(confmat.shape[0]):
for j in range(confmat.shape[1]):
#在绘制的时候,是一行一行绘制所以y不变
ax.text(x=j,y=i,s=confmat[i,j],va="center",ha="center")
plt.xlabel("预测类标")
plt.ylabel("实际类标")
plt.show()
其中,1为正类别(恶性),0为负类别(良性)。通过混淆矩阵可以发现,模型正确的预测了71个负类别和39个正类别,其中将1个负类别错误的预测为了正类别,将3个正类别错误的预测为了负类别。
二、模型的准确率和召回率
预测误差(error,ERR)和准确率(accuracy,ACC)都表示了误分类样本数量的相关信息,其中ERR=1-ACC。预测误差,为预测错误样本的数量与所有样本数量的比值。准确率,为预测正确样本的数量与所有样本数量的比值。计算公式如下:
对于类标数量不均衡的分类问题来说,真正率(TPR)与假正率(FPR)也是非常有用的性能指标。真正率表示预测与实际都为正类别的样本数量与实际正样本数量的比值,假正率表示预测为正类别实际为负类别的样本数量与实际负类别的样本数量的比值。计算公式如下:
在对肿瘤分类模型分析中,主要关注的是正确的检测出恶性肿瘤的病人(即真正率),这样能够使得病人即使的得到救治。降低良性肿瘤被错误预测为恶性肿瘤(假正率)的数量固然重要,其实对病人影响不大。与假正率相反的真正率样本中,包含了有关正确识别出来恶性肿瘤样本的信息。
准确率(precision,PRE)和召回率(recall,REC)与真正率和真负率相关的性能评价指标,召回率和真正率的含义相同,计算公式如下
除了准确率和召回率,还有F1分数,是利用准确率和召回率的组合的一种性能评价指标
通过sklearn来计算准确率、召回率和F1分数
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score,f1_score
print("准确率:",precision_score(test_y,pred_y))
#准确率: 0.975
print("召回率:",recall_score(test_y,pred_y))
#召回率: 0.928571428571
print("F1分数:",f1_score(test_y,pred_y))
#F1分数: 0.951219512195
注意:在sklearn中将正类类标标识为1,。如果,需要指定一个不同的正类标,我们可以通过make_scorer函数来构建一个评分函数,通过设置GridSearchCV中的scoring参数,设置为我们构造的评分函数。
三、绘制ROC曲线
受试者工作特征曲线(receiver operator characteristic,ROC)是基于模型的假正率和真正率等性能指标进行分类模型选择的有用工具,假正率和真正率可以移动分类器的分类阈值来计算。ROC曲线的对角线表示的是随机猜测,比如说某件事情发生或者不发生,那么我们随机猜中的概率为0.5。如果ROC曲线在对角线下,就表示分类器的性能比随机猜测还差。最好的分类器,其真正率是1,假正率是0,对应的ROC曲线是一条横轴为0与纵轴为1组成的折线。ROC曲线下的区域(area under the curve,AUC),用来表示分类模型的性能。
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve,auc
from scipy import interp
from sklearn.model_selection import StratifiedKFold
if __name__ == "__main__":
data = pd.read_csv("G:/dataset/wdbc.csv")
X = data.ix[:,[4,14]]
label = LabelEncoder()
label_y = data.ix[:,1]
Y = label.fit_transform(label_y)
train_x,test_x,train_y,test_y = train_test_split(X,Y,test_size=0.2,random_state=1)
train_x = np.array(train_x)
pipe_lr = Pipeline([("std",StandardScaler()),
("lr",LogisticRegression(penalty="l2",C=0.1))])
#设置k折交叉验证中的k为3
cv = StratifiedKFold(n_splits=3,random_state=1)
fig = plt.figure(figsize=(7,5))
#真正率的平均值
mean_TPR = 0
#假正率的取值范围
mean_FPR = np.linspace(0,1,100)
all_TPR = []
for i,(train,test) in enumerate(cv.split(train_x,train_y)):
probas = pipe_lr.fit(train_x[train],train_y[train]).predict_proba(train_x[test])
FPR,TPR,thresholds = roc_curve(train_y[test],probas[:,1],pos_label=1)
#计算ROC曲线的内插均值
mean_TPR += interp(mean_FPR,FPR,TPR)
#真正率的最小值为0
mean_TPR[0] = 0.0
roc_auc = auc(FPR,TPR)
plt.plot(FPR,TPR,lw=1,label="ROC fold %d (area = %0.2f)" % (i+1,roc_auc))
#绘制随机猜测曲线(0,0)和(1,1)
plt.plot([0,1],[0,1],linestyle="--",color=(0.6,0.6,0.6),label="随机猜测")
#计算三条真正率的平均值
mean_TPR /= cv.get_n_splits(train_x,train_y)
#真正率的最大值为1
mean_TPR[-1] = 1.0
#绘制平均auc曲线
mean_auc = auc(mean_FPR,mean_TPR)
#绘制ROC曲线
plt.plot(mean_FPR,mean_TPR,"k--",label="ROC均值(area = %0.2f)" % mean_auc,lw=2)
#绘制完美性能曲线,折线
plt.plot([0,0,1],[0,1,1],lw=2,linestyle=":",color="black",label="完美性能曲线")
#设置x轴的取值范围
plt.xlim([-0.05,1.05])
#设置y轴的取值范围
plt.ylim([-0.05,1.05])
plt.xlabel("假正率")
plt.ylabel("真正率")
plt.title("ROC曲线")
plt.legend(loc="lower right")
plt.show()
计算ROC在AUC上的得分,也就是ROC下的面积
from sklearn.metrics import roc_auc_score
from sklearn.metrics import accuracy_score
pipe_lr.fit(train_x,train_y)
pred_y = pipe_lr.predict(test_x)
print("ROC AUC: %.3f" % roc_auc_score(test_y,pred_y))
#ROC AUC: 0.843
print("Accuracy: %.3f" % accuracy_score(test_y,pred_y))
#Accuracy: 0.877
四、多分类的评价标准
在多分类系统中,常用的性能指标有宏(macro)均值和微(micro)均值,以k类分类系统中的准确率为例,计算公式如下:
当我们同等看待每个实例或每次预测的时候,微均值是有用的,当我们同等看待每个类别的时候,宏均值是有效的。如果,样本中的类别是不均衡的,在计算宏均值的时候,需要以各类别中样本的数量作为评分的权值。
推荐阅读
-
评价分类模型的性能指标
-
Django小例子 – 模型数据的模板呈现 博客分类: django django
-
Grails的Controller中如何获取Domain模型 博客分类: grails grails
-
mangos 的执行模型 博客分类: c++技术随笔游戏总结整理 gsmangosrun
-
共享内存系统是普通单机程序开发人员熟悉的开发范式 博客分类: Java互联网 工程现代模型一致性副本
-
高斯背景模型在 监控中的应用 博客分类: 推荐系统 高斯背景模型监控
-
快速开发 HTML5 WebGL 的 3D 斜面拖拽生成模型 博客分类: hightopo html5canvas3d工控电信网管
-
多模型融合推荐算法在达观数据的运用 博客分类: 互联网,大数据 推荐系统大数据互联网数据挖掘
-
【转载】Kano模型在用户调研中的应用:客户关系管理工具调研实例 博客分类: 产品/用户 KANO
-
【转载】Kano模型在用户调研中的应用:客户关系管理工具调研实例 博客分类: 产品/用户 KANO