正在加载中...

展开本页目录
算法教程MLP-多层感知机

MLP-多层感知机

No.155 · 在线教程

MLP-多层感知机 模块在当前项目中的真实实现,并不是滑动窗口时序网络,而是一个基于 scikit-learn 的标准表格学习器:分类任务使用 MLPClassifier,回归任务使用 MLPRegressor。它直接把每一行样本视为一个独立观测值,通过随机训练/测试划分完成建…

MLP-多层感知机

1. 方法概述

MLP-多层感知机 模块在当前项目中的真实实现,并不是滑动窗口时序网络,而是一个基于 scikit-learn 的标准表格学习器:分类任务使用 MLPClassifier,回归任务使用 MLPRegressor。它直接把每一行样本视为一个独立观测值,通过随机训练/测试划分完成建模。

设样本为

$$ \mathcal{D}=\{(x_i,y_i)\}_{i=1}^{N},\qquad x_i\in\mathbb{R}^{d},\ y_i\in\mathcal{Y} \tag{1} $$

其中 \(x_i\) 为第 \(i\) 行的特征向量,\(y_i\) 为目标变量。虽然该模块位于“深度学习与时序网络”目录下,但当前代码本身不做时间顺序建模,也不构造序列窗口

2. 数据预处理与随机划分

2.1 数值特征筛选

程序先把目标列之外的字段作为候选特征,但最终只保留数值型特征:

$$ X=\{x_{ij}\mid \text{feature}_j \text{ 为数值列}\} \tag{2} $$

所有非数值特征都会被直接丢弃,并在 processed_data 中记录到 dropped_non_numeric_columns。因此当前实现不做 One-Hot 编码,也不会使用文本、类别型或时间戳特征。

2.2 目标列与缺失值处理

回归任务中,目标列会尝试数值化;若整列都无法转成数值,则直接报错。分类任务不要求目标列必须是数值型,字符串类别标签也可直接参与 MLPClassifier 训练。

