正在加载中...

展开本页目录
算法教程BayesianOptimization-贝叶斯优化

BayesianOptimization-贝叶斯优化

No.138 · 在线教程

BayesianOptimization-贝叶斯优化 的真实核心主要位于:

BayesianOptimization-贝叶斯优化

1. 方法概述

BayesianOptimization-贝叶斯优化 的真实核心主要位于:

  • core/bayes_opt_calculator.py
  • ui/upload_widget.py
  • ui/results_widget.py
  • ui/main_window.py

从代码实现看,这个模块并不是“任意模型 + 任意搜索空间”的通用贝叶斯优化平台,而是一个面向随机森林的超参数搜索器。它只支持两种 estimator:

  • RandomForestClassifier
  • RandomForestRegressor

同时,它还存在显式回退逻辑:

$$ \text{search\_engine}= \begin{cases} \text{BayesSearchCV}, & \text{环境中可导入 } skopt \\ \text{RandomizedSearchCV}, & \text{否则} \end{cases} \tag{1} $$

也就是说,只有在安装了 scikit-optimize 时,它才真正走贝叶斯搜索;否则会自动退化为随机搜索。

设数据集为

$$ \mathcal{D}=\{(x_i,y_i)\}_{i=1}^{N} \tag{2} $$

其中 \(x_i\) 为样本特征,\(y_i\) 为目标值。程序先在训练集上做超参数搜索,再用最优模型在测试集上评估。

2. 数据约束与预处理

2.1 目标列与特征列

上传页面允许用户从下拉框里选择任意一列作为目标列,而不是强制第 1 列。设所选目标列为 \(y\),则特征矩阵为

$$ X=\mathcal{D}\backslash\{y\} \tag{3} $$

与上传页面说明“其余为数值型特征”一致,训练前代码会执行:

$$ X_{\text{num}}=\mathrm{SelectNumeric}(X) \tag{4} $$

也就是只保留数值列。若 X_num 为空,则直接报错终止。

2.2 非数值列不会被编码

这里一个非常重要的实现细节是:代码并不会对类别列做 One-Hot 编码,也不会做缺失值填补。若检测到非数值特征列:

  1. 上传页只弹出“将被自动忽略”的提示;
  2. 真正传给模型训练的仍然只有数值列。

因此该模块接受的是“目标列 + 若干数值特征”的建模口径,而不是通用表格预处理流水线。

2.3 特征工程面板未接入主流程

目录中虽然存在 ui/feature_engineering_panel.py,里面实现了:

  • 缺失值处理
  • One-Hot 编码
  • 标准化 / Min-Max 缩放
  • 多项式特征
  • 方差阈值 / 互信息筛选
  • PCA / Kernel PCA

但当前 main_window.py 实际只挂接了:

  • UploadWidget
  • ResultsWidget

并没有把 FeatureEngineeringPanel 加入运行界面,因此这些特征工程配置不会真实参与当前算法训练。论文说明里不能把它写成已启用功能。

3. 搜索空间与目标函数

3.1 固定搜索空间

真实搜索空间写死在 run() 中,对分类和回归任务都一致。设超参数向量为

$$ \theta=\big(n_{\text{estimators}},d_{\max},s_{\text{split}},s_{\text{leaf}},m_{\text{feat}}\big) \tag{5} $$

则其取值范围为:

  • n_estimators ∈ [50, 300]
  • max_depth ∈ [2, 20]
  • min_samples_split ∈ [2, 10]
  • min_samples_leaf ∈ [1, 5]
  • max_features ∈ {"sqrt", "log2", None}

因此它不是通用搜索器,而是“随机森林 5 个超参数的搜索器”。

3.2 交叉验证目标

对给定超参数 \(\theta\),代码使用交叉验证平均分作为目标值:

$$ f(\theta)=\frac{1}{K}\sum_{k=1}^{K}\mathrm{Score}\big(\mathrm{RF}_{\theta},\mathcal{D}^{(k)}_{\text{train}},\mathcal{D}^{(k)}_{\text{valid}}\big) \tag{6} $$

