如何通过K折交叉验证结合GridSearchCV微调SVM超参数
SVM模型结合GridSearchCV与自定义KFold的实现方案
你实例化的KFold对象可以直接传入GridSearchCV的cv参数,无需手动编写K折遍历逻辑,GridSearchCV会自动基于你指定的拆分规则完成超参数搜索和交叉验证,调整后的代码如下:
import numpy as np from sklearn import svm from sklearn.model_selection import KFold, GridSearchCV from sklearn.metrics import accuracy_score, precision_score, f1_score, recall_score # 原有数据处理逻辑不变 X = Corpus.drop(['text','ManipulativeTag','compound'],axis=1).values # 这里因为适配朴素贝叶斯需求去掉了compund列 y = Corpus['ManipulativeTag'].values # 原有KFold定义不变,复用你设定的拆分规则:5折、打乱、固定随机种子 kf = KFold(n_splits=5, shuffle=True, random_state=1) # 定义SVM基模型 base_svm = svm.SVC(random_state=1111, probability=True) # 定义超参数搜索网格,可根据需求调整参数取值范围 grid_param = { 'C': [0.1, 1, 10, 100], 'kernel': ['linear', 'rbf', 'poly'] } # 初始化GridSearchCV,直接传入自定义的kf作为cv参数 grid_search = GridSearchCV( estimator=base_svm, param_grid=grid_param, # 同时统计你需要的所有评估指标 scoring=['accuracy', 'precision', 'f1', 'recall'], # 最优参数选择基于准确率,可根据需求调整为其他指标 refit='accuracy', cv=kf, n_jobs=-1 ) # 执行超参数搜索,自动完成K折交叉验证 grid_search.fit(X, y) # 获取最优超参数 print("最优超参数:", grid_search.best_params_) # 获取训练完成的最优SVM模型 best_svm = grid_search.best_estimator_ # 查看各折的各指标得分,和你原有手动统计的结果逻辑完全一致 cv_results = grid_search.cv_results_ for i in range(5): print(f"第{i}折准确率:", cv_results[f'split{i}_test_accuracy'][grid_search.best_index_]) print(f"第{i}折精确率:", cv_results[f'split{i}_test_precision'][grid_search.best_index_]) print(f"第{i}折F1值:", cv_results[f'split{i}_test_f1'][grid_search.best_index_]) print(f"第{i}折召回率:", cv_results[f'split{i}_test_recall'][grid_search.best_index_])
关键改动说明
- 无需保留原有手动遍历KFold拆分的循环逻辑,
GridSearchCV内置了交叉验证流程,会自动复用你定义的kf的拆分规则 scoring参数支持传入多指标列表,你不需要手动计算每个折的评估得分,所有结果会保存在cv_results_属性中refit参数指定了用哪个指标选择最优超参数,选择完成后会自动用全量数据重新训练最优模型
内容的提问来源于stack exchange,提问作者deLaJU
相关产品推荐
相关产品推荐

