交叉验证 cross validation 与 K-fold Cross Validation K折叠验证

交叉验证是机器学习中验证模型稳定性的重要手段,它通过将数据集分成训练集和验证集来评估模型。K折交叉验证是一种常见方法,将数据分为K个部分,每次用K-1部分训练模型,剩余部分验证,循环进行。在实际操作中,尤其在类别不平衡的问题中,需确保每个折叠中类别的分布接近原始数据,以增强模型的泛化能力和鲁棒性。

在这里插入图片描述
交叉验证,cross validation是机器学习中非常常见的验证模型鲁棒性的方法。其最主要原理是将数据集的一部分分离出来作为验证集,剩余的用于模型的训练,称为训练集。模型通过训练集来最优化其内部参数权重,再在验证集上检验其表现。

比较常见的交叉验证方法K折叠交叉验证,(K-fold Cross Validation)如下图所示,我们将数据分为K个部分,其中K-1个部分作为训练集,剩余的作为验证集。每个epoch循环,都选取不一样的一个部分作为验证集。

在这里插入图片描述
在使用K折叠或者别的交叉验证的方法时,我们需要注意的是,在很多问题中,类与类在数据集中的分布不一定是均匀的。因此,我们往往需要在折叠的过程中使得每个fold都有着相同或至少近似的类的分布。

例如在下列性别二分类问题中,原始数据中女性与男性的样本数量如下。那么我们在划分K折叠的时候,也要将这个分布情况在每个折叠上还原,即保证在每个折叠上女性与男性的样本数量的比例与整体数据的比例是一致的。如果没有满足这个条件,在上述例子中,很可能出现训练时模型过多得受到了了男性样本得影响,而导致其在女性样本为主的验证集上表现很差。因此,保证K折叠每一个部分的类分布是均匀的,也能在一定程度上提升训练后模型的鲁棒性。
在这里插入图片描述

在这里插入图片描述

### 使用K折交叉验证训练人工神经网络 为了提高模型泛化能力并减少过拟合风险,可以采用 K 折交叉验证方法来评估优化 ANN 的性能。具体实现方式如下: 首先定义数据集划分函数 `cross_validation_split` 来创建 k 份互斥的数据子集。 ```python from sklearn.model_selection import KFold def create_k_folds(data, labels, n_splits=5): kf = KFold(n_splits=n_splits, shuffle=True, random_state=42) folds = [] for train_index, val_index in kf.split(data): x_train_fold, x_val_fold = data[train_index], data[val_index] y_train_fold, y_val_fold = labels[train_index], labels[val_index] folds.append(((x_train_fold, y_train_fold), (x_val_fold, y_val_fold))) return folds ``` 接着编写循环结构遍历每一轮次的训练过程,在每次迭代中重新编译模型以确保初始状态一致,并记录各轮的表现指标。 ```python import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 假设已经准备好预处理后的特征矩阵 X 标签向量 Y folds = create_k_folds(X, Y) scores = [] for fold_idx, ((x_train_fold, y_train_fold), (x_val_fold, y_val_fold)) in enumerate(folds): print(f'Processing Fold {fold_idx + 1}') # 构建简单的全连接前馈神经网络架构 model = Sequential([ Dense(64, activation='relu', input_shape=(input_dim,)), Dense(32, activation='relu'), Dense(output_units) # 输出单元数量取决于任务需求 ]) # 编译配置损失函数、优化器以及评价标准 model.compile(optimizer='adam', loss='mse', metrics=['mae']) # 执行单个折叠上的训练操作 history = model.fit( x=x_train_fold, y=y_train_fold, epochs=20, batch_size=512, validation_data=(x_val_fold, y_val_fold), verbose=1 ) score = model.evaluate(x_val_fold, y_val_fold, verbose=0)[1] scores.append(score) average_mae = np.mean(scores) print('Average MAE across all folds:', average_mae) ``` 上述代码展示了完整的基于 K 折交叉验证的人工神经网络训练流程[^1]。通过这种方式可以在不同分割下多次测试模型表现,从而获得更稳定可靠的估计结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值