BayesianOptimization-贝叶斯优化
BayesianOptimization-贝叶斯优化 的真实核心主要位于:
BayesianOptimization-贝叶斯优化
1. 方法概述
BayesianOptimization-贝叶斯优化 的真实核心主要位于:
core/bayes_opt_calculator.pyui/upload_widget.pyui/results_widget.pyui/main_window.py
从代码实现看,这个模块并不是“任意模型 + 任意搜索空间”的通用贝叶斯优化平台,而是一个面向随机森林的超参数搜索器。它只支持两种 estimator:
RandomForestClassifierRandomForestRegressor
同时,它还存在显式回退逻辑:
$$ \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 编码,也不会做缺失值填补。若检测到非数值特征列:
- 上传页只弹出“将被自动忽略”的提示;
- 真正传给模型训练的仍然只有数值列。
因此该模块接受的是“目标列 + 若干数值特征”的建模口径,而不是通用表格预处理流水线。
2.3 特征工程面板未接入主流程
目录中虽然存在 ui/feature_engineering_panel.py,里面实现了:
- 缺失值处理
- One-Hot 编码
- 标准化 / Min-Max 缩放
- 多项式特征
- 方差阈值 / 互信息筛选
- PCA / Kernel PCA
但当前 main_window.py 实际只挂接了:
UploadWidgetResultsWidget
并没有把 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 或 R²。
4. 贝叶斯搜索与随机回退
4.1 BayesSearchCV 路径
当 _HAS_SKOPT=True 时,代码构造:
BayesSearchCVInteger(...)Categorical(...)
并设置:
n_itercvrandom_statescoringn_jobs=-1
这一路径把“下一组候选参数如何生成”的细节交给 BayesSearchCV 内部完成。就贝叶斯优化的一般形式而言,可以抽象写成
$$ \theta_{t+1}=\arg\max_{\theta\in\Theta} a_t(\theta) \tag{7} $$
其中 \(a_t(\theta)\) 表示由历史试验结果诱导出来的采集准则。但当前仓库代码没有显式展开代理模型、采集函数名称或其具体公式,因此文档不应把这些内部机制写得过细。
4.2 随机回退路径
当 skopt 不可用时,代码不会报错退出,而是自动切换到:
RandomizedSearchCVscipy.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_weightedf1_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_errortest_score被代码写成-msermse和r2另外单独导出
因此该模块的“测试集得分”并不是 R²,而是负的 MSE。
6. 输出结果与复现
6.1 Excel 工作表
save_to_excel() 实际导出的工作表包括:
RawDataProcessedTestPredsBestParamsMetricsParametersTrialsCharts
其中:
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 复现脚本
结果页有两套复现导出逻辑:
- 计算完成后自动写出
repro_bayesopt.py - 点击“导出复现代码”后额外生成带时间戳的
bayesopt_reproduce_*.py
同时会把输入数据复制到 repro_inputs/ 目录下,供脚本重新加载并复跑 BayesOptCalculator。
7. 实现说明与注意事项
根据当前真实代码,论文说明中应明确以下边界:
- 这不是任意模型的通用贝叶斯优化框架,而是随机森林专用超参数搜索器。
- 真正的贝叶斯搜索只在安装了
scikit-optimize时成立;否则自动退化为RandomizedSearchCV。 - 非数值特征不会被编码,只会被忽略;没有真实接入的缺失值填补、缩放或降维训练流程。
feature_engineering_panel.py虽然存在,但没有接进主窗口实际流程。- 回归任务中的
best_score_cv与test_score都不等于R²,而是以负 MSE 为核心分数口径。 - 结果文件默认保存到形如
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 贝叶斯优化参数空间与搜索控制参数设置表
- 表 2 贝叶斯优化最优参数组合结果表
- 表 3 交叉验证最优分数与测试集评价指标结果表
- 表 4 候选参数组合搜索轨迹与分数汇总表
8.4 图表题注模板
- 图 1 贝叶斯优化过程中交叉验证分数与历史最优分数变化曲线。
- 图 2 不同候选参数组合的交叉验证分数对比图。
- 图 3 最优随机森林模型在测试集上的预测结果对比图。
8.5 表格示例
表 1 贝叶斯优化最优参数与评价指标结果
| 项目 | 结果 |
|---|---|
| 搜索方法 | BayesSearchCV / RandomizedSearchCV |
| 最优参数组合 | |
交叉验证最优分数 best_score_cv |
|
测试集指标 test_score |
|
| 其他指标 |
表注:交叉验证最优分数来自 Trials 与 Metrics 工作表;若为回归任务,应注明 best_score_cv 的统计口径为负误差分数而非 \(R^2\)。
9. 单篇终审补充
9.1 图题与表题对齐建议
当前 BayesianOptimization 模块的代表性真实结果目录为 具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化/results/BayesianOptimization-贝叶斯优化分析结果_20260323_214813。该目录里同时存在主结果工作簿与 repro 再生产物工作簿:
bayesopt_results_20260323_214813.xlsxbayesopt_repro.xlsx
两者实测工作表一致,均包含:
RawDataProcessedTestPredsBestParamsMetricsParametersTrialsCharts
因此论文终稿若要引用主运行结果,应优先点名 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。两者当前工作表一致,均为RawData、Processed、TestPreds、BestParams、Metrics、Parameters、Trials、Charts。 - 当前目录中的实体图只有
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_FILE或INPUT_FILE。附录必须按这个真实变量名描述。 - 论文若要证明可复现性,应明确区分:
bayesopt_results_20260323_214813.xlsx是主运行工作簿,bayesopt_repro.xlsx是脚本固定输出的再生产物;两者不能混写成同一个结果文件。
10. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/可解释与AutoML/BayesianOptimization-贝叶斯优化/results/BayesianOptimization-贝叶斯优化分析结果_20260323_214813。 - 正文应围绕
RawData、Processed、TestPreds、BestParams、Metrics、Parameters、Trials、Charts来写。 - 图证应对应
score_curve.png,并把主结果和bayesopt_repro.xlsx的复现结果区分开。 - 复现脚本应按
repro_bayesopt.py + repro_inputs/bayesopt_repro_data.csv的口径说明。