引言
之前我们介绍了机器学习的一些基础性工作,介绍了如何对数据进行预处理,接下来我们可以根据这些数据以及我们的研究目标建立模型。那么如何选择合适的模型呢?首先需要对这些模型的效果进行评估。本文介绍如何使用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−yi)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−yi)2
- r2: R2=ESSTSSR