卷 IV · 上机CH 16工位 16/24

Step 6 续:五个算法同台,参数该填什么

工位 STEP 6.2 据讨论选定算法 15% 的另一半 评分员在找:至少三个算法在同一个测试设计下的对比表,含一个基线;以及每个算法配一句「为什么它可能适合这份数据」。

「换个算法」在这门课里是成本最低的动作——几十毫秒的事。所以 Step 6 里跑三四个算法不是加分项,是应该做的最低限度。但有一个算法你一定要跑,而它连算法都算不上:全猜多数类。它的准确率是 0.576,而在你知道这个数字之前,所有其他数字都没有意义。

基线Kappa五算法对比K-Means轮廓系数

先立一个必须打赢的对手

算法准确率精确率召回率F1AUCKappa
全猜多数类0.5760000.50
决策树(深度 4)0.7990.7420.8030.7720.8970.592
逻辑回归0.8750.8520.8520.8520.9430.744
KNN(k=5)0.8470.7910.8690.8280.9160.691
朴素贝叶斯0.8400.7790.8690.8220.9320.678

第一行的意义:什么都不学、永远猜「达标」,也能拿 0.576 的准确率——因为测试集里 57.6% 的地区确实达标。所以「我的模型准确率 60%」这句话在这份数据上等于「我的模型没有学到东西」。

Kappa 那一列把这件事量化了。Cohen's Kappa 的定义是「实际一致率减去碰巧一致率,再除以剩余空间」——它把「瞎猜也能对」的部分扣掉了。基线的 Kappa 是 0,逻辑回归的 0.744 才是它真正的本事。报告里同时给准确率和 Kappa,比只给准确率专业一档,而 SPSS 的 Analysis 节点默认就会算它。

◆ 三种基线,选一个放进报告
基线用于怎么算
全猜多数类分类准确率 = 多数类占比。最低门槛
用上一期值当预测(naive forecast)回归/时序ŷ(t) = y(t−1)。时序任务里打不赢它的模型很常见
现行业务做法两者皆可第 5 章那个「按人口平摊,命中率约等于基础率」。这是最有说服力的基线,因为它回答了「用你的模型比现在好多少」

报告里至少写一个,最好写两个(技术基线 + 业务基线)。Step 8.4「assess and evaluate results」的第一句话就该是「基线是多少」。

五个算法,各自的性格

算法它假设了什么什么时候它会赢什么时候它会输
逻辑回归对数几率与特征是线性关系特征与目标关系单调、样本不多、需要解释系数方向。本例它赢了,因为数据本来就近似线性可分关系有强交互或阈值效应时
决策树无(可以拟合任何阈值结构)需要可读规则、有明显阈值效应、特征类型混杂单棵树方差大、容易过拟合。本例输了 0.076
KNN相近的样本有相近的标签局部结构复杂、样本量适中维度高(距离失效)、数据量大(预测慢)。必须先缩放
朴素贝叶斯特征之间条件独立极快、小样本也稳、文本分类的经典选择特征高度相关时假设被违反。本例七列相关系数普遍 > 0.7,假设明显不成立——但它照样拿到 0.840
随机森林/GBDT(本 demo 未含)表格数据的默认最强基线。三条产线都有不可解释;小样本上相对单棵树优势有限

朴素贝叶斯那一行值得多看一眼:它的核心假设在这份数据上明显不成立(第 12 章证明了七列高度共线),但它的 AUC 是 0.932,只比逻辑回归低 0.011。这是机器学习里一个反复出现的现象——假设被违反不等于模型没用。报告里可以写:「朴素贝叶斯的条件独立假设与 2.3 观察到的高相关性不符,但其排序能力(AUC 0.932)仍接近逻辑回归,说明该假设的违反主要影响概率校准而非排序。」这种句子是 Step 8.4 想要的那种讨论。

⚠ 别做的三件事

1. 别用默认参数跑完就报结果。Step 6.3 明确要 choose relevant parameters。至少扫一个参数(树的深度、KNN 的 k、逻辑回归的正则强度 C)并给一张表。

2. 别用测试集选参数。如果你按测试集准确率挑深度,那个测试集就变成了训练的一部分,报出来的分是虚高的。正规做法是三分:训练/验证/测试,或者在训练集上做 k 折交叉验证选参数,测试集只碰一次。这门课的数据量下,用 k 折更划算(第 17 章)。如果你确实是用测试集扫的参数,就在报告里诚实写明这个局限。

3. 别只报一个数字。准确率、精确率、召回率、F1、AUC 各回答不同的问题(第 18–19 章会逐个拆)。一个表五列,成本是零。

