数据科学 - 模型检验

1. 前言

模型检验是数据科学项目中至关重要的步骤,确保模型的质量,可靠性和实用性。

模型检验的主要目的是评估模型的性能,验证其在实际应用中的效果,以及防止模型出现过拟合,欠拟合或其他潜在问题。

在日常学习工作中,我们常常使用sklearn中的metrics包,富含了许多模型检验函数。

#安装方式1:命令行与终端安装
pip install -U scikit-learn

#安装方式2:基于Anaconda环境
conda install scikit-learn
from sklearn.metrics import ###

2. 分类模型

2.1 评价指标

精准率(Accuracy)

正确分类样本数量与总样本数量的百分比

accuracy_score(y_true,y_pred)

精确率(Precision)

正确预测为正类的样本数占所有预测为正类的样本数的比例

•适用场景:任务关注的是预测为正类的样本是否真的为正类时

precision_score(y_true,y_pred,average='None/macro/micro/weighted')
参数用途适用场景
binary适用于二分类问题,只会计算正类(通常标签为1)的精确率二分类问题
micro计算全局精确率,所有类别加总进行计算多分类问题
macro计算每个类别的Precision,然后取平均每个类别给予相同的权重
weighted计算每个类别精确率,按照各个类别样本数量进行加权平均类别样本数量不平衡时
samples计算每个样本的精确率,然后对所有样本取平均多标签分类问题,其中每个样本可以同时属于多个类别

召回率(Recall)

正确预测为正类的样本占所有实际为正类的样本数的比例

•适用场景:关注的是所有正类样本是否被找出来时

recall_socre(y_true,y_pred,average='binary')

参数同precision

F1-score

2 * Recall*Precision / (Recall+Precision)

•适用场景:平衡Precision与Recall,尤其是样本类别分布不均时适用。

f1_score(y_true,y_pred,average='binary')

分类报告

生成包含精确率,召回率,F1-score和支持度的分类报告。

from sklearn.metrics import classification_report
classification_report(y_true,y_pred)

2.2 ROC曲线

roc曲线横坐标与纵坐标也是两个评价指标,在每个阈值的情况下,模型指标数值也会随之改变,依次描点得来。

横坐标:FPR = FP / (FP+TN)表示为实际为负类样本中,被错误预测为正类的比例

纵坐标:Recall - 正确预测为正类的样本占所有实际为正类的样本数的比例

换个理解方式,横坐标向右移动,代表模型预测负类样本错误率就越高

纵坐标向上移动,模型预测正类样本的正确率就越高

所以根据ROC曲线,越靠近(0,1)的点,模型预测效果就越好。

from sklearn.metrics import roc_curve,roc_auc_score
fpr,tpr,thresholds = roc_curve(y_true,y_proba)

注意:此处所填充数据不是y_pred,而是y_proba预测概率,以此确定在不同阈值下模型的分类效果

model.predict_proba(X_test)
y_proba = model.predict_proba(X_test)[:,1]
#返回一个二维数组,例如[0.7,0.3];表示70%概率属于第一个类别(0,负类),30%概率为正类(1)
#清洗数据时一般默认0为负类,1为正类
import matplotlib.pyplot as plt
plt.figure()
plt.plot(fpr,tpr,color='blue')
plt.plot([0,1],[0,1],'--',color='red')
plt.plot(best_fpr,best_tpr,marker='o',markersize=8,color='black')
plt.text(best_fpr,best_tpr+0.1,'best threshold')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.title('ROC curve')

基于最靠近(0,1)的点选择最佳阈值: 

AUC

表示ROC曲线与坐标轴之间的面积,面积越大,说明该模型预测效果越好

from sklearn.metrics import roc_auc_socre
roc_auc_score(y_true,y_proba)

 更深入了解请参考:超简单白话文机器学习 - 模型检验与评估(含算法介绍,公式,源代码实现以及调包实现)_机器学习模型检验-CSDN博客

2.3 混淆矩阵

混淆矩阵是一种用于评估分类模型性能的工具,特别是在二分类问题中。直观展示模型在不同类别上的预测结果,了解模型分类准确率以及各种类型的错误。

列表示样本实际类别,行表示样本预测类别。

基于预测与真实判断时真假,预测值决定P与N。

实际|预测预测为负 Negative预测为正 Positive
实际为负 NegativeTNFP
实际为正 PositiveFNTP
form sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_true,y_pred)

这样生成出来的混淆矩阵较为简陋,数据分析有时需要让数据更加直观,可视图更加直观

seaborn

import seaborn as ins
sns.heatmap(cm,annot=True,fmt='d',cmap='YlGnBu',cbar=True)
#annot指定在图中是否显示数值
#fmt数值显示类型 .2f显示小数
#cmap配色方案,例如'Viridis','coolwarm','Blues'
#cbar是否显示颜色条

ConfusionMatrixDisplay

from sklearn.metrics import ConfusionMatrixDisplay
CM = ConfusionMatrixDisplay(cm)
CM.plot(cmap='')

也可以直接从模型中生成混淆矩阵

ConfusionMatrixDisplay.from_estimator(model,X_test,y_test,cmap='Blues')
plt.show()

3. 回归模型

3.1 评价指标

指标函数用途
均方误差(MSE)mean_squared_error(y_true,y_pred,squared=True)计算模型均方误差,预测值与实际值之间的误差;squared=False时计算RMSE(MSE取平方根)
平均绝对误差(MAE)mean_absolute_error(y_true,y_pred)计算模型的平均绝对误差
中位数绝对误差median_absolute_error(y_true,y_pred)计算模型中位数绝对误差

3.2 系数

R²(决定系数)

决定系数(Coefficient of Determination),通常表示为 R²,是一种用于评估回归模型拟合优度的统计指标。它表示因变量的变异性能够由模型解释的比例,即模型对数据的拟合程度。

R² 的取值范围在 0 到 1 之间。一个较高的 R² 值表示模型能够较好地解释因变量的变异性,即模型的拟合程度较好。

计算方式如下:

其中SSres表示预测值与实际值之间差异的平方和(越小越好),模型无法解释的因变量的剩余变异性,即模型无法完全拟合的部分; 1 - SSres则表示模型可以解释的部分: 

 

SStot表示实际值与均值之间差异的平方和,其意义在于没有考虑任何自变量的情况下,因变量的总变异性: 

 

R² 只能衡量模型对因变量的拟合优度,但不能判断模型是否具有因果关系、是否过拟合或是否适合应用于其他数据集。 

from sklearn.metrics import r2_score
r2 = r2_score(y_true,y_predict)

#或者使用model.score方法
r2_alternative = model.score(X_test,y_test)

4. 参考资料:

超简单白话文机器学习 - 模型检验与评估(含算法介绍,公式,源代码实现以及调包实现)_机器学习模型检验-CSDN博客

均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、决定系数(R²)解释-CSDN博客

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值