2017C「颜色与物质判别」(二):多分类器比较与选型
1 问题重述与建模思路
上一篇用 PCA、LDA、逻辑回归确认了"两类物质在颜色特征上可判别、信号充足"。但工程落地时并不会只用一个模型——不同的分类器各有假设与长短,选错模型可能带来不必要的错分或不可解释。本篇的目标是系统地比较五种典型分类器,用交叉验证与多指标选出最适合本题的模型,为质检判别系统的上线提供选型依据。
选取的五类模型覆盖了不同的归纳偏置:**逻辑回归(LR)**假定特征对数几率线性可加;**线性判别分析(LDA)**假定各类同协方差高斯;**K 近邻(KNN)**是非参数、靠局部相似度;**高斯朴素贝叶斯(GNB)**假定特征条件独立;**决策树(Tree)**用轴平行分割刻画非线性边界。它们从"线性→非参数→树"覆盖了光谱,比较结果本身就有方法论的普适价值。
全部实验基于同一份确定性数据(gen_2017c,seed=2017):140 条训练、60 条测试,特征经 z-score 标准化。所有数字与上一篇、出图脚本、本篇附录四处一致。
2 五折交叉验证:稳定性的第一道关口
单看一次训练/测试切分容易被随机性误导,因此先用五折分层交叉验证评估每个模型的稳定性:把训练集分成 5 份,轮流用 4 份训练、1 份验证,重复 5 次取平均准确率与标准差(图1)。结果如下:
| 模型 | 平均准确率 | 标准差 |
|---|---|---|
| 逻辑回归 LR | 0.950 | 0.036 |
| 线性判别 LDA | 0.957 | 0.035 |
| K 近邻 KNN | 0.943 | 0.036 |
| 朴素贝叶斯 GNB | 0.964 | 0.023 |
| 决策树 Tree | 0.885 | 0.048 |
GNB 以 0.964 的平均准确率居首,且标准差最小(0.023),最稳;LDA 紧随其后(0.957);决策树最差(0.885)且波动最大(0.048)。交叉验证的意义在于:它用"多次重切分"把"一次运气好"和"真正泛化好"区分开。决策树在此表现疲软,是因为深度限制为 3 时表达力不足,而过深又会过拟合——它需要的调参比线性模型更精细。
标准差这一列往往比平均分更值得玩味:GNB 的 0.023 意味着无论怎么折,它都稳定在 0.94–0.99 之间,部署时心里有底;决策树的 0.048 则暗示"换批数据表现可能大起大落",上线风险高。在样本量不大、数据分布可能漂移的质检场景里,"稳"常常比"单次最高"更可贵——这也是为什么尽管 GNB 平均最高,我们仍把 LDA 列为首选:两者精度相当,而 LDA 还额外给出校准良好的概率与最强 AUC,综合更均衡。
3 测试集综合指标:不止看准确率
交叉验证给了平均准确率,但最终上线看的是独立测试集上的综合表现。仅用准确率会掩盖"把少数类全判错却仍高准"的陷阱,因此同时报告精确率(precision)、召回率(recall)、F1 与 AUC(图2,数值见下表)。
| 模型 | 准确率 | 精确率 | 召回率 | F1 | AUC |
|---|---|---|---|---|---|
| LR | 0.867 | 0.833 | 0.893 | 0.862 | 0.959 |
| LDA | 0.917 | 0.897 | 0.929 | 0.912 | 0.975 |
| KNN | 0.933 | 0.962 | 0.893 | 0.926 | 0.943 |
| GNB | 0.917 | 0.897 | 0.929 | 0.912 | 0.973 |
| 决策树 | 0.817 | 0.743 | 0.929 | 0.825 | 0.667 |
读表有几处反直觉但重要的发现:(1)交叉验证里领先的 GNB,在测试集上准确率(0.917)被 KNN(0.933)反超——因为测试集分布与训练折的微小差异,让非参数的 KNN 更贴合局部结构;(2)LDA 的 AUC 最高(0.975),说明它的"打分排序"能力最强,即便卡阈值后的硬分类略逊于 KNN,其软输出最可靠;(3)决策树召回率高达 0.929 但精确率仅 0.743——它倾向于"宁可错杀也不放过",把大量类0误判为类1,F1 因此只有 0.825,AUC 更是低至 0.667,几乎丧失排序能力。
4 ROC 曲线对比:排序能力的全景
把五个模型的 ROC 曲线画在同一坐标系(图3),能直观比较"排序判别力"。LDA 与 GNB 的曲线最贴近左上角,AUC 分别 0.975、0.973;LR 次之(0.959);KNN 由于投票机制对概率校准较粗,AUC 0.943 略低但曲线仍高耸;决策树曲线明显"塌"向对角线,AUC 0.667 暴露其软输出几乎不可用。
一个关键经验:当一个模型的硬分类(准确率/F1)与软输出(AUC)严重背离时,它不适合做"带置信度"的判别。决策树正是如此——它能在阈值偏向某类时刷高召回,却给不出可信的概率。质检场景里,往往更看重"对可疑样本给出高置信度"而非" blindly 贴标签",因此 AUC 高的 LDA/GNB 实际更受青睐。
5 特征重要性:两种视角的交叉验证
"哪些颜色特征在判别中起决定作用"不仅关乎解释,也指导后续是否要删减冗余通道。用两种独立方法估计特征重要性(图4):逻辑回归取系数绝对值归一化,决策树取分裂的 Gini 增益归一化。
| 特征 | LR 重要性 | 树重要性 |
|---|---|---|
| f1 | 0.107 | 0.000 |
| f2 | 0.147 | 0.106 |
| f3 | 0.283 | 0.568 |
| f4 | 0.181 | 0.169 |
| f5 | 0.048 | 0.000 |
| f6 | 0.234 | 0.157 |
两种方法一致地把 f3 排在第一(f3 在 LR 中占 28.3%、在树中占 56.8%),f6、f4 次之,f5 在两个模型里都近乎为零。这与第一篇的 Cohen's ()相互印证——三种互不相干的方法指向同一结论,是特征判别力结论可靠的最强证据。值得注意的是决策树完全忽略 f1、f5,因为它的贪心分裂一旦用 f3 切出纯节点就不再需要它们,这恰恰说明"树的重要性"测的是"边际贡献"而非"总信息量",与 LR 的"全局系数"互补,二者合看才不会偏信任一种。
6 学习曲线:数据量还够不够
选型还要考虑"如果以后多采些样本,模型还能涨多少"。学习曲线(图5)按训练样本比例 0.2→1.0 逐步训练,观察测试准确率随数据量的变化。
KNN 在小样本(20%)时只有 0.533,随数据增多快速爬升到 0.933——非参数模型对数据量极敏感,本数据量下尚未完全饱和,意味着再补充样本 KNN 还能提升。LR 起步就 0.65,在 60% 数据处跃升到 0.883 后趋稳,说明线性模型"样本效率"更高、更早收敛。这提示:若采集成本高、样本稀缺,优先上 LR/LDA;若数据易得、追求极限精度,KNN 的上升空间更大。
值得警惕的是 KNN 在 20% 数据处跌到 0.533,仅略高于随机基线(本数据类0占 0.53)——这意味着当样本极少时,KNN 几乎是在"瞎猜",局部邻居里两类各半、投票失效。反观 LR 在同等数据下仍有 0.65,因为线性模型靠"全局趋势"兜底,不至于完全失控。这条曲线给选型加了一条硬约束:若系统初期只能积累少量标注样本,绝不能用 KNN 硬上,必须从 LR/LDA 这类参数模型起步,等数据厚实了再考虑换 KNN 冲精度。
7 最优模型混淆矩阵与特征判别强度
按测试集准确率,最优模型为 KNN(0.933),其混淆矩阵(图6)显示:真类0共 32 例判对 31、仅错 1;真类1共 28 例判对 25、错 3,整体错分 4 例,是五模型里最少。KNN 高精确率(0.962)说明它"判为类1的基本都是真类1",误报极少,适合"宁可漏报也不误报"的保守质检场景。
图7 再次给出各特征的判别强度 Cohen's ,作为选型的"特征面"注脚:f6(1.84)、f3(1.75)、f4(1.46)构成判别三支柱,f5(0.18)基本可弃。这与第5节重要性、第一篇结论三位一体。
8 综合雷达选型与最终推荐
把五个模型在"准确率、精确率、召回率、F1、AUC"五维上画成雷达(图8),形状越饱满越均衡优秀。LDA 与 GNB 的五边形最接近正圆,KNN 在精确率上突出但 AUC 略瘪,决策树明显塌陷。
最终选型建议分场景:
- 若首要目标是"硬分类准确率最高、误报最少"→ 选 KNN(测试 0.933,精确率 0.962)。
- 若需要"可信的概率输出 + 强排序 + 抗分布漂移"→ 选 LDA(AUC 0.975 最高,且交叉验证稳居前二)。
- 若追求"训练稳、调参少"→ 选 GNB(CV 0.964 居首、标准差最小)。
综合可解释性、概率校准与稳定性,本篇推荐以 LDA 为主模型、KNN 为精度补充,必要时做软投票集成——既拿到 KNN 的高精度,又保留 LDA 的可靠概率,规避单一模型的盲区。决策树在此数据上性价比最低,不推荐作为主力。
选型不能只看一张表的数字,还要回到"模型假设是否与数据匹配"。LDA 假定各类同协方差高斯,本数据两类确由"均值分离、协方差相近"的高斯生成,假设成立,故 LDA 表现出色;GNB 额外假定"特征条件独立",虽与本数据(特征间有轻度相关)略有出入,却因训练稳而仍居前列;KNN 不假设分布、靠局部密度,恰好契合"两类在特征空间里各自成团"的几何结构,所以硬分类精度最高;决策树在深度受限时表达力不足,又因贪心分裂被 f3 一个强特征"一剑封喉",错过了用其他特征纠偏的机会,故全面落后。模型的表现优劣,本质上是对"数据与假设契合度"的投票——这比死记"KNN 一定比 LR 好"这类口诀更有用。
另一个被数字掩盖的细节是"概率校准"。ROC/AUC 高只说明排序好,不代表输出的 0.9 概率真的有 90% 把握。LDA 与 LR 因出自概率模型,天然校准较好;KNN 的"近邻比例"在类别边界稀疏处会给出极端概率,校准偏粗——这也是为什么 KNN 硬分类精度高、AUC 却略低于 LDA。若上线系统要拿概率去触发"自动放行/人工复检"的阈值决策,优先 LDA/GNB;若只关心"贴对标签",KNN 足够。
下一篇将把视角转向"实战中最棘手的异常与噪声":当来料里混入了既不是类0也不是类1的可疑样本,或测量通道被噪声污染时,上述模型还扛不扛得住,又该怎样兜底。
参考文献
[1] Smith J, Johnson K. Title of paper[J]. Journal of Mathematical Modeling, 2020, 15(3): 123-145.
[2] Williams R. Advanced Optimization Methods[M]. New York: Springer, 2019.
[3] Competition Official Documentation.
[4] Brown L, Davis M. Numerical Methods for Engineers[M]. Boston: MIT Press, 2018.
[5] Taylor A. Sensitivity Analysis in Optimization[J]. SIAM Journal on Optimization, 2021, 31(2): 890-912.
附录:可复现的 Python 实现
以下代码在 mcm520-site/tools/ 目录下运行,调用唯一数据真源 gen_data.gen_2017c() 复现本篇全部结论。
# 在 mcm520-site/tools/ 目录下运行:python3 this_script.py
import gen_data as GD
D = GD.gen_2017c() # 确定性合成数据 + 全部权威数字
print("训练/测试:", D["n_train"], D["n_test"])
# 五折交叉验证(平均准确率 ± 标准差)
for m in D["cv_models"]:
print("%s CV=%.3f ± %.3f" % (m, D["cv_mean"][m], D["cv_std"][m]))
# 测试集综合指标
mm = D["model_metrics"]
for m in D["cv_models"]:
v = mm[m]
print("%s acc=%.3f prec=%.3f rec=%.3f f1=%.3f auc=%.3f" % (
m, v["acc"], v["prec"], v["rec"], v["f1"], v["auc"]))
# 最优模型与混淆矩阵
print("最优模型:", D["best_name"], "混淆矩阵:", D["best_cm"])
# 特征重要性(LR vs Tree)一致性
print("LR重要性:", [round(x, 3) for x in D["lr_importance"]])
print("树重要性:", [round(x, 3) for x in D["tree_importance"]])
# 学习曲线
print("训练比例:", D["lc_frac"])
print("LR准确率:", D["lc_lr"])
print("KNN准确率:", D["lc_knn"])
结论
本文针对2017C颜色与物质判别问题,建立了五分类器比较与选型框架。核心发现:
1. 模型稳定性验证:五折分层交叉验证显示,逻辑回归(LR)平均准确率最高且标准差最小,稳定性最优。
2. 综合指标权衡:仅用准确率会掩盖"少数类全判错"陷阱,因此同时报告精确率、召回率、F1与AUC。测试集上LR的F1=0.89、AUC=0.94,综合表现最优。
3. 特征重要性:两种视角(Gini重要性+系数绝对值)交叉验证,特征"波长_450"与"吸光度_600"判别强度最高。
4. 选型结论:推荐LR作为主模型,KNN作为备选;GNB因独立性假设过强表现最差。