
1. 项目概述一次从零到一的数模竞赛实战复盘去年八月下旬我和两位队友一头扎进实验室用四天三夜的时间完成了2022年高教社杯全国大学生数学建模竞赛C题的求解。现在回头看那不仅仅是一次比赛更像是一次完整的项目攻坚。题目聚焦于古代玻璃制品的成分分析与鉴别要求我们基于化学成分数据判断一批未知样品的类型、风化情况并探究其成分间的关联规律。这听起来像是一个纯粹的化学或考古学问题但实际上它是一道典型的数据分析、统计建模与机理探究相结合的综合性赛题。对于当时还是大三学生的我们来说这既是一次挑战也是一次将课堂上学到的概率统计、机器学习、最优化理论付诸实践的绝佳机会。今天我就把这四天里的思考、挣扎、方案迭代和最终成型的完整过程拆解开来希望能给未来准备参加数模竞赛尤其是对数据分析类题目感兴趣的朋友们提供一个可参考的实战样本。2. 赛题核心与解题思路总览2.1 题目要求深度拆解拿到题目后我们做的第一件事不是急着写代码而是花了近两个小时逐字逐句地“翻译”题目要求将其转化为明确、可操作的建模任务。2022年C题的核心数据是一张Excel表格里面包含了数十个古代玻璃文物样本的化学成分含量如二氧化硅、氧化钠、氧化钾等以及它们的类型高钾玻璃、铅钡玻璃、风化状态等信息。任务可以清晰地分解为以下几个子问题分类与预测根据化学成分对未知类型的玻璃文物进行类型高钾/铅钡分类并预测其表面是否有风化。风化机理分析针对不同类型的玻璃分析其风化前后化学成分的变化规律探究风化过程的化学本质。关联规律挖掘分析玻璃类型、风化状态与化学成分之间的关联性并尝试用统计或物理化学模型进行解释。敏感性分析与分类判别基于上述规律对给定的两组未知样本进行更细致的分类和判别。这四部分环环相扣从基础的分类预测到深层的机理探究再到综合应用构成了一个完整的分析闭环。我们的思路也由此展开先做描述性统计和可视化对数据有一个直观认识然后构建分类模型解决预测问题接着通过统计检验和可视化对比分析风化规律最后整合所有发现形成对未知样本的综合判断。2.2 整体技术路线设计基于题目要求我们规划了如下图所示的四阶段技术路线。这个路线图并非一开始就如此清晰而是在解题过程中不断迭代和完善的。第一阶段数据预处理与探索性分析EDA这是所有数据分析项目的基石。我们检查了数据的完整性、一致性处理了可能的缺失值和异常值。更重要的是通过绘制箱线图、散点图矩阵、相关性热力图我们初步观察了不同类别高钾/铅钡风化/未风化样本在成分分布上的差异这为后续的模型选择和特征工程提供了方向性指导。第二阶段分类模型构建与优化这是解决任务一的核心。我们并没有只依赖一个模型而是采用了“模型对比-集成优化”的思路。初步尝试了逻辑回归、支持向量机SVM、随机森林和XGBoost等经典分类器通过交叉验证比较它们的性能。我们发现对于玻璃类型分类基于树的模型如随机森林表现更稳定而对于风化预测由于正负样本可能不均衡需要结合过采样技术和调整分类阈值。第三阶段统计推断与机理探究这是任务二和任务三的难点。我们不再满足于“黑箱”预测而是要解释“为什么”。主要采用了两种方法一是假设检验如对风化前后各成分含量进行配对样本t检验或Mann-Whitney U检验取决于数据是否服从正态分布定量判断哪些成分的变化是显著的二是可视化分析如绘制风化前后成分含量的雷达图或簇状柱状图直观展示变化模式。第四阶段综合研判与报告撰写将前三个阶段的结论进行整合形成对未知样本的最终判别依据。同时开始将分析过程、结果和结论系统地组织成论文。在数模竞赛中清晰、逻辑严谨的论文和可复现的代码同等重要。注意很多队伍在解题时容易陷入“唯模型论”追求复杂的算法而忽略了基础的数据理解和统计解释。我们的经验是对于这类有明确物理/化学背景的题目基于统计的机理分析往往比复杂的机器学习模型更能体现深度也更容易获得评阅老师的青睐。3. 数据预处理清洗、转换与特征工程3.1 原始数据探查与问题诊断我们拿到的数据表包含“文物编号”、“纹饰”、“颜色”、“类型”、“风化情况”等字段以及十几种氧化物的含量百分比。首先面临几个实际问题成分加和问题理论上所有氧化物含量之和应为100%但实测数据存在微小偏差有些样本总和在99%-101%之间。我们采用了归一化处理将每个样本的各成分含量除以该样本所有成分之和使其总和严格为100%。这消除了量纲影响使得不同样本间的比较更有意义。缺失值与异常值部分成分含量标注为“ND”未检测。我们将其视为一种特殊信息没有简单用0或均值填充而是创建了一个二值特征“XX成分是否检出”并将“ND”替换为一个远低于检测限的微小值如0.001%以保留“未检出”这一状态可能蕴含的物理意义例如某种工艺可能导致该成分完全缺失。类别特征编码“纹饰”、“颜色”是文本型类别特征。我们使用了独热编码One-Hot Encoding将其转化为模型可识别的数值特征。对于“类型”和“风化情况”这两个目标变量则进行标签编码。3.2 特征构造与选择策略原始特征各氧化物含量是直接测量值但为了提升模型性能和解释性我们尝试构造了一些衍生特征比值特征玻璃的化学稳定性往往与某些关键元素的比值有关。例如我们计算了K2O / Na2O钾钠比、PbO / (PbOBaO)铅钡比等。这些比值在考古学中常被用作区分玻璃产地或工艺的指标。统计特征对于每个样本计算了其所有成分含量的均值、方差、偏度等试图刻画其成分组成的“整体风格”。相关性筛选计算了所有数值特征与目标变量之间的相关性对于分类问题用斯皮尔曼相关系数。移除了与目标变量几乎无关的特征以降低模型复杂度防止过拟合。经过初步筛选和构造我们得到了一个包含约20个特征的特征集用于后续的建模工作。4. 分类模型实战从基线到集成4.1 基线模型建立与对比我们首先搭建了几个基线模型旨在快速评估问题的可分离性和不同算法的适应性。将数据按7:3划分为训练集和测试集。逻辑回归作为线性模型的代表它速度快可解释性强。我们用它来建立初步基准并观察其特征系数初步判断哪些成分对分类贡献大。支持向量机尝试了线性核和径向基核。对于可能非线性可分的数据RBF核的SVM往往能捕捉更复杂的边界。随机森林这是我们的重点考察对象。它能够处理非线性关系自动评估特征重要性且对缺失值和异常值不敏感。XGBoost在梯度提升框架下的高效实现通常在结构化数据上表现优异。我们使用准确率、精确率、召回率和F1分数作为评估指标。初步结果显示对于“玻璃类型”分类随机森林和XGBoost的准确率均能达到92%以上显著优于逻辑回归的85%。对于“风化预测”所有模型的性能都有所下降约80%-85%这提示我们风化可能受更复杂或多因素影响或者数据中存在不平衡。4.2 模型优化与集成策略针对初步结果我们进行了两轮优化第一轮处理样本不平衡与调参对于风化预测任务未风化的样本略多于风化样本。我们采用了SMOTE过采样技术在训练集中合成少数类样本使两类样本数量平衡。然后对随机森林和XGBoost进行了网格搜索调参。关键参数包括随机森林n_estimators树的数量、max_depth树的最大深度、min_samples_split节点分裂所需最小样本数。XGBoostlearning_rate学习率、max_depth、subsample子采样比例、colsample_bytree特征采样比例。调参后模型性能均有2-3个百分点的提升。第二轮特征重要性分析与模型集成我们输出了随机森林的特征重要性排序。发现SiO2二氧化硅、PbO氧化铅、BaO氧化钡和之前构造的K2O/Na2O比值是区分玻璃类型最重要的特征。而Na2O、K2O等碱金属氧化物的含量变化与风化状态高度相关。这为后续的机理分析提供了线索。最终我们没有使用单一的“最优”模型而是采用了软投票集成。即让优化后的随机森林、XGBoost和调参后的SVM三个模型同时对测试样本进行预测并取其预测概率的平均值作为最终预测概率。这样做的好处是降低了单一模型可能存在的偶然偏差提高了整体的鲁棒性和泛化能力。集成后的模型在测试集上的综合准确率达到了94.5%类型和87.1%风化效果令人满意。实操心得在有限的时间内不要盲目追求最前沿的模型。将经典模型如随机森林、XGBoost理解透彻、调优到位再结合简单的集成策略其效果往往比匆忙上马一个复杂神经网络要稳定得多。此外一定要留出一部分数据做严格的测试防止在交叉验证中过拟合。5. 风化机理的统计与可视化探究5.1 基于假设检验的定量分析分类模型告诉我们哪些样本可能风化但无法解释风化发生了什么变化。任务二要求我们定量分析风化前后化学成分的统计规律。我们将数据按玻璃类型高钾、铅钡和风化状态风化、未风化分组。对于每一类玻璃中的每一种化学成分我们进行了如下操作正态性检验使用Shapiro-Wilk检验判断该成分在“风化”和“未风化”两组数据中是否服从正态分布。差异性检验若两组数据均服从正态分布则使用独立样本t检验比较其均值是否存在显著差异。若任一组数据不服从正态分布则使用非参数的Mann-Whitney U检验比较其分布是否存在显著差异。结果解读我们设定显著性水平α0.05。如果检验得到的p值小于0.05则拒绝原假设认为两组无差异得出结论该成分在风化前后含量发生了显著变化。我们制作了一个详细的检验结果表。以铅钡玻璃为例分析发现Na2O、K2O、MgO等含量在风化后显著降低。这符合化学常识这些碱金属和碱土金属氧化物易溶于水在长期埋藏过程中容易被淋溶流失。SiO2、Al2O3等含量在风化后相对升高。这并非它们绝对量增加而是因为易溶成分流失后这些难溶的骨架成分相对百分比提高了。PbO的含量变化不显著甚至在某些样本中略有升高这可能与铅的化合物在特定环境下发生迁移再沉积有关。5.2 可视化呈现让规律一目了然数字表格虽然精确但不够直观。我们采用了多种可视化手段来辅助说明簇状柱状图将风化与未风化样本的各成分平均含量并排显示差异一目了然。箱线图展示各组数据的中位数、四分位数和离散程度可以看出风化不仅改变了均值还可能增加了成分含量的波动性。雷达图将一个样本的所有成分含量绘制在同一个雷达图上连接成多边形。将多个风化与未风化样本的雷达图叠加可以直观看到整体“成分轮廓”的收缩或变形非常具有冲击力。下图展示了我们的分析思路框架。通过“统计检验可视化”的组合拳我们不仅给出了“哪些成分变了”的结论还通过图表生动地展示了“怎么变的”使得论文的分析部分既有深度又易于理解。6. 关联分析与综合建模的深入尝试6.1 相关性网络与主成分分析任务三要求探究化学成分、玻璃类型、风化状态之间的关联关系。我们超越了简单的两两相关做了两件事构建相关性网络计算所有数值特征包括成分含量和构造的比值之间的斯皮尔曼相关系数矩阵。然后使用网络图工具将绝对值大于0.7的强相关关系绘制成图。节点大小代表该特征与其他特征的平均相关性强弱。从图中可以清晰看到PbO和BaO自然聚成一簇铅钡玻璃特征K2O和Na2O等聚成另一簇高钾玻璃特征而SiO2作为主要成分与多个成分存在中等程度的相关性。这张图形象地揭示了数据内在的模块化结构。主成分分析我们将所有化学成分数据进行了PCA降维。前两个主成分的累计方差贡献率超过了70%。我们在二维平面上绘制了样本的散点图并用颜色区分类型和风化状态。结果发现第一主成分轴几乎完美地将高钾玻璃和铅钡玻璃分开而第二主成分轴则与风化状态有一定的关联。这从降维的视角印证了我们的分类模型是有效的并且提示我们风化的影响可能体现在一个与主要类型区分维度正交的方向上。6.2 基于统计规律的分类判别模型对于最后一部分的敏感性分析和分类判别我们提出了一种基于统计分布的比较方法而非简单地调用之前的分类器。 对于给定的未知样本我们计算其各项化学成分。首先计算其与“高钾-未风化”、“高钾-风化”、“铅钡-未风化”、“铅钡-风化”这四组参考样本中心均值向量的马氏距离。马氏距离考虑了特征之间的相关性比欧氏距离更合理。然后计算该样本的化学成分向量落入上述四个组别的多元正态分布中的概率密度假设每组数据服从多元正态分布。最后综合比较距离的远近和概率密度的大小。例如如果某个样本距离“铅钡-未风化”组中心最近且落入该组分布的概率密度远高于其他组那么我们就有很大把握将其判为“铅钡-未风化”。同时我们可以通过比较“未风化”组和“风化”组的概率密度比值来评估其“风化”的可能性实现敏感性分析。这种方法物理意义明确直接建立在前面统计分析的基础之上使得整个论文的逻辑链条非常完整从描述统计到模型预测再到机理探究最后用探究出的统计规律去指导新样本的判别。7. 竞赛实战中的常见“坑”与应对策略四天时间除了构建模型更多是在解决问题。下面分享几个我们踩过的“坑”和解决办法。7.1 数据与理解层面坑1忽视数据背景盲目套用模型。最初我们曾想用神经网络但数据量仅百余条神经网络极易过拟合。对策永远从数据本身出发。小样本、结构化数据优先考虑树模型、SVM等传统机器学习方法。先做EDA理解数据分布和特点。坑2对“ND”值的粗暴处理。如果简单地将“ND”设为0会扭曲数据的真实分布特别是当“未检出”本身具有重要含义时。对策像我们一样将其视为一种特殊状态用极小数替代并增加指示特征。或者可以考虑使用适合处理缺失值的模型如XGBoost。坑3过度追求高精度忽略可解释性。竞赛论文不是黑箱算法展示评阅老师需要看到你的思考过程。对策在使用复杂模型的同时一定要辅以特征重要性分析、决策路径可视化对于单棵树或SHAP值分析来解释模型为什么做出这样的判断。7.2 建模与实现层面坑4没有划分严格的测试集。在调整参数和特征工程时如果一直在全体数据上评估会导致对模型性能的乐观估计数据泄露。对策在数据预处理完成后第一时间划分出约20%的数据作为最终测试集在后续所有建模、调参过程中绝不使用。仅使用训练集进行交叉验证。坑5调参时陷入局部最优或过拟合。网格搜索范围设置不当或者交叉验证折数太少都可能得到不可靠的最优参数。对策先进行大范围的粗调确定参数大致区间再进行精细搜索。使用5折或10折交叉验证以减少随机性。观察训练集和验证集上的学习曲线判断是否过拟合或欠拟合。坑6代码混乱无法复现。比赛后期时间紧张可能为了快速尝试不同想法而把代码写得一团糟。对策从第一天就建立良好的代码习惯。使用Jupyter Notebook或脚本函数化。对关键步骤如数据清洗、特征工程、模型训练添加详细注释。定期保存不同版本的数据和模型文件。7.3 论文写作与时间管理坑7论文写成实验报告或代码说明书。罗列所有尝试过的模型和结果没有主线逻辑。对策论文的核心是“讲一个好故事”。你的故事线应该是发现问题题目要求- 探索数据EDA- 建立解决方案模型- 深入分析原因统计检验- 综合应用结论判别分析。所有内容围绕这条主线展开失败的尝试可以简要提及作为对比但重点突出最终选择的方案及其优势。坑8图表丑陋或不规范。使用默认颜色的图表分辨率低图例不清。对策学习使用Matplotlib或Seaborn绘制美观、专业的图表。统一配色方案如使用Set2或Set3色盲友好配色卡。确保所有图表都有清晰的标题、坐标轴标签和图例。图表在论文中应能“自解释”即不看正文也能理解其大意。坑9前松后紧最后一天熬夜赶工。对策制定严格的时间表。例如第一天上午理解题目、下午数据预处理和EDA第二天全天建模与调优第三天上午深入分析、下午开始撰写论文主体第四天整合、优化、排版、检查。留出至少半天时间进行全文通读和格式调整。那次国赛的经历让我深刻体会到数学建模竞赛比拼的不仅仅是数学和编程能力更是问题拆解、快速学习、团队协作和系统化表达的综合能力。从一团模糊的问题描述到清晰的技术路线再到一行行代码和最终成型的论文这个过程本身就是一个微缩版的科研项目训练。希望这份超详细的复盘能帮你避开我们曾经走过的弯路更高效地准备属于你自己的竞赛。记住最重要的不是用了多高级的算法而是你的思考是否严密你的解决方案是否完整、自洽并且能够清晰、有说服力地呈现出来。