Python 中的留一交叉验证(带有示例)
为了评估模型在数据集上的性能,我们需要衡量模型做出的预测与观察到的数据的匹配程度。
执行此操作的常用方法称为留一交叉验证 (LOOCV) ,它使用以下方法:
1.将数据集分为训练集和测试集,使用除一个观测值之外的所有观测值作为训练集的一部分。
2.仅使用训练集中的数据创建模型。
3.使用模型预测从模型中排除的观测值的响应值并计算均方误差 (MSE)。
4.重复此过程n次。将测试 MSE 计算为所有测试 MSE 的平均值。
本教程提供了如何在 Python 中为给定模型运行 LOOCV 的分步示例。
第 1 步:加载必要的库
首先,我们将加载此示例所需的函数和库:
from sklearn. model_selection import train_test_split
from sklearn. model_selection import LeaveOneOut
from sklearn. model_selection import cross_val_score
from sklearn. linear_model import LinearRegression
from numpy import means
from numpy import absolute
from numpy import sqrt
import pandas as pd
第 2 步:创建数据
接下来,我们将创建一个 pandas DataFrame,其中包含两个预测变量x1和x2以及一个响应变量 y。
df = pd.DataFrame({' y ': [6, 8, 12, 14, 14, 15, 17, 22, 24, 23],
' x1 ': [2, 5, 4, 3, 4, 6, 7, 5, 8, 9],
' x2 ': [14, 12, 12, 13, 7, 8, 7, 4, 6, 5]})
第 3 步:执行留一法交叉验证
接下来,我们将对数据集拟合 多元线性回归模型,并执行 LOOCV 来评估模型的性能。
#define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']
#define cross-validation method to use
cv = LeaveOneOut()
#build multiple linear regression model
model = LinearRegression()
#use LOOCV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_absolute_error ',
cv=cv, n_jobs=-1)
#view mean absolute error
mean(absolute(scores))
3.1461548083469726
从结果中我们可以看到平均绝对误差 (MAE) 为3.146 。即模型预测与实际观测数据之间的平均绝对误差为3.146。
一般来说,MAE 越低,模型预测实际观测值的能力就越好。
评估模型性能的另一个常用指标是均方根误差 (RMSE)。以下代码显示了如何使用 LOOCV 计算此指标:
#define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']
#define cross-validation method to use
cv = LeaveOneOut()
#build multiple linear regression model
model = LinearRegression()
#use LOOCV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_squared_error ',
cv=cv, n_jobs=-1)
#view RMSE
sqrt(mean(absolute(scores)))
3.619456476385567
从结果中我们可以看到均方根误差(RMSE)为3.619 。 RMSE 越低,模型预测实际观测值的能力就越好。
在实践中,我们通常会拟合几个不同的模型,并比较每个模型的 RMSE 或 MAE,以确定哪个模型产生最低的测试错误率,因此是最好使用的模型。