前言参加这次训练营之前我对机器学习的认识还停留在一些零散的名词上训练集、测试集、模型、预测……这些词似乎都听过但真让我解释“模型究竟在学什么”“为什么最后只提交一个 CSV”“排行榜上的 RMSE 又代表什么”我其实说不清楚。这次实践的任务是根据 LIBS激光诱导击穿光谱预测煤炭发热量。刚看到赛题介绍时我一度被煤炭、光谱、物理化学指标和两阶段回归等概念绕晕不知道最终到底要实现什么。真正跑通 Baseline、阅读代码并经历几轮线上提交后我才逐渐把整个流程串起来。这篇文章记录我作为机器学习初学者完成这次实践的过程包括赛题理解、代码流程、评测机制、方案改进以及踩过的坑。它不是一篇追求复杂模型的论文式总结而是一次从“会运行命令”到“开始理解为什么这样做”的学习复盘。一、赛题究竟要解决什么问题煤炭发热量是衡量煤炭质量的重要指标也会影响煤炭定价和现场燃烧控制。传统方法需要把煤样送到实验室通过实际燃烧进行测量流程较慢很难及时指导生产现场。LIBS 技术会用激光照射煤炭使其产生带有元素信息的光谱。不同波长位置的光谱强度可以看作煤炭成分的一种“指纹”。赛题希望训练一个回归模型根据光谱预测煤炭发热量一批煤炭的 LIBS 光谱 ↓ 数据处理与特征提取 ↓ 机器学习回归模型 ↓ 该批煤炭的预测发热量本题输入光谱包含约 7305 个波长点波长范围约为 196813 nm。每批煤通常有 1020 条光谱但这一批只对应一个实验室发热量标签。因此它不是简单的一条光谱对应一个答案而是典型的“多条光谱对应一个批次标签”。这也是本题的关键难点同批次的光谱之间存在波动模型既要利用多次测量的信息又不能把同一批次的光谱错误地当成完全独立的样本。二、第一次跑通 Baseline教程提供了完整的项目压缩包。首次运行的核心命令是unzipLIBS_project.zipcdLIBS pipinstall-rrequirements.txt python train.py这些命令分别完成unzip LIBS_project.zip解压代码、训练数据和测试数据。cd LIBS进入项目根目录。pip install -r requirements.txt安装 Pandas、NumPy、scikit-learn 等依赖。python train.py执行数据读取、特征提取、模型训练、测试集预测和提交文件打包。运行成功后程序会生成output/submit.zip一开始我只是机械地复制命令。后来阅读代码才知道项目中的文件各有分工文件主要职责config.py管理数据路径、煤种、PCA 维数和 Ridge 参数src/data.py读取光谱 CSV 与标签 Excelsrc/features.py提取统计、谱线积分、物理比值和 PCA 特征src/model.py完成两阶段回归、交叉验证和测试集推理src/submit.py按比赛格式生成 CSV 和 ZIPtrain.py串联整个流程的主入口这让我第一次感受到运行python train.py看起来只有一条命令但背后实际上是一条完整的机器学习流水线。三、Baseline 使用了什么方案原始方案按照煤种分别训练并采用两阶段 Ridge 回归。1. 第一阶段预测辅助指标模型先根据光谱预测四个与发热量相关的物理化学指标全水分灰分氢硫可以简化为光谱特征 → 全水分、灰分、氢、硫2. 第二阶段预测发热量第二阶段将光谱特征与第一阶段预测出的辅助指标组合再预测最终发热量光谱特征 预测辅助指标 → 发热量这种设计是在模型中加入一定的物理先验。例如灰分和水分通常会影响有效发热量氢含量也和燃烧放热有关。3. 使用的主要特征Baseline 提取了以下特征光谱整体均值、标准差、最大值和分位数偏度、峰度与熵一阶、二阶差分统计量C、H、O、Ca、Mg、Al、Si、Fe 等关键谱线积分可燃元素与灰分元素的比值PCA 降维后的光谱特征PCA 的作用是将数千维光谱压缩成较少的综合特征缓解“特征很多、训练批次很少”的问题。四、为什么最后提交的是 CSV比赛平台掌握测试集的真实发热量但不会把答案公开给参赛者。我们的程序需要根据测试光谱生成预测名称,预测发热量_MJ_KG 中马矿中煤矿12月27日,3451.18 九里山矿中煤矿12月3日,3880.45 煤场混煤12月11日,4162.64CSV 就像一张考试答卷第一列表示题目也就是测试批次第二列表示模型给出的答案。平台读取 CSV 后将预测值和隐藏真实值逐行比较。平台不需要运行我的训练代码也不关心我使用 Ridge、LightGBM 还是神经网络。它只关心每个测试批次最终预测了多少。这场比赛使用 RMSE 评分[RMSE\sqrt{\frac{1}{n}\sum_{i1}^{n}(\hat y_i-y_i)^2}]其中(\hat y_i) 是预测值(y_i) 是隐藏真实值。RMSE 越低说明预测越接近真实答案。因为误差会先平方所以某个批次如果错得特别离谱会受到更大的惩罚。我最初将排行榜数字理解成普通“得分”后来才明白它实际是误差不是越高越好而是越低越好。五、我的改进思路在跑通 Baseline 后我没有直接照搬所有官方提分建议而是先检查数据划分和验证流程。原因是训练集只有 70 个批次部分煤种甚至只有 7 个批次。样本很少时复杂模型很容易记住训练数据却无法预测新的煤炭批次。1. 按批次进行验证同一批次的 1020 条光谱共享一个标签。如果随机按单条光谱划分训练集和验证集同批次的部分光谱可能进入训练集另一部分进入验证集。由于它们非常相似本地分数会虚假地变好。因此验证时必须以批次为单位某一批次的所有光谱只能同时位于训练折或验证折2. 修正折外预处理进一步检查后我发现即使使用了GroupKFold如果在划分验证折之前就使用全部训练数据拟合标准化和 PCA验证数据的信息仍然会提前影响特征空间。两阶段模型还需要更加谨慎外层验证批次不仅不能参与 Stage 2也不能通过 Stage 1 的 OOF 特征间接进入 Stage 2 的训练过程。因此我重新实现了嵌套验证先划分外层训练批次和验证批次。只使用外层训练数据拟合标准化与 PCA。在外层训练数据内部再次产生 Stage 1 的 OOF 预测。使用这些 OOF 辅助指标训练 Stage 2。最后预测完全不可见的外层验证批次。这种验证更慢而且得到的本地 RMSE 并没有原始输出那么漂亮但它更接近模型面对真正未知批次时的情况。3. 稳健的批次聚合同一批次可能存在激光未打准、强度异常等光谱。相比简单平均我尝试使用中位数和批次内离散度特征减少少量异常光谱的影响。4. 模型集成单一模型可能在某些批次上偏高、另一些批次上偏低。为降低风险我将原始 Baseline 与严格两阶段模型进行加权平均最终预测 Baseline 权重 × Baseline预测 严格模型权重 × 严格模型预测线上结果从原始方案的 278依次改善到 273 和 267。这里的数字都是平台实际返回的 RMSE而不是本地估计。它说明严格模型的修正方向对隐藏测试集产生了正向作用但也不能据此断言继续提高权重一定会无限改善。六、我踩过的坑1. 误以为“代码能运行”就代表模型正确程序没有报错只能证明语法和运行流程基本正常不能证明数据划分、特征处理和评估逻辑正确。2. 误以为本地 CV 越低越可靠原方案显示的本地 CV 很低但严格检查后发现预处理和两阶段 OOF 存在信息边界不够严格的问题。数据泄漏不一定表现为直接使用验证标签也可能通过 PCA、标准化或中间模型间接发生。3. 误以为复杂模型一定更强官方给出了 LightGBM、模型集成和 1D-CNN 等方向。但只有 70 个批次时直接使用复杂模型可能严重过拟合。模型名称更先进不等于在当前数据上更可靠。4. 混淆“光谱条数”和“有效样本数”训练目录里有很多 CSV但同批次光谱共享一个标签。真正独立的监督信息更接近 70 个批次而不是所有光谱文件数量之和。5. 把排行榜当成调参工具测试集答案是隐藏的提交次数又有限。如果只根据排行榜反复修改预测很容易过度适应有限反馈。更合理的方式是先建立可信的本地验证再把线上反馈作为补充证据。6. 对成绩抱有不现实的预期从 278 降到 267 是实际改善但不能因为希望进入 100 多就假设某个未经验证的新模型一定能够做到。机器学习实验需要证据不能用目标代替结果。七、这次实践让我真正理解的概念1. 训练、验证和测试的区别训练集用于让模型学习。验证集用于比较方案和调整参数。测试集由平台隐藏答案用于最终评价。2. 特征工程的作用模型不能直接理解“碳元素”“灰分”这些概念。特征工程需要将光谱转换成数值表示例如统计量、谱线积分、元素比值和 PCA 分量。3. 交叉验证不是一个形式交叉验证的关键不是调用了某个 API而是划分方式是否符合数据产生过程。本题必须尊重批次结构。4. CSV 不是模型模型是从训练数据中学到的映射关系CSV 只是模型对测试集给出的最终答案表。5. 更严格的验证不等于更低的本地分数严格验证经常会让分数变差因为它移除了原来不应该利用的信息。但这种“变差”反而可能让我们更接近真实泛化能力。八、后续学习计划经过这次实践我准备按以下顺序继续学习补充 Python、NumPy 和 Pandas 基础。学习线性回归、Ridge 正则化和过拟合。理解标准化、PCA 和特征工程。深入学习交叉验证、OOF 和数据泄漏。学习 PLS 等适合光谱数据的模型。在验证流程可信的前提下尝试树模型与模型融合。补充光谱平滑、基线校正、导数光谱等领域知识。现阶段我不急着使用复杂神经网络。对小样本任务而言先把数据、验证方式和简单模型理解清楚比堆叠复杂算法更重要。总结这次训练营对我最大的帮助不只是生成了一个submit.zip而是让我第一次完整经历了机器学习竞赛的基本闭环理解问题 ↓ 读取数据 ↓ 提取特征 ↓ 训练模型 ↓ 本地验证 ↓ 预测测试集 ↓ 提交 CSV ↓ 分析线上反馈作为初学者我仍然不能保证每一个判断都是正确的但现在我至少开始知道应该检查什么数据是否按批次划分、预处理是否泄漏、模型是否过拟合、本地指标是否可信以及线上变化是否真的能支持下一步决策。从“只会复制命令”到“能够质疑验证流程并解释评测机制”这是我在这次实践中最真实的成长。
从跑通 Baseline 到理解 RMSE:我的第一次 LIBS 煤炭发热量预测实践
前言参加这次训练营之前我对机器学习的认识还停留在一些零散的名词上训练集、测试集、模型、预测……这些词似乎都听过但真让我解释“模型究竟在学什么”“为什么最后只提交一个 CSV”“排行榜上的 RMSE 又代表什么”我其实说不清楚。这次实践的任务是根据 LIBS激光诱导击穿光谱预测煤炭发热量。刚看到赛题介绍时我一度被煤炭、光谱、物理化学指标和两阶段回归等概念绕晕不知道最终到底要实现什么。真正跑通 Baseline、阅读代码并经历几轮线上提交后我才逐渐把整个流程串起来。这篇文章记录我作为机器学习初学者完成这次实践的过程包括赛题理解、代码流程、评测机制、方案改进以及踩过的坑。它不是一篇追求复杂模型的论文式总结而是一次从“会运行命令”到“开始理解为什么这样做”的学习复盘。一、赛题究竟要解决什么问题煤炭发热量是衡量煤炭质量的重要指标也会影响煤炭定价和现场燃烧控制。传统方法需要把煤样送到实验室通过实际燃烧进行测量流程较慢很难及时指导生产现场。LIBS 技术会用激光照射煤炭使其产生带有元素信息的光谱。不同波长位置的光谱强度可以看作煤炭成分的一种“指纹”。赛题希望训练一个回归模型根据光谱预测煤炭发热量一批煤炭的 LIBS 光谱 ↓ 数据处理与特征提取 ↓ 机器学习回归模型 ↓ 该批煤炭的预测发热量本题输入光谱包含约 7305 个波长点波长范围约为 196813 nm。每批煤通常有 1020 条光谱但这一批只对应一个实验室发热量标签。因此它不是简单的一条光谱对应一个答案而是典型的“多条光谱对应一个批次标签”。这也是本题的关键难点同批次的光谱之间存在波动模型既要利用多次测量的信息又不能把同一批次的光谱错误地当成完全独立的样本。二、第一次跑通 Baseline教程提供了完整的项目压缩包。首次运行的核心命令是unzipLIBS_project.zipcdLIBS pipinstall-rrequirements.txt python train.py这些命令分别完成unzip LIBS_project.zip解压代码、训练数据和测试数据。cd LIBS进入项目根目录。pip install -r requirements.txt安装 Pandas、NumPy、scikit-learn 等依赖。python train.py执行数据读取、特征提取、模型训练、测试集预测和提交文件打包。运行成功后程序会生成output/submit.zip一开始我只是机械地复制命令。后来阅读代码才知道项目中的文件各有分工文件主要职责config.py管理数据路径、煤种、PCA 维数和 Ridge 参数src/data.py读取光谱 CSV 与标签 Excelsrc/features.py提取统计、谱线积分、物理比值和 PCA 特征src/model.py完成两阶段回归、交叉验证和测试集推理src/submit.py按比赛格式生成 CSV 和 ZIPtrain.py串联整个流程的主入口这让我第一次感受到运行python train.py看起来只有一条命令但背后实际上是一条完整的机器学习流水线。三、Baseline 使用了什么方案原始方案按照煤种分别训练并采用两阶段 Ridge 回归。1. 第一阶段预测辅助指标模型先根据光谱预测四个与发热量相关的物理化学指标全水分灰分氢硫可以简化为光谱特征 → 全水分、灰分、氢、硫2. 第二阶段预测发热量第二阶段将光谱特征与第一阶段预测出的辅助指标组合再预测最终发热量光谱特征 预测辅助指标 → 发热量这种设计是在模型中加入一定的物理先验。例如灰分和水分通常会影响有效发热量氢含量也和燃烧放热有关。3. 使用的主要特征Baseline 提取了以下特征光谱整体均值、标准差、最大值和分位数偏度、峰度与熵一阶、二阶差分统计量C、H、O、Ca、Mg、Al、Si、Fe 等关键谱线积分可燃元素与灰分元素的比值PCA 降维后的光谱特征PCA 的作用是将数千维光谱压缩成较少的综合特征缓解“特征很多、训练批次很少”的问题。四、为什么最后提交的是 CSV比赛平台掌握测试集的真实发热量但不会把答案公开给参赛者。我们的程序需要根据测试光谱生成预测名称,预测发热量_MJ_KG 中马矿中煤矿12月27日,3451.18 九里山矿中煤矿12月3日,3880.45 煤场混煤12月11日,4162.64CSV 就像一张考试答卷第一列表示题目也就是测试批次第二列表示模型给出的答案。平台读取 CSV 后将预测值和隐藏真实值逐行比较。平台不需要运行我的训练代码也不关心我使用 Ridge、LightGBM 还是神经网络。它只关心每个测试批次最终预测了多少。这场比赛使用 RMSE 评分[RMSE\sqrt{\frac{1}{n}\sum_{i1}^{n}(\hat y_i-y_i)^2}]其中(\hat y_i) 是预测值(y_i) 是隐藏真实值。RMSE 越低说明预测越接近真实答案。因为误差会先平方所以某个批次如果错得特别离谱会受到更大的惩罚。我最初将排行榜数字理解成普通“得分”后来才明白它实际是误差不是越高越好而是越低越好。五、我的改进思路在跑通 Baseline 后我没有直接照搬所有官方提分建议而是先检查数据划分和验证流程。原因是训练集只有 70 个批次部分煤种甚至只有 7 个批次。样本很少时复杂模型很容易记住训练数据却无法预测新的煤炭批次。1. 按批次进行验证同一批次的 1020 条光谱共享一个标签。如果随机按单条光谱划分训练集和验证集同批次的部分光谱可能进入训练集另一部分进入验证集。由于它们非常相似本地分数会虚假地变好。因此验证时必须以批次为单位某一批次的所有光谱只能同时位于训练折或验证折2. 修正折外预处理进一步检查后我发现即使使用了GroupKFold如果在划分验证折之前就使用全部训练数据拟合标准化和 PCA验证数据的信息仍然会提前影响特征空间。两阶段模型还需要更加谨慎外层验证批次不仅不能参与 Stage 2也不能通过 Stage 1 的 OOF 特征间接进入 Stage 2 的训练过程。因此我重新实现了嵌套验证先划分外层训练批次和验证批次。只使用外层训练数据拟合标准化与 PCA。在外层训练数据内部再次产生 Stage 1 的 OOF 预测。使用这些 OOF 辅助指标训练 Stage 2。最后预测完全不可见的外层验证批次。这种验证更慢而且得到的本地 RMSE 并没有原始输出那么漂亮但它更接近模型面对真正未知批次时的情况。3. 稳健的批次聚合同一批次可能存在激光未打准、强度异常等光谱。相比简单平均我尝试使用中位数和批次内离散度特征减少少量异常光谱的影响。4. 模型集成单一模型可能在某些批次上偏高、另一些批次上偏低。为降低风险我将原始 Baseline 与严格两阶段模型进行加权平均最终预测 Baseline 权重 × Baseline预测 严格模型权重 × 严格模型预测线上结果从原始方案的 278依次改善到 273 和 267。这里的数字都是平台实际返回的 RMSE而不是本地估计。它说明严格模型的修正方向对隐藏测试集产生了正向作用但也不能据此断言继续提高权重一定会无限改善。六、我踩过的坑1. 误以为“代码能运行”就代表模型正确程序没有报错只能证明语法和运行流程基本正常不能证明数据划分、特征处理和评估逻辑正确。2. 误以为本地 CV 越低越可靠原方案显示的本地 CV 很低但严格检查后发现预处理和两阶段 OOF 存在信息边界不够严格的问题。数据泄漏不一定表现为直接使用验证标签也可能通过 PCA、标准化或中间模型间接发生。3. 误以为复杂模型一定更强官方给出了 LightGBM、模型集成和 1D-CNN 等方向。但只有 70 个批次时直接使用复杂模型可能严重过拟合。模型名称更先进不等于在当前数据上更可靠。4. 混淆“光谱条数”和“有效样本数”训练目录里有很多 CSV但同批次光谱共享一个标签。真正独立的监督信息更接近 70 个批次而不是所有光谱文件数量之和。5. 把排行榜当成调参工具测试集答案是隐藏的提交次数又有限。如果只根据排行榜反复修改预测很容易过度适应有限反馈。更合理的方式是先建立可信的本地验证再把线上反馈作为补充证据。6. 对成绩抱有不现实的预期从 278 降到 267 是实际改善但不能因为希望进入 100 多就假设某个未经验证的新模型一定能够做到。机器学习实验需要证据不能用目标代替结果。七、这次实践让我真正理解的概念1. 训练、验证和测试的区别训练集用于让模型学习。验证集用于比较方案和调整参数。测试集由平台隐藏答案用于最终评价。2. 特征工程的作用模型不能直接理解“碳元素”“灰分”这些概念。特征工程需要将光谱转换成数值表示例如统计量、谱线积分、元素比值和 PCA 分量。3. 交叉验证不是一个形式交叉验证的关键不是调用了某个 API而是划分方式是否符合数据产生过程。本题必须尊重批次结构。4. CSV 不是模型模型是从训练数据中学到的映射关系CSV 只是模型对测试集给出的最终答案表。5. 更严格的验证不等于更低的本地分数严格验证经常会让分数变差因为它移除了原来不应该利用的信息。但这种“变差”反而可能让我们更接近真实泛化能力。八、后续学习计划经过这次实践我准备按以下顺序继续学习补充 Python、NumPy 和 Pandas 基础。学习线性回归、Ridge 正则化和过拟合。理解标准化、PCA 和特征工程。深入学习交叉验证、OOF 和数据泄漏。学习 PLS 等适合光谱数据的模型。在验证流程可信的前提下尝试树模型与模型融合。补充光谱平滑、基线校正、导数光谱等领域知识。现阶段我不急着使用复杂神经网络。对小样本任务而言先把数据、验证方式和简单模型理解清楚比堆叠复杂算法更重要。总结这次训练营对我最大的帮助不只是生成了一个submit.zip而是让我第一次完整经历了机器学习竞赛的基本闭环理解问题 ↓ 读取数据 ↓ 提取特征 ↓ 训练模型 ↓ 本地验证 ↓ 预测测试集 ↓ 提交 CSV ↓ 分析线上反馈作为初学者我仍然不能保证每一个判断都是正确的但现在我至少开始知道应该检查什么数据是否按批次划分、预处理是否泄漏、模型是否过拟合、本地指标是否可信以及线上变化是否真的能支持下一步决策。从“只会复制命令”到“能够质疑验证流程并解释评测机制”这是我在这次实践中最真实的成长。