Step 6 续:五个算法同台,参数该填什么
「换个算法」在这门课里是成本最低的动作——几十毫秒的事。所以 Step 6 里跑三四个算法不是加分项,是应该做的最低限度。但有一个算法你一定要跑,而它连算法都算不上:全猜多数类。它的准确率是 0.576,而在你知道这个数字之前,所有其他数字都没有意义。
先立一个必须打赢的对手
| 算法 | 准确率 | 精确率 | 召回率 | F1 | AUC | Kappa |
|---|---|---|---|---|---|---|
| 全猜多数类 | 0.576 | 0 | 0 | 0 | 0.5 | 0 |
| 决策树(深度 4) | 0.799 | 0.742 | 0.803 | 0.772 | 0.897 | 0.592 |
| 逻辑回归 | 0.875 | 0.852 | 0.852 | 0.852 | 0.943 | 0.744 |
| KNN(k=5) | 0.847 | 0.791 | 0.869 | 0.828 | 0.916 | 0.691 |
| 朴素贝叶斯 | 0.840 | 0.779 | 0.869 | 0.822 | 0.932 | 0.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 | 轮廓系数 | 各簇大小 |
|---|---|---|---|
| 2 | 1789.81 | 0.377 | 231 / 249 |
| 3 | 1395.97 | 0.288 | 195 / 193 / 92 |
| 4 | 1301.38 | 0.275 | 120 / 180 / 1 / 179 |
| 5–7 | 1166 → 922 | 0.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 | 平均疫苗覆盖 | 能叫什么名字 |
|---|---|---|---|---|---|
| #1 | 195 | 16.9 | 1553 | 75.4 | 中等发展、多数达标 |
| #2 | 193 | 36.3 | 535 | 64.0 | 低收入高风险(重点投放对象) |
| #3 | 92 | 7.3 | 3916 | 83.1 | 高收入低风险(可减投) |
分群报告的价值不在轮廓系数,在最后一列。如果你能给每个簇起一个业务方听得懂的名字、并配一个不同的动作,这次分群就有价值;如果只能说「簇 1 的各项指标居中」,那它就是一次白做的分析。
| ISAS | OSAS | BDAS | |
|---|---|---|---|
| 多算法对比 | Auto Classifier 节点:一次跑十几个算法并排名。省事,但报告里要说明你看了哪些指标 | 写个 for 循环遍历模型列表 | 逐个建 Pipeline;CrossValidator 可做网格搜索 |
| 逻辑回归 | Logistic 节点 | LogisticRegression(C=..., max_iter=1000) | LogisticRegression(regParam=..., elasticNetParam=...) |
| 随机森林 | Random Trees 节点 | RandomForestClassifier | RandomForestClassifier(numTrees=...) |
| K-Means | K-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 之间跳——那你报哪一个?