Python数据分析从入门到进阶:模型评估和选择(含详细代码)

本文详细介绍了Python数据分析中的模型评估流程,包括数据集划分、交叉验证、回归模型评估指标、分类模型评估指标如混淆矩阵、ROC和AUC。通过实例展示了如何使用代码进行模型效果分析,并探讨了不同评估指标的含义与应用场景。
摘要由CSDN通过智能技术生成

引言

之前我们介绍了机器学习的一些基础性工作,介绍了如何对数据进行预处理,接下来我们可以根据这些数据以及我们的研究目标建立模型。那么如何选择合适的模型呢?首先需要对这些模型的效果进行评估。本文介绍如何使用sklearn代码进行模型评估

模型评估 对模型评估的基本步骤如下:

  • 首先将要将数据集分为训练集和测试集
  • 对训练集进行模型拟合
  • 确定合适的评估指标
  • 计算在测试集上的评估指标

💮1 数据集划分

在机器学习问题中,从理论上我们需要对数据集划分为训练集、验证集、测试集。

  • 训练集:拟合模型(平常的作业和测试)
  • 验证集:计算验证集误差,选择模型(模拟考)
  • 测试集:评估模型(最终考试) 但是在实际应用中,一般分为训练集和测试集两个。其中训练集:70%,测试集:30%.这个比例在深度学习中可以进行相应的调整。 我们可以使用sklearn中的train_test_split划分数据集
# 导入相关库
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import metrics
from sklearn.model_selection import KFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import pandas as pd

# 导入数据
df = pd.read_csv(r'C:\Users\DELL\data-science-learning\seaborn-data\iris.csv')
df.shape

(150, 5)

# 划分数据集和测试集
train_set, test_set = train_test_split(df, test_size=0.3,
random_state=12345)

train_set.shape, test_set.shape

((105, 5), (45, 5))

可以看出此时训练集只有105个数据,测试集有45个数据。

🏵️2.交叉验证模型

评估模型时,我们最常用的方法之一就是交叉验证,具体原理看看我这篇文章统计学习导论(ISLR)(五):重采样方法(交叉验证和bootstrap),下面以一个具体案例来看如何实现,代码如下

# 加载数据
digits = datasets.load_digits()

# 创建特征矩阵
features = digits.data
target = digits.target

# 进行标准化
stand = StandardScaler()

# 创建logistic回归器
logistic = LogisticRegression()

# 创建一个包含数据标准化和逻辑回归的流水线
pipline = make_pipeline(stand, logistic)# 先对数据进行标准化,再用logistic回归拟合

# 创建k折交叉验证对象
kf = KFold(n_splits=10, shuffle=True, random_state=1)

使用shuffle打乱数据,保证我们验证集和训练集是独立同分布的(IID)的

# 进行k折交叉验证
cv_results = cross_val_score(pipline,
                            features,
                            target,
                            cv=kf,
                            scoring='accuracy',#评估的指标
                            n_jobs=-1)#调用所有的cpu

cv_results.mean()

0.9693916821849783

使用pipeline方法可以使得我们这个过程很方便,上述我们是直接对数据集进行了交叉验证,在实际应用中,建议先对数据集进行划分,再对训练集使用交叉验证。

from sklearn.model_selection import train_test_split

# 划分数据集
features_train, features_test, target_train, target_test = train_test_split(features, 
                                                                            target,
                                                                            test_size=0.1,random_state=1)

# 使用训练集来计算标准化参数
stand.fit(features_train)

StandardScaler()

# 然后在训练集和测试集上运用
features_train_std = stand.transform(features_train)
features_test_std = stand.transform(features_test)

这里之所以这样处理是因为我们的测试集是未知数据,如果使用测试集和训练集一起训练预处理器的话,测试集的信息有一部分就会泄露,因此是不科学的。在这里我认为更general的做法是先将训练集训练模型,用验证集评估选择模型,最后再用训练集和验证集一起来训练选择好的模型,再来在测试集上进行测试。

pipeline = make_pipeline(stand, logistic)

cv_results = cross_val_score(pipline,
                            features_train_std,
                            target_train,
                            cv=kf,
                            scoring='accuracy',
                            n_jobs=-1)

cv_results.mean()

0.9635112338010889

🌹3.回归模型评估指标

评估回归模型的主要指标有以下几个

  • MAE:平均绝对误差: MAE=1m∑i=1N∣yi−yi∣MAE=\frac{1}{m}\sum_{i=1}{N}|y_i-\hat{y}_i|MAE=m1​∑i=1N​∣yi​−y^​i​∣
  • MSE:均方误差: MSE=1m∑i=1N(yi−yi)2MSE=\frac{1}{m}\sum_{i=1}{N}(y_i-\hat{y}_i)2MSE=m1​∑i=1N​(yi​−y​i​)2
  • RMSE: RMSE=1m∑i=1N(yi−yi)2RMSE=\sqrt{\frac{1}{m}\sum_{i=1}{N}(y_i-\hat{y}_i)2}RMSE=m1​∑i=1N​(yi​−y​i​)2​
  • r2: R2=ESSTSSR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值