sklearn评价指标——回归模型评估及分类模型评估使用的库、ROC曲线理解
1、线性回归评价指标
#MSE均方误差
from sklearn.metrics import mean_squared_error
#MAEX
from sklearn.metrics import mean_absolute_error
#R^2决定系数
from sklearn.metrics import r2_score
2、分类指标概念:关心少量样本的那个类别(一般设置为正例,值为1)
2.1、混淆矩阵
- 真正例:True Positive
- 假正例:False Positive
- 真负例:True Negitive
- 假负例:False Negitive
confusion_matrix(y_true, y_pred, labels=None, sample_weight=None):通过计算混淆矩阵来评估分类的准确性 返回混淆矩阵
from sklearn.metrics import confusion_matrix
计算鸢尾花逻辑回归预测的结果
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 15
iris=load_iris()
X,y=iris.data,iris.target
X=X[y!=0,2:]
y=y[y!=0]
y[y==1]=0
y[y==2]=1
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=2)
lr=LogisticRegression()
lr.fit(X_train,y_train)
y_hat=lr.predict(X_test)
计算混淆矩阵结果
s=confusion_matrix(y_true=y_test,y_pred=y_hat)
print(s)
结果
[[14 2]
[ 2 7]]
2.2、正确率:样本不均衡有局限
accuracy
样本不均衡时有局限性:都判断为数量多的那一类,结果正确率也很高
2.3、精准率:预测为真正例在预测为正例的占比,看预测准不准
precision
判断的结果为正例中,有多少是真正例
缺点:预测的结果只有1例正例,并且是正确的,精准率为100%。实际有很多预测错误的负例,即真实的正例
场景:预测股票会涨,真实涨了10次,只预测到2次会涨,预测这两次都对了,那么就是我想要的精准度高,此时召回率不重要
2.4、召回率:预测为真正例在所有真实正例的占比
recall
真实的正例中,预测正确的正例有多少。
缺陷:都预测为正例,那么会覆盖真实的正例,召回率为100%
场景:抓坏人,坏人为正例,好人为负例。要的结果是宁可抓错不能放过。
思路:真实的类别中要判断的对的越多越好,即判断对的在真实类别的占比越多越好,召回率高
精准率不关注,即使预测错了他其实是个好人也没事
2.5、调和平均值F1:综合精准率和召回率
3、分类指标代码※
- 方法1,使用各自函数
from sklearn.metrics import accuracy_score #正确率
from sklearn.metrics import precision_score #精准率
from sklearn.metrics import recall_score #召回率
from sklearn.metrics import f1_score #调和平均值F1
#默认1类别为正例,可通过pos_label参数指定
print('正确率',accuracy_score(y_test,y_hat))
print('精准率',precision_score(y_test,y_hat))
print('召回率',recall_score(y_test,y_hat))
print('调和平均值F1',f1_score(y_test,y_hat))
结果
正确率 0.84
精准率 0.7777777777777778
召回率 0.7777777777777778
调和平均值F1 0.7777777777777778
另外,也可以调用逻辑回归模型对象的score方法,获取正确率
score方法与f1_score方法参数不同
print('逻辑回归调用score方法计算正确率',lr.score(X_test,y_test))
结果
逻辑回归调用score方法计算正确率 0.84
- 方法2:使用classification_report函数
from sklearn.metrics import classification_report
print(classification_report(y_true=y_test,y_pred=y_hat))
结果
precision recall f1-score support
0 0.88 0.88 0.88 16
1 0.78 0.78 0.78 9
avg / total 0.84 0.84 0.84 25
4、ROC曲线
- 概念:ROC(Receiver Operating Characteristic——受试者工作特征曲线),使用图形来描述二分类模型的性能表现。
- TPR:True Positive Rate真正例率,模型预测为真的正例在真实正例的占比=召回率
- FPR:False Positive Rate假正例率,模型预测为假的正例在真实负例的占比
纵轴为TPR,横轴为假正例率
- 特征:
- 通过调整判断分类的阈值(逻辑回归默认阈值0.5),TPR和FPR随之改变,进而在ROC曲线坐标上形成多个点,反应模型分类效果
- TPR增长越快,曲线越凸,模型的分类性能越好,即预测为正确的正例越多
- ROC曲线比过(0,0)(1,1)这两个点。原因:逻辑回归模型默认阈值为0.5,sigmoid()结果即类别概率p默认≥0.5时,模型预测为类别1(正例)。那么修改阈值为0时,p≥0模型预测为类别1(正例),说明该模型该阈值下会将所有数据均预测为类别1(无论对错),此时FN=TN=0个,TPR=FPR=1
- 修改阈值为1时,p≥1模型预测为类别1(正例),p是不可能大于100%的,说明该模型该阈值下会将所有数据均预测为类别0(无论对错),此时FP=TP=0个,TPR=FPR=0
5、AUC:ROC曲线的面积
AUC(Area Under the Curve):ROC曲线下面积,使用AUC值作为评价标准是因为有时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而AUC作为数值可以直观的评价分类器的好坏,值越大越好。
6、ROC及AUC代码实现
6.1、代码实现
- 准备数据及模型预测结果
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
plt.rcParams['font.family']= 'simHei' #用来设置字体,正常显示正文
plt.rcParams['axes.unicode_minus'] = False #用来显示负号
plt.rcParams['font.size'] = 16 #设置字体的大小
iris=load_iris()
X,y=iris.data,iris.target
#暂时使用2个花瓣特征和2个类别进行计算
X=X[y != 0 , 2: ]
y=y[y != 0]
y[y==1]=0
y[y==2]=1
#拆分数据集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=2)
lr=LogisticRegression()
#训练模型
lr.fit(X_train,y_train)
#通过模型预测结果
y_hat=lr.predict(X_test)
probability=lr.predict_proba(X_test)
- ROC曲线
roc_curve函数的阈值是返回值,根据提供的模型预测正例概率反推出来的
roc_curve返回三个值,分别是fpr、tpr和阈值;常用三个参数,真实的类别、模型预测为类别1的概率、pos_label=1设置类别1为正例
#ROC曲线
from sklearn.metrics import roc_curve
#AUC:auc和roc_auc_score都可以得出结果,所需参数不同
from sklearn.metrics import auc,roc_auc_score
#roc_curve返回三个值,分别是fpr、tpr和阈值;常用三个参数,真实的类别、模型预测为类别1的概率、pos_label=1设置类别1为正例
fpr,tpr,thresholds = roc_curve(y_test,probability[:,1],pos_label=1)
print('fpr值:',fpr)
print('tpr值:',tpr)
print('thresholds值:',thresholds)
#auc函数参数为fpr、tpr
print('AUC面积值:',auc(fpr,tpr))
#roc_auc_score函数参数为真实类别、模型预测为类别1的概率
print('AUC面积得分:',roc_auc_score(y_true=y_test,y_score=probability[:,1]))
结果
fpr值: [0. 0. 0. 0.0625 0.0625 0.125 0.125 0.25 0.3125 0.4375 0.6875 0.8125 1. ]
tpr值: [0. 0.11111111 0.55555556 0.55555556 0.88888889 0.88888889
1. 1. 1. 1. 1. 1.
1. ]
thresholds值: [1.89281389 0.89281389 0.68321182 0.57414373 0.50124062 0.40461479
0.27410305 0.24775845 0.23340897 0.19711588 0.06923229 0.04279423
0.00652175]
AUC面积值: 0.9652777777777778
AUC面积得分: 0.9652777777777778
6.2、绘图ROC曲线
plt.plot(fpr,tpr,marker='o',label='ROC曲线')
plt.plot([0,0,1],[0,1,1],ls='--',label='完美预测')
plt.legend()
plt.show()
汇总指标:
https://www.cnblogs.com/mdevelopment/p/9456486.html