You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:23:29