顺手做一次分群:k 该选几

即使你的主方法是分类,做一次分群也很值——它属于 Step 6.1「exploratory analysis」,而且能给 Step 8 提供另一个视角的证据。下面这台真的跑了 K-Means(k-means++ 播种),并算了轮廓系数:

k簇内平方和 WSS轮廓系数各簇大小
21789.810.377231 / 249
31395.970.288195 / 193 / 92
41301.380.275120 / 180 / 1 / 179
5–71166 → 9220.208–0.216都含一个 1 个样本的簇

三个观察:

  • WSS 单调下降,所以肘部法只能看拐点——这条曲线在 k=3 之后明显变平。
  • 轮廓系数最高在 k=2(0.377),和肘部法给的 k=3 不一致。两个判据打架时,选业务方能用的那个,并在报告里说明为什么。本例选 k=3 更有用,因为它给出了三档而不是两档,便于配三种不同的干预强度。
  • k ≥ 4 时出现只有 1 个样本的簇。那是第 10 章决定保留的极值自己占了一簇——这是「先做 Step 3 再做分群」的直接证据,也是 K-Means 对异常值敏感的现场。

k=3 的簇画像(Demo 里的表格是真算的):

样本数平均 u5mr平均人均 GDP平均疫苗覆盖能叫什么名字
#119516.9155375.4中等发展、多数达标
#219336.353564.0低收入高风险(重点投放对象)
#3927.3391683.1高收入低风险(可减投)

分群报告的价值不在轮廓系数,在最后一列。如果你能给每个簇起一个业务方听得懂的名字、并配一个不同的动作,这次分群就有价值;如果只能说「簇 1 的各项指标居中」,那它就是一次白做的分析。

⇄ 算法与分群在三条产线上
ISASOSASBDAS
多算法对比Auto Classifier 节点:一次跑十几个算法并排名。省事,但报告里要说明你看了哪些指标写个 for 循环遍历模型列表逐个建 Pipeline;CrossValidator 可做网格搜索
逻辑回归Logistic 节点LogisticRegression(C=..., max_iter=1000)LogisticRegression(regParam=..., elasticNetParam=...)
随机森林Random Trees 节点RandomForestClassifierRandomForestClassifier(numTrees=...)
K-MeansK-Means 节点(可看簇质心表)KMeans(n_clusters=3, n_init=10)KMeans(k=3, seed=42) + ClusteringEvaluator(算轮廓)
Weka(OSAS 里)Weka 的 Explorer 界面能一次跑 J48(C4.5)、NaiveBayes、IBk(KNN)并直接给出混淆矩阵与 Kappa。OSAS 那次用 Weka 做「多算法快速对比」、用 Python 做最终模型,是最省事也最好写的分工。

关于 Auto Classifier:它是 ISAS 那次的省时利器,但别让它替你思考。报告里要写「Auto Classifier 按 F1 排名的前三为 X/Y/Z,我们进一步检查了它们的混淆矩阵与阈值敏感性,最终选定 X,理由是……」——如果只贴一张排名截图,Step 6.2 的「据讨论选定」就没有讨论。

▣ 本章交付物 —— 报告里放什么

1. Step 6.2 的算法对比表:至少三个算法 + 一个基线,六列指标(准确率/精确率/召回率/F1/AUC/Kappa),全部在同一个测试设计下。

2. 每个算法一句「性格说明」:它假设了什么、在这份数据上为什么可能行或不行。这是 6.2「based on discussion」的那个 discussion。

3. 一张参数扫描表(承接第 15 章)+ 一句参数选定理由。

4. 分群小节(若做):k 的两种判据对照(WSS 曲线 + 轮廓系数表)、选定 k 的理由、簇画像表 + 每簇一个名字和一个动作

5. 一句诚实声明(如果你用测试集扫了参数):「本次参数选择基于测试集表现,存在乐观偏差;更严格的做法是在训练集内做 k 折交叉验证选参(见 8.4 局限性)。」

这一章的一句话

先立一个必须打赢的基线(全猜多数类 0.576、或现行业务做法),否则所有指标都没有意义;然后至少三个算法同台、每个配一句「它假设了什么」;分群的价值不在轮廓系数,在你能不能给每个簇起个名字、配个动作。

下一章是 Step 7 的前半段,也是这一卷最容易被忽略却最影响可信度的一节:测试设计。同一份数据、同一个算法,只换随机种子,准确率能在 0.847 到 0.910 之间跳——那你报哪一个?