代码改变世界

交叉验证和网格搜索---入门 - 实践

2026-01-01 15:29  tlnshuju  阅读(0)  评论(0)    收藏  举报

交叉验证(Cross-Validation)

交叉验证是一种评估机器学习模型性能的统计方法,凭借将资料集划分为多个子集,轮流采用部分子集作为训练集和验证集,以减少过拟合风险并更准确地评估模型泛化能力。

K折交叉验证(K-Fold CV)
将材料集均分为K个子集(称为“折”),每次使用K-1个子集训练模型,剩余1个子集验证,重复K次后取平均性能。典型值为K=5或10。
公式:
$$\text{CV Score} = \frac{1}{K} \sum_{i=1}^{K} \text{Score}_i$$

留一交叉验证(LOOCV)
K折的特殊情况,K等于样本数,每次仅留一个样本作为验证集。计算成本高但适用于小内容集。

分层交叉验证(Stratified CV)
保持每一折中类别比例与原始数据集一致,适用于分类问题中的不平衡数据。

网格搜索(Grid Search)

网格搜索是一种超参数优化方法,通过遍历预定义的参数组合,选择模型性能最佳的超参数配置。

实现步骤

  1. 定义超参数网格:例如学习率[0.01, 0.1]、树深度[3, 5]。
  2. 对每种组合训练模型并评估(通常结合交叉验证)。
  3. 选择验证集上得分最高的参数组合。

示例代码(Scikit-learn)

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
param_grid = {'n_estimators': [50, 100], 'max_depth': [3, 5]}
model = RandomForestClassifier()
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)
best_params = grid_search.best_params_

结合交叉验证的网格搜索

网格搜索常与交叉验证结合(如GridSearchCV),在每一组超参数下通过交叉验证计算平均性能,避免单次数据划分的偏差。

优点

  • 系统性探索参数空间,避免遗漏最优解。
  • 交叉验证提供更稳健的性能评估。

缺点

  • 计算成本随参数数量指数级增长。
  • 需预先定义参数范围,可能错过范围外的优化点。

替代方法如随机搜索(RandomizedSearchCV)或贝叶斯优化可降低计算负担。