其中 cv=K 由界面输入。

评分函数按任务固定:

  • 分类:accuracy
  • 回归:neg_mean_squared_error

所以回归任务的交叉验证最优分 best_score_cv 实际处在“负 MSE”刻度上,而不是 RMSE

4. 贝叶斯搜索与随机回退

4.1 BayesSearchCV 路径

_HAS_SKOPT=True 时,代码构造:

  • BayesSearchCV
  • Integer(...)
  • Categorical(...)

并设置:

  • n_iter
  • cv
  • random_state
  • scoring
  • n_jobs=-1

这一路径把“下一组候选参数如何生成”的细节交给 BayesSearchCV 内部完成。就贝叶斯优化的一般形式而言,可以抽象写成

$$ \theta_{t+1}=\arg\max_{\theta\in\Theta} a_t(\theta) \tag{7} $$

其中 \(a_t(\theta)\) 表示由历史试验结果诱导出来的采集准则。但当前仓库代码没有显式展开代理模型、采集函数名称或其具体公式,因此文档不应把这些内部机制写得过细。

4.2 随机回退路径

skopt 不可用时,代码不会报错退出,而是自动切换到:

  • RandomizedSearchCV
  • scipy.stats.randint

其逻辑可写成

$$ \theta^{(t)}\sim p(\Theta) \tag{8} $$

也就是说,每轮从给定参数分布中随机采样一组随机森林超参数,再用交叉验证打分。

4.3 界面层不会单独暴露切换开关

当前界面上没有让用户手动选择“BayesSearchCV / RandomizedSearchCV”的控件。真实搜索方法由运行环境是否安装 skopt 决定,并写入:

  • self.params["search_method"]

最终也会导出到结果文件中。

5. 数据划分与最终评估

5.1 训练 / 测试拆分

超参数搜索之前,代码先执行一次 train_test_split()

$$ \mathcal{D}_{\text{train}}\cup\mathcal{D}_{\text{test}}=\mathcal{D} \tag{9} $$

其中:

  • 测试集比例来自 test_size
  • 分类任务使用 stratify=y
  • 回归任务不分层

超参数搜索只在训练集上进行,测试集仅用于最终评估。

5.2 分类指标

分类任务最终导出:

$$ \mathrm{Accuracy}=\frac{1}{|\mathcal{D}_{\text{test}}|}\sum_i \mathbf{1}(\hat y_i=y_i) \tag{10} $$

并补充:

  • f1_weighted
  • f1_macro

其中:

  • best_score_cv = searcher.best_score_
  • test_score = accuracy

5.3 回归指标

回归任务先计算

$$ \mathrm{MSE}=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat y_i)^2 \tag{11} $$

再得到

$$ \mathrm{RMSE}=\sqrt{\mathrm{MSE}} \tag{12} $$

以及

$$ R^2=1-\frac{\sum_i(y_i-\hat y_i)^2}{\sum_i(y_i-\bar y)^2} \tag{13} $$

这里还有一个实现口径需要特别说明:

  • best_score_cv 为交叉验证 neg_mean_squared_error
  • test_score 被代码写成 -mse
  • rmser2 另外单独导出

因此该模块的“测试集得分”并不是 ,而是负的 MSE。

6. 输出结果与复现

6.1 Excel 工作表

save_to_excel() 实际导出的工作表包括:

  • RawData
  • Processed
  • TestPreds
  • BestParams
  • Metrics
  • Parameters
  • Trials
  • Charts

其中:

  • RawData 是用户上传的完整原始表;
  • Processed 是“目标列 + 数值特征列”的拼接结果;
  • Trials 直接来自 pd.DataFrame(searcher.cv_results_)
  • Charts 保存图表名称与路径。

6.2 分数曲线图

模块不会调用 matplotlib 绘图,而是使用 PIL.Image 手工绘制 score_curve.png。若把第 \(t\) 轮搜索分数记为 \(s_t\),则图中“历史最优曲线”为

$$ b_t=\max_{1\leq r\leq t}s_r \tag{14} $$

图中两条线分别表示:

  • 单轮分数 score
  • 历史最优 best

对于回归任务,这里的 \(s_t\) 仍然是 mean_test_score,也就是负 MSE,而不是 RMSE

6.3 复现脚本

结果页有两套复现导出逻辑:

  1. 计算完成后自动写出 repro_bayesopt.py
  2. 点击“导出复现代码”后额外生成带时间戳的 bayesopt_reproduce_*.py

同时会把输入数据复制到 repro_inputs/ 目录下,供脚本重新加载并复跑 BayesOptCalculator

7. 实现说明与注意事项

根据当前真实代码,论文说明中应明确以下边界:

  1. 这不是任意模型的通用贝叶斯优化框架,而是随机森林专用超参数搜索器。
  2. 真正的贝叶斯搜索只在安装了 scikit-optimize 时成立;否则自动退化为 RandomizedSearchCV
  3. 非数值特征不会被编码,只会被忽略;没有真实接入的缺失值填补、缩放或降维训练流程。
  4. feature_engineering_panel.py 虽然存在,但没有接进主窗口实际流程。
  5. 回归任务中的 best_score_cvtest_score 都不等于 ,而是以负 MSE 为核心分数口径。
  6. 结果文件默认保存到形如 results/BayesianOptimization-贝叶斯优化分析结果_时间戳/bayesopt_results_时间戳.xlsx 的目录结构中。

8. 论文写作模板

8.1 方法描述模板

“本文采用面向随机森林模型的贝叶斯超参数优化方法,在预设搜索空间 \(\Theta\) 内以 \(K\) 折交叉验证分数为目标函数进行迭代寻优,并在独立测试集上对最优参数组合进行泛化性能评估。依据项目实际实现,分类任务在 RandomForestClassifier 上进行搜索,回归任务在 RandomForestRegressor 上进行搜索;当运行环境安装 scikit-optimize 时,搜索器采用 BayesSearchCV,否则自动退化为 RandomizedSearchCV。因此,论文中应同步报告实际运行得到的 search_method、最优参数组合以及交叉验证最优分数口径。”

8.2 结果解释模板

结果部分可写为:最优参数组合在交叉验证阶段取得了较优的 best_score_cv,并在测试集上得到 test_score 及配套指标。对于分类任务,可结合 Accuracy、F1-macro 与 F1-weighted 讨论模型在类别层面的稳定性;对于回归任务,则应明确指出交叉验证优化目标通常为 neg_mean_squared_error,因此 best_score_cv、测试集 RMSE 与 \(R^2\) 分别反映不同评价口径,不能直接混同解释。若历史分数曲线呈现较快收敛,说明搜索过程较早锁定较优参数区域;若后期仍有明显提升,则说明参数空间仍存在可进一步挖掘的高性能区域。

8.3 表格标题模板

  1. 表 1 贝叶斯优化参数空间与搜索控制参数设置表
  2. 表 2 贝叶斯优化最优参数组合结果表
  3. 表 3 交叉验证最优分数与测试集评价指标结果表
  4. 表 4 候选参数组合搜索轨迹与分数汇总表

8.4 图表题注模板

  1. 图 1 贝叶斯优化过程中交叉验证分数与历史最优分数变化曲线。
  2. 图 2 不同候选参数组合的交叉验证分数对比图。
  3. 图 3 最优随机森林模型在测试集上的预测结果对比图。

8.5 表格示例

表 1 贝叶斯优化最优参数与评价指标结果

项目 结果
搜索方法 BayesSearchCV / RandomizedSearchCV
最优参数组合
交叉验证最优分数 best_score_cv
测试集指标 test_score
其他指标