随后程序将数值特征与目标列拼接,并删除任一字段缺失的样本行。设清洗后的有效样本数为 \(N'\),则后续建模仅基于

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

2.3 训练/测试随机划分

若测试集比例为 \(r_{\mathrm{te}}\),则模块使用 train_test_split 随机切分:

$$ N_{\mathrm{train}}=\left\lfloor N'(1-r_{\mathrm{te}})\right\rfloor,\qquad N_{\mathrm{test}}=N'-N_{\mathrm{train}} \tag{4} $$

分类任务下,若每个类别至少有 2 个样本,则会使用分层抽样 stratify=y。因此,当前实现更适合普通监督学习场景,而不是严格时间顺序预测。

2.4 可选标准化

若勾选 normalize=True,程序会在 Pipeline 中加入 StandardScaler,并仅在训练集上拟合:

$$ x_{ij}^{\ast}=\frac{x_{ij}-\mu_j^{(\mathrm{train})}}{\sigma_j^{(\mathrm{train})}} \tag{5} $$

normalize=False,则直接把原始数值特征送入 MLP。与前面的 LSTMInformer 不同,这里标准化是通过 Pipeline 在训练集内部完成的,不会先用全量样本拟合缩放器。

3. 多层感知机结构与训练目标

3.1 隐藏层结构

隐藏层结构由 hidden_layers 指定,例如 "128,64" 会被解析为两层隐藏层 \((128,64)\)。对第 \(\ell\) 层,有

$$ h^{(\ell)}=g\!\left(W^{(\ell)}h^{(\ell-1)}+b^{(\ell)}\right),\qquad \ell=1,2,\ldots,L \tag{6} $$

其中 \(h^{(0)}=x\),激活函数 \(g(\cdot)\) 可选 relutanhlogisticidentity

3.2 分类输出

分类任务的最终预测可写为

$$ \hat y_i=\arg\max_{c\in\{1,\ldots,C\}} P(y_i=c\mid x_i) \tag{7} $$

内部优化目标可以概括为交叉熵损失加 L2 正则项:

$$ \mathcal{L}_{\mathrm{cls}}=-\sum_{i=1}^{N_{\mathrm{train}}}\ln P(y_i=\tilde y_i\mid x_i)+\alpha\|\Theta\|_2^2 \tag{8} $$

其中 \(\alpha\) 对应 alpha 参数。

3.3 回归输出

回归任务的输出是一个连续值:

$$ \hat y_i=W_{\mathrm{out}}h^{(L)}+b_{\mathrm{out}} \tag{9} $$

其优化目标可写为

$$ \mathcal{L}_{\mathrm{reg}}=\sum_{i=1}^{N_{\mathrm{train}}}(y_i-\hat y_i)^2+\alpha\|\Theta\|_2^2 \tag{10} $$

3.4 求解器

代码允许选择 adamlbfgssgd 三种求解器,并通过 learning_rate_initmax_iterrandom_state 控制训练过程。当前实现并没有显式早停、验证集或学习率调度逻辑,完全依赖 scikit-learn MLP 的标准拟合流程。

4. 评价指标与输出结果解释

4.1 分类指标

分类任务输出 accuracyf1_macrof1_weighted。准确率定义为

$$ \mathrm{Accuracy}=\frac{1}{N_{\mathrm{test}}}\sum_{i=1}^{N_{\mathrm{test}}}\mathbf{1}(\hat y_i=y_i) \tag{11} $$

宏平均 F1 与加权 F1 分别为

$$ F1_{\mathrm{macro}}=\frac{1}{C}\sum_{c=1}^{C}F1_c \tag{12} $$

$$ F1_{\mathrm{weighted}}=\sum_{c=1}^{C}\frac{n_c}{\sum_{k=1}^{C}n_k}F1_c \tag{13} $$

4.2 回归指标

回归任务输出 rmsemaer2

$$ \mathrm{RMSE}=\sqrt{\frac{1}{N_{\mathrm{test}}}\sum_{i=1}^{N_{\mathrm{test}}}(y_i-\hat y_i)^2} \tag{14} $$

$$ \mathrm{MAE}=\frac{1}{N_{\mathrm{test}}}\sum_{i=1}^{N_{\mathrm{test}}}|y_i-\hat y_i| \tag{15} $$

$$ R^2=1-\frac{\sum_{i=1}^{N_{\mathrm{test}}}(y_i-\hat y_i)^2}{\sum_{i=1}^{N_{\mathrm{test}}}(y_i-\bar y)^2} \tag{16} $$

4.3 输出结果说明

当前模块导出的 Excel 工作表比较精简,主要包括:

  • RawData:原始输入数据;
  • TestPreds:测试集真实值与预测值;
  • Metrics:最终评价指标;
  • Parameters:参数表;
  • Charts:图表路径索引。

尽管内存中的 results 还包含 processed_dataclass_counts,但它们不会被单独写入 Excel 工作表

图表方面,回归任务会尝试生成:

  • pred_vs_true:预测 vs 真实散点图;
  • residuals_hist:残差直方图;
  • residuals_vs_fitted:残差 vs 拟合值;
  • residuals_qq:残差 Q-Q 图。

分类任务会尝试生成:

  • confusion_matrix:混淆矩阵;
  • class_distributionclass_distribution_triptych:全量/训练/测试类别分布图。

5. 算法流程

按照当前项目实现,MLP-多层感知机 的计算流程如下:

  1. 读取 Excel/CSV 数据,并由用户选择任务类型与目标列;
  2. 从全部候选特征中筛出数值型列,记录被丢弃的非数值特征;
  3. 对回归目标做数值化检查,并删除任一字段缺失的样本行;
  4. test_size 随机切分训练集与测试集;分类任务满足条件时执行分层抽样;
  5. 若启用 normalize,则在 Pipeline 中加入 StandardScaler
  6. 根据 hidden_layersactivationsolver 等参数构建 MLPClassifierMLPRegressor
  7. 在训练集上拟合模型,在测试集上输出预测结果;
  8. 计算分类或回归指标,并导出 Excel、图表和复现脚本。

6. 关键参数说明

表 1 关键参数及含义

参数 含义 当前默认值
task 任务类型 classification
target_column 目标列 用户指定
hidden_layers 隐藏层结构 (64, 32)
activation 激活函数 relu
solver 求解器 adam
alpha L2 正则系数 0.0001
learning_rate_init 初始学习率 0.001
max_iter 最大迭代轮次 300
test_size 测试集比例 0.2
normalize 是否标准化特征 True
random_state 随机种子 可为空

7. 论文写作模板

7.1 方法描述模板

可在论文“方法部分”中写为:

“本文采用多层感知机(MLP)对样本进行监督学习建模。首先,从原始数据中提取数值型特征,并按训练集统计量进行标准化处理;其次,将清洗后的样本随机划分为训练集与测试集;随后,构建由多层全连接隐藏层组成的前馈神经网络,并选用 ReLU/Tanh/Logistic 等非线性激活函数,在分类任务中以交叉熵损失为优化目标,在回归任务中以平方误差为优化目标;最后,在测试集上计算 Accuracy、F1 或 RMSE、MAE、\(R^2\) 等指标,以评估模型的泛化性能。”

7.2 结果解释模板

结果部分可写为:MLP 作为前馈基线模型,可用于衡量更复杂时序结构模型的增益。若其性能已较为接近序列模型,则说明当前任务的主要信息更多来自特征横截面关系,而非长程时序依赖。

7.3 表格标题模板

表题可写为:MLP 监督学习模型预测结果与性能指标汇总表。

7.4 图表题注模板

图注可写为:MLP 模型真实值与预测值对比图或分类结果混淆矩阵。

7.5 表格示例

建议列名:样本编号、真实值、预测值、残差、RMSE、MAE、\(R^2\) 或 Accuracy、F1。

8. 实现说明与注意事项

  • 当前实现是逐样本表格学习 MLP,不是滑动窗口时序网络;若论文研究对象是时间序列预测,不能直接把该模块写成“时序 MLP”而不额外说明。
  • 模块只使用数值型特征,所有非数值特征会被静默丢弃,虽然 processed_data 中会记录这些列名,但 Excel 结果文件中默认并不会单独展示这份清单。
  • 训练/测试切分采用随机 train_test_split,分类任务还可能分层抽样;因此它并不保持时间因果顺序。
  • 与很多深度学习模块不同,这里完全依赖 scikit-learn 的 MLPClassifier/MLPRegressor,不存在 TensorFlow 或 PyTorch 深度网络结构。
  • random_state 为空,结果可能随运行变化;若需要复现实验,应显式固定随机种子。
  • hidden_layers 参数支持字符串输入,如 "128,64,32";若输入非法,代码会回退到默认的 (64, 32)

9. 论文写作建议

论文中建议把该模块归类为“表格数据前馈神经网络模型”,而不是时序模型。结果部分可优先展示网络结构参数、测试集性能和重要误差指标。由于它基于 scikit-learn MLP,实现上更接近传统监督学习模型,正文中不必展开复杂深度时序网络的结构描述。

10. 单篇终审补充

10.1 图题与表题对齐建议

  • RawData 表可写为:表X MLP 原始数据预览。
  • TestPreds 表可写为:表X MLP 测试集真实值与预测值对照。
  • Metrics 表可写为:表X MLP 模型性能指标汇总。
  • Parameters 表可写为:表X MLP 网络参数与训练配置。
  • Charts 表可写为:表X MLP 图表索引与路径清单。
  • pred_vs_true.png 建议写为:图X MLP 真实值与预测值对比散点图。
  • residuals_hist.png 建议写为:图X MLP 残差分布直方图。
  • residuals_vs_fitted.png 建议写为:图X MLP 残差与拟合值关系图。
  • residuals_qq.png 建议写为:图X MLP 残差 Q-Q 图。

10.2 终审说明

  • 当前代表性结果目录中的真实主工作簿为 mlp_results_20260313_232457.xlsx,复现输出为 MLP-多层感知机_results_20260313_232457_repro.xlsx。论文里若展示文件名,应避免把主运行文件和 repro 文件混写成同一份结果。
  • 当前 Excel 只真实导出 RawDataTestPredsMetricsParametersCharts 5 张工作表;虽然内存结果里还有 processed_data 等字段,但它们不会自动写入工作簿,正文不应擅自补成“处理后数据表已导出”。
  • 真实图文件位于 plots/ 子目录下,回归任务下可见 pred_vs_true.pngresiduals_hist.pngresiduals_vs_fitted.pngresiduals_qq.png。若是分类任务,图集会切换成混淆矩阵与类别分布图,因此论文配图必须与当次任务类型一致。
  • 当前模块本质是基于 scikit-learnMLPClassifier/MLPRegressor 表格学习模型,不存在 TensorFlow/PyTorch 深度网络训练历史。正文不要把 ParametersMetricsCharts 误写成深度学习 epoch 级导出。
  • 真实 repro 脚本为 repro_MLP-多层感知机_20260313_232457.py,并通过 INPUT_FILE = 'repro_inputs/mlp_window2_sample.csv' 读取输入副本;附录中应直接采用这一相对路径结构。

10.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/深度学习与时序网络/MLP-多层感知机,代表性结果目录更新为 具体的算法3/深度学习与时序网络/MLP-多层感知机/results/MLP-多层感知机分析结果_20260329_170922
  • 该目录实际包含两份工作簿:主运行结果 mlp_results_20260329_170922.xlsx 与复现输出 MLP-多层感知机_results_20260329_170922_repro.xlsx。两份工作簿的真实工作表一致,均为 RawDataTestPredsMetricsParametersCharts
  • 当前图文件位于 plots/ 子目录下,实际文件为 pred_vs_true.pngresiduals_hist.pngresiduals_qq.pngresiduals_vs_fitted.png。这说明代表性目录是回归任务输出,不应在对应论文段落里引用分类混淆矩阵或类别分布图。
  • 当前输入副本位于 repro_inputs/mlp_window2_sample.csvrepro_MLP-多层感知机_20260329_170922.py 中明确写有 INPUT_FILE = 'repro_inputs/mlp_window2_sample.csv'。这属于标准 repro_inputs/... 结构。
  • 这一目录与 window2_mlp_baseline_test_mlp_baseline_fixed_input0 不同;后者是测试基线目录,含大量历史 repro 文件。论文和交付说明应优先使用 MLP-多层感知机分析结果_20260329_170922 这种单轮结果目录,避免把基线池里的多轮脚本误写成一次用户实跑。
  • 当前工作簿没有 Training_Log 或 epoch 级损失表,因此这篇应继续按 scikit-learn 表格 MLP 写作,不应套用深度学习时序网络的训练曲线叙述。

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

  • 当前主结果目录应写作 具体的算法3/深度学习与时序网络/MLP-多层感知机/results/MLP-多层感知机分析结果_20260329_170922
  • 正文应围绕 RawDataTestPredsMetricsParametersCharts 来写。
  • 图证应对应 pred_vs_true.pngresiduals_hist.pngresiduals_qq.pngresiduals_vs_fitted.png,并把回归/分类任务区分开。
  • 复现脚本应按 repro_MLP-多层感知机_20260329_170922.py + repro_inputs/mlp_window2_sample.csv 的口径说明。