MCM520 ← 资料站首页 2017C「颜色与物质判别」(二):多分类器比较与选型 打开交互阅读器 →

2017C「颜色与物质判别」(二):多分类器比较与选型

1 问题重述与建模思路

上一篇用 PCA、LDA、逻辑回归确认了"两类物质在颜色特征上可判别、信号充足"。但工程落地时并不会只用一个模型——不同的分类器各有假设与长短,选错模型可能带来不必要的错分或不可解释。本篇的目标是系统地比较五种典型分类器,用交叉验证与多指标选出最适合本题的模型,为质检判别系统的上线提供选型依据。

选取的五类模型覆盖了不同的归纳偏置:**逻辑回归(LR)**假定特征对数几率线性可加;**线性判别分析(LDA)**假定各类同协方差高斯;**K 近邻(KNN)**是非参数、靠局部相似度;**高斯朴素贝叶斯(GNB)**假定特征条件独立;**决策树(Tree)**用轴平行分割刻画非线性边界。它们从"线性→非参数→树"覆盖了光谱,比较结果本身就有方法论的普适价值。

全部实验基于同一份确定性数据(gen_2017c,seed=2017):140 条训练、60 条测试,特征经 z-score 标准化。所有数字与上一篇、出图脚本、本篇附录四处一致。

图1

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

图2

读表有几处反直觉但重要的发现:(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 暴露其软输出几乎不可用。

图3

一个关键经验:当一个模型的硬分类(准确率/F1)与软输出(AUC)严重背离时,它不适合做"带置信度"的判别。决策树正是如此——它能在阈值偏向某类时刷高召回,却给不出可信的概率。质检场景里,往往更看重"对可疑样本给出高置信度"而非" blindly 贴标签",因此 AUC 高的 LDA/GNB 实际更受青睐。

5 特征重要性:两种视角的交叉验证

"哪些颜色特征在判别中起决定作用"不仅关乎解释,也指导后续是否要删减冗余通道。用两种独立方法估计特征重要性(图4):逻辑回归取系数绝对值归一化,决策树取分裂的 Gini 增益归一化。

图4

特征 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 dd(f6>f3>f4>f5f6>f3>f4>f5)相互印证——三种互不相干的方法指向同一结论,是特征判别力结论可靠的最强证据。值得注意的是决策树完全忽略 f1、f5,因为它的贪心分裂一旦用 f3 切出纯节点就不再需要它们,这恰恰说明"树的重要性"测的是"边际贡献"而非"总信息量",与 LR 的"全局系数"互补,二者合看才不会偏信任一种。

6 学习曲线:数据量还够不够

选型还要考虑"如果以后多采些样本,模型还能涨多少"。学习曲线(图5)按训练样本比例 0.2→1.0 逐步训练,观察测试准确率随数据量的变化。

图5

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",误报极少,适合"宁可漏报也不误报"的保守质检场景。

图6

图7 再次给出各特征的判别强度 Cohen's dd,作为选型的"特征面"注脚:f6(1.84)、f3(1.75)、f4(1.46)构成判别三支柱,f5(0.18)基本可弃。这与第5节重要性、第一篇结论三位一体。

图7

8 综合雷达选型与最终推荐

把五个模型在"准确率、精确率、召回率、F1、AUC"五维上画成雷达(图8),形状越饱满越均衡优秀。LDA 与 GNB 的五边形最接近正圆,KNN 在精确率上突出但 AUC 略瘪,决策树明显塌陷。

图8

最终选型建议分场景:

  • 若首要目标是"硬分类准确率最高、误报最少"→ 选 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因独立性假设过强表现最差。