GridSearchCV默认3折交叉验证,如何配置80-20留出验证?
当然可以!
GridSearchCV的cv参数其实非常灵活,默认的3折只是最基础的用法——你完全可以通过传入自定义的交叉验证生成器来实现80-20划分的留出验证方案。
最常用的两种实现方式:
ShuffleSplit:适合回归任务或不关注类别分布的分类任务,它会随机打乱数据后按指定比例划分训练集和验证集,你可以自由设置划分比例和重复验证的次数。StratifiedShuffleSplit:专为分类任务设计,它会保持每个类别在训练集和验证集中的占比一致,避免随机划分导致的类别失衡问题。
给你一个具体的代码示例:
from sklearn.model_selection import GridSearchCV, StratifiedShuffleSplit from sklearn.svm import SVC import numpy as np # 模拟特征数据和标签 X = np.random.rand(100, 5) y = np.random.randint(0, 2, 100) # 定义80-20划分的留出验证生成器,重复5次验证(也可以只做1次) cv = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=42) # 待搜索的参数网格 param_grid = {'C': [0.1, 1, 10], 'gamma': [1, 0.1, 0.01]} # 初始化GridSearchCV,传入自定义的cv生成器 grid_search = GridSearchCV(estimator=SVC(), param_grid=param_grid, cv=cv) # 执行网格搜索 grid_search.fit(X, y) # 查看结果 print("最佳参数组合:", grid_search.best_params_) print("平均最佳验证得分:", grid_search.best_score_)
如果是回归任务,只需要把StratifiedShuffleSplit替换成ShuffleSplit即可,用法几乎完全一致。
要是你只需要单次的80-20划分(不需要重复验证),直接把n_splits设为1就行:
cv = ShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
这种方式既满足了你想要的留出验证逻辑,又能借助GridSearchCV的自动参数搜索能力,不用自己手动拆分数据写循环,非常方便~
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