表注:交叉验证最优分数来自 TrialsMetrics 工作表;若为回归任务,应注明 best_score_cv 的统计口径为负误差分数而非 \(R^2\)。

9. 单篇终审补充

9.1 图题与表题对齐建议

当前 BayesianOptimization 模块的代表性真实结果目录为 具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化/results/BayesianOptimization-贝叶斯优化分析结果_20260323_214813。该目录里同时存在主结果工作簿与 repro 再生产物工作簿:

  • bayesopt_results_20260323_214813.xlsx
  • bayesopt_repro.xlsx

两者实测工作表一致,均包含:

  • RawData
  • Processed
  • TestPreds
  • BestParams
  • Metrics
  • Parameters
  • Trials
  • Charts

因此论文终稿若要引用主运行结果,应优先点名 bayesopt_results_20260323_214813.xlsx;若要说明复现链路,再单独引用 bayesopt_repro.xlsx。不要把两者混写成单一主结果文件。

当前目录真实图文件只有一张:

  • 具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化/results/BayesianOptimization-贝叶斯优化分析结果_20260323_214813/score_curve.png

因此图题建议写成“贝叶斯优化搜索得分与历史最优曲线图”即可,不要额外声称程序同时导出了参数重要度图、采集函数图或测试集预测散点图。

9.2 终审说明

这篇文档最需要明确的工程事实,是当前目录里已经同时保留主结果和 repro 再生产物。脚本 具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化/results/BayesianOptimization-贝叶斯优化分析结果_20260323_214813/repro_bayesopt.py 中明确写成:

  • DATA_CSV = Path('repro_inputs') / 'bayesopt_repro_data.csv'
  • OUTPUT_FILE = Path('bayesopt_repro.xlsx')

这说明 bayesopt_repro.xlsx 是复现脚本固定输出,不是主运行结果文件。文档在说明复现链路时应按 DATA_CSV 这一真实变量名写,而不是套用其他算法常见的 INPUT_FILE 模板。

9.3 全量强化补充

  • 当前 BayesianOptimization 文档应绑定真实算法目录 具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化,代表性结果目录为 具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化/results/BayesianOptimization-贝叶斯优化分析结果_20260323_214813
  • 该目录内真实保留两份工作簿:主结果 bayesopt_results_20260323_214813.xlsx 与复现结果 bayesopt_repro.xlsx。两者当前工作表一致,均为 RawDataProcessedTestPredsBestParamsMetricsParametersTrialsCharts
  • 当前目录中的实体图只有 score_curve.png 一张,且与工作簿同层放置,没有额外 charts/ 子目录。这一点应继续在文档中保持收敛,不要扩写为多图输出。
  • 该目录同时包含复现脚本 repro_bayesopt.py 和输入副本 repro_inputs/bayesopt_repro_data.csv。脚本关键变量写法为 DATA_CSV = Path('repro_inputs') / 'bayesopt_repro_data.csv'OUTPUT_FILE = Path('bayesopt_repro.xlsx')
  • 因此 BayesianOptimization 属于非常标准的“目录内 repro_inputs 输入副本 + 固定再生产物 bayesopt_repro.xlsx”结构,但变量名是 DATA_CSV 而不是常见的 SRC_FILEINPUT_FILE。附录必须按这个真实变量名描述。
  • 论文若要证明可复现性,应明确区分:bayesopt_results_20260323_214813.xlsx 是主运行工作簿,bayesopt_repro.xlsx 是脚本固定输出的再生产物;两者不能混写成同一个结果文件。

10. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化/results/BayesianOptimization-贝叶斯优化分析结果_20260323_214813
  • 正文应围绕 RawDataProcessedTestPredsBestParamsMetricsParametersTrialsCharts 来写。
  • 图证应对应 score_curve.png,并把主结果和 bayesopt_repro.xlsx 的复现结果区分开。
  • 复现脚本应按 repro_bayesopt.py + repro_inputs/bayesopt_repro_data.csv 的口径说明。