赞
踩
评估机器学习模型性能
的常用技术和方法,其目的是通过将数据集分成K个子集(或“折”),来
估计
模型在独立数据上的预测能力,以此来
减少
因模型
过拟合训练数据
而导致的评估偏差。下面是K折交叉验证的基本步骤和原理:
数据分割:首先,将原始数据集随机均匀地分割成K个不重叠的子集
(或“fold”)。每个子集应尽可能保持数据分布的一致性,特别是当类别标签存在时,要保证各个类别在不同子集中比例相近,这可以通过分层抽样实现。
循环训练与验证:接下来,进行K轮迭代。在每一轮中:
验证集
(validation set)。训练集
(training set)。结果汇总:完成K轮迭代后,将每轮验证集上的评估结果(如预测误差)平均起来,得到一个单一的评估指标,作为模型性能的综合估计。这一步骤考虑到了模型在不同数据子集上的表现,提高了评估的稳定性和可靠性。
减小
由于数据划分随机性导致的评估偏差,同时提供了模型性能的一致性估计。选择最佳模型
;也适用于超参数调优
,找到使模型性能最优的参数组合。泛化
能力,降低过拟合风险。
更稳定
的模型性能估计,但训练时间也会相应增加。较小的K值(如K=2,称为两重交叉验证或简单交叉验证)可能导致较大的方差。实践中,K=5或K=10是常见的选择。
当然,让我们通过一个具体的例子来理解K折交叉验证的过程。假设我们有一个包含100条记录的数据集,我们要使用K折交叉验证(这里取K=5)来评估一个线性回归模型的性能。
数据准备:首先,将数据集按行编号为1到100。
数据分割:将这100条记录均匀分成5个子集(每个子集20条记录)。
开始验证:
选取子集1作为验证集,子集2到5作为训练集。
使用这80条记录训练模型,然后用子集1(20条记录)评估模型性能,记录下该轮的评估指标(比如均方误差MSE)。选取子集2作为验证集,子集1、3、4、5作为训练集。
同样,训练模型并评估性能。重复
以上步骤,直到每个子集都被用作验证集一次。
结果整合:在五轮结束后,我们将得到五次评估的结果。为了得到一个综合的性能指标,我们通常会计算这些结果的平均值
(如果评估的是误差,则取平均误差;如果是准确率,则取平均准确率)。
from sklearn.model_selection import KFold from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression from sklearn.metrics import mean_squared_error # 生成示例数据集 X, y = make_regression(n_samples=100, n_features=10, noise=0.1) # 初始化线性回归模型 model = LinearRegression() # 初始化5折交叉验证 kf = KFold(n_splits=5, shuffle=True, random_state=42) mse_scores = [] # 进行K折交叉验证 for train_index, test_index in kf.split(X): # 分割数据 X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] # 训练模型 model.fit(X_train, y_train) # 预测并计算均方误差 y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) mse_scores.append(mse) # 输出平均均方误差 print("Average Mean Squared Error:", sum(mse_scores)/len(mse_scores))
这段代码首先生成了一个具有100个样本的回归问题数据集,然后定义了一个线性回归模型,并使用5折交叉验证来评估模型的性能,输出所有轮次的平均均方误差。这样,我们就可以基于这个综合指标来判断模型在未知数据上的预测能力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。