如何获取GridSearchCV过程中的预测值并实现可视化与保存?
获取GridSearchCV过程中的预测值并可视化
当然可以拿到网格搜索过程里的预测值!下面分两种常见场景给你解决方案,附带代码示例帮你把数据整理成pandas DataFrame,还能直接用来绘图对比真实值和预测值:
场景1:只想拿最佳参数模型的交叉验证预测值
如果你只关心最终选出来的最优模型,在交叉验证阶段对验证集的预测结果,那这个方法最省心:
首先,确保你初始化GridSearchCV时没改refit=True(这是默认设置,所以一般不用特意调整)。拟合完成后,我们可以用cross_val_predict配合最佳估计器,直接拿到交叉验证每个折里验证样本的预测值:
from sklearn.model_selection import cross_val_predict import pandas as pd import matplotlib.pyplot as plt # 假设你已经完成了网格搜索拟合:grid.fit(X_train, y_train) best_model = grid.best_estimator_ # 获取交叉验证中每个训练样本的预测值(对应它被分到验证折时的预测结果) y_pred_cv = cross_val_predict(best_model, X_train, y_train, cv=grid.cv) # 把真实值和预测值整理成DataFrame cv_results_df = pd.DataFrame({ '真实y值': y_train.values, # 如果y_train是Series可直接用y_train '交叉验证预测y值': y_pred_cv }) # 绘图对比 plt.figure(figsize=(8,6)) plt.scatter(cv_results_df['真实y值'], cv_results_df['交叉验证预测y值'], alpha=0.6) plt.xlabel('真实y值') plt.ylabel('预测y值') plt.title('交叉验证:真实值VS预测值') # 画一条理想对角线(预测完全准确的情况) plt.plot([y_train.min(), y_train.max()], [y_train.min(), y_train.max()], 'r--', lw=2) plt.show() # 保存结果到CSV cv_results_df.to_csv('最佳模型交叉验证预测结果.csv', index=False)
场景2:想拿到所有参数组合的交叉验证预测值
如果你要对比不同参数组合的预测效果,或者需要完整的网格搜索过程数据,那得手动遍历参数组合并跑交叉验证:
from sklearn.model_selection import KFold from sklearn.pipeline import Pipeline # 假设你的参数网格是param_grid,模型是比如RandomForestRegressor(替换成你的模型) from sklearn.ensemble import RandomForestRegressor # 初始化和网格搜索一致的交叉验证拆分器 kf = KFold(n_splits=grid.cv, shuffle=True, random_state=42) # 如果用了其他拆分器比如StratifiedKFold就对应调整 all_pred_results = [] # 遍历每个参数组合 for params in param_grid: # 构建你的模型流水线(比如包含StandardScaler预处理) model_pipeline = Pipeline([ ('scaler', StandardScaler()), ('estimator', RandomForestRegressor(**params)) ]) fold_true = [] fold_pred = [] # 跑交叉验证每个折 for train_idx, val_idx in kf.split(X_train): X_tr, X_val = X_train.iloc[train_idx], X_train.iloc[val_idx] y_tr, y_val = y_train.iloc[train_idx], y_train.iloc[val_idx] model_pipeline.fit(X_tr, y_tr) y_pred_val = model_pipeline.predict(X_val) fold_true.extend(y_val.values) fold_pred.extend(y_pred_val) # 整理成DataFrame,同时带上当前参数信息 result_row = pd.DataFrame({ '真实y值': fold_true, '预测y值': fold_pred }) # 把参数作为列添加进去,方便后续筛选 for param_name, param_val in params.items(): result_row[param_name] = param_val all_pred_results.append(result_row) # 合并所有参数组合的结果 full_results_df = pd.concat(all_pred_results, ignore_index=True) # 保存完整结果 full_results_df.to_csv('全参数网格搜索预测结果.csv', index=False) # 示例:筛选最佳参数的结果来绘图 best_params = grid.best_params_ # 匹配所有参数列等于最佳参数的行 best_result_df = full_results_df[(full_results_df[list(best_params.keys())] == pd.Series(best_params)).all(axis=1)] plt.figure(figsize=(8,6)) plt.scatter(best_result_df['真实y值'], best_result_df['预测y值'], alpha=0.6) plt.xlabel('真实y值') plt.ylabel('预测y值') plt.title(f'最佳参数{best_params}:真实值VS预测值') plt.plot([y_train.min(), y_train.max()], [y_train.min(), y_train.max()], 'r--', lw=2) plt.show()
注意事项
- 别混淆
grid.predict(X_val)和交叉验证预测值:grid.predict(X_val)是用整个训练集训练的最佳模型对X_val做预测,而交叉验证预测值是模型在仅用训练折数据训练后对验证折的预测,两者结果会有差异。 - 如果你的数据是分类任务,把
predict换成predict_proba可以拿到概率值,绘图时可以用直方图或者ROC曲线来对比。
内容的提问来源于stack exchange,提问作者tmn103
相关产品推荐
相关产品推荐

