MLP-多层感知机
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。与前面的 LSTM、Informer 不同,这里标准化是通过 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)\) 可选 relu、tanh、logistic 或 identity。
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 求解器
代码允许选择 adam、lbfgs 或 sgd 三种求解器,并通过 learning_rate_init、max_iter 和 random_state 控制训练过程。当前实现并没有显式早停、验证集或学习率调度逻辑,完全依赖 scikit-learn MLP 的标准拟合流程。
4. 评价指标与输出结果解释
4.1 分类指标
分类任务输出 accuracy、f1_macro 与 f1_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 回归指标
回归任务输出 rmse、mae 与 r2:
$$ \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_data 和 class_counts,但它们不会被单独写入 Excel 工作表。
图表方面,回归任务会尝试生成:
pred_vs_true:预测 vs 真实散点图;residuals_hist:残差直方图;residuals_vs_fitted:残差 vs 拟合值;residuals_qq:残差 Q-Q 图。
分类任务会尝试生成:
confusion_matrix:混淆矩阵;class_distribution或class_distribution_triptych:全量/训练/测试类别分布图。
5. 算法流程
按照当前项目实现,MLP-多层感知机 的计算流程如下:
- 读取 Excel/CSV 数据,并由用户选择任务类型与目标列;
- 从全部候选特征中筛出数值型列,记录被丢弃的非数值特征;
- 对回归目标做数值化检查,并删除任一字段缺失的样本行;
- 按
test_size随机切分训练集与测试集;分类任务满足条件时执行分层抽样; - 若启用
normalize,则在Pipeline中加入StandardScaler; - 根据
hidden_layers、activation、solver等参数构建MLPClassifier或MLPRegressor; - 在训练集上拟合模型,在测试集上输出预测结果;
- 计算分类或回归指标,并导出 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 只真实导出
RawData、TestPreds、Metrics、Parameters、Charts5 张工作表;虽然内存结果里还有processed_data等字段,但它们不会自动写入工作簿,正文不应擅自补成“处理后数据表已导出”。 - 真实图文件位于
plots/子目录下,回归任务下可见pred_vs_true.png、residuals_hist.png、residuals_vs_fitted.png、residuals_qq.png。若是分类任务,图集会切换成混淆矩阵与类别分布图,因此论文配图必须与当次任务类型一致。 - 当前模块本质是基于
scikit-learn的MLPClassifier/MLPRegressor表格学习模型,不存在 TensorFlow/PyTorch 深度网络训练历史。正文不要把Parameters、Metrics或Charts误写成深度学习 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。两份工作簿的真实工作表一致,均为RawData、TestPreds、Metrics、Parameters、Charts。 - 当前图文件位于
plots/子目录下,实际文件为pred_vs_true.png、residuals_hist.png、residuals_qq.png、residuals_vs_fitted.png。这说明代表性目录是回归任务输出,不应在对应论文段落里引用分类混淆矩阵或类别分布图。 - 当前输入副本位于
repro_inputs/mlp_window2_sample.csv,repro_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。 - 正文应围绕
RawData、TestPreds、Metrics、Parameters、Charts来写。 - 图证应对应
pred_vs_true.png、residuals_hist.png、residuals_qq.png、residuals_vs_fitted.png,并把回归/分类任务区分开。 - 复现脚本应按
repro_MLP-多层感知机_20260329_170922.py + repro_inputs/mlp_window2_sample.csv的口径说明。