卷 VI · 交付CH 22工位 22/24

ISAS 与 OSAS:同一条流,两种搭法

工位 Iteration 2 / 3 各 23% 46% 合计 评分员在找:每个步骤都有对应的实现证据(节点截图/代码单元),而且五个开源工具你都碰过——哪怕每个只用一处。

这一章不教你怎么用 SPSS Modeler 或 pandas,教你怎么把九步映射到具体的节点和代码,以及在 OSAS 那次怎么给五个工具分工——因为课程列出的开源栈有 Python、Jupyter、MySQL、MySQL Workbench、Kettle、Tableau、Weka 七样,而你只有两周。正确策略不是每个都深用,是每个都留一处证据。

SPSS Modeler节点映射五工具分工截图纪律

ISAS:一条流的标准骨架

SPSS Modeler 的流是从左到右的一条链,而它的节点顺序几乎就是九步的顺序——这是它在这门课里最大的优势:流的截图本身就是方法论证据。

九步节点要点
2.1 收集Var. File(读 CSV)或 Database读进来先点 Preview 确认分隔符与类型没错
2.2 / 2.4 描述与质量Data Audit本次迭代最重要的一个节点。一次给出类型、缺失、极值、偏度、直方图。Quality 页签直接截图进 2.4
2.3 探索Statistics(相关)、PlotHistogram、Graphboard相关矩阵在 Statistics 节点里勾 Correlations
3.1 选择Filter(去列)、Select(去行)用 Filter 排除泄漏列,并在节点注释里写明理由(节点可以加注释!)
3.2 清洗Filler(替换值)、Distinct(去重)、Data Audit → Generate → Missing Values SuperNode哨兵值 999 → 空用 Filler;去重用 Distinct 并指定键
3.3 构造Derivelog_gdp 就在这里:log10(gdp_pc)
3.4 整合Merge(join)、Append(union)Merge 之后立刻接一个 Table 节点数行数
3.5 格式化Type(设角色)、Reclassify、TransformType 节点是关键:把目标设成 Target、无用列设成 None、其余 Input
4 变换PCA/Factor、Feature SelectionPCA/Factor 自带碎石图与载荷表
7.1 测试设计Partition设 70/30 与随机种子;它必须在建模节点之前。它是随机划分——要分层用 Sample 节点的 Stratified 模式,或划分后用 Distribution 节点核对两侧类别比例并写进报告
6 / 7.2 建模C5.0 / CHAID / Logistic / Random Trees / Auto Classifier建完生成金色模型块(nugget)。在 C5.0 里试一次 Misclassification costs(第 18 章)
8.1 / 8.4 评估Analysis(勾 Coincidence matrices、Evaluation metrics)给混淆矩阵、准确率、Kappa
8.2 可视化Evaluation(Gains / Response / Lift / Profit)四张图一次到手,第 19 章说的就是它。记得设成只用 Testing 分区

连起来是这样一条流(每个箭头是一根连线):

Var.File → Data Audit
         ↘ Filter → Filler → Distinct → Derive → Type → Partition → C5.0
                                                                  ↘ nugget → Analysis
                                                                           → Evaluation
✎ ISAS 的四条截图纪律(在机房时就要做完)
  1. 整条流的全景图一张——它是 Step 3–7 的目录。
  2. 每个关键节点的设置对话框各一张:Filler 的条件、Partition 的比例与种子、C5.0 的参数。报告里「参数怎么填的」靠这些图,而不是靠你回忆。
  3. 每个输出各一张:Data Audit 的两个页签、Analysis 的混淆矩阵、Evaluation 的四张图、nugget 的树形。
  4. 给节点加注释。右键节点 → Annotations,写一句「排除 rate_reported:目标泄漏」。这些注释会显示在流上,于是你的全景截图自带解释。这是 ISAS 这次最省事的一个加分动作。

另外:流文件(.str)本身要提交,因为 Step 7.2 要求 models must execute。提交前重新打开一次确认路径没写死到机房的某个盘符——把数据文件和 .str 放同一个文件夹,用相对路径。

OSAS:五个工具的分工

课程给的开源栈很长,但你不需要平均用力。下面这个分工能让每个工具都在报告里留下一处证据,同时把主要工作留在你最快的那个工具里:

工具负责哪一步留下什么证据时间
MySQL + Workbench2.1 数据落库、3.1 选择一段建表 SQL + 一段带 WHEREJOIN 的查询截图;ER 图(Workbench 能自动生成)1 h
Kettle(Spoon)3.2 清洗、3.5 格式化一条可视化转换(transformation)截图:CSV input → Data validator → Replace in string → Unique rows → Table output2 h
Python / Jupyter主线:3.3、4、6、7、8Notebook,从上到下可重跑6 h
Weka6.2 多算法快速对比Explorer 的 Classify 页签截图:J48、NaiveBayes、IBk 三个算法的混淆矩阵与 Kappa1 h
Tableau2.3 探索、8.2 可视化一个仪表板:地区地图/分布图/目标 vs 特征散点/增益图2 h

为什么这个分工是对的:它让每个工具做自己最擅长的事,而且每个工具的产出都能直接对应报告的某一节。报告里写一段「工具选择理由」,Step 1.2 的资源盘点就活了:

工具分工与理由(Iteration 3)
· MySQL:数据以关系表存储,便于版本控制与多次查询;选择逻辑
  (3.1)以 SQL 表达,可复现且易审阅。
· Kettle:清洗步骤以可视化转换实现,每个 step 对应 3.2 的一项
  处置,非技术读者亦可审阅数据流向。
· Python/Jupyter:承担特征构造、建模与评估,因其生态最完整
  且便于与 Iteration 4 的 PySpark 对齐。
· Weka:用于 6.2 的多算法横向比较(J48/NaiveBayes/IBk),
  其 Explorer 界面可在数分钟内产出可比的混淆矩阵与 Kappa。
· Tableau:承担 2.3 与 8.2 的可视化,输出交付给决策者的仪表板。

Python 主线的 Notebook 骨架

Notebook 的单元格结构就照九步编号,每个 Markdown 单元用 ## 3.2 Clean the data 当标题。这样做有个隐藏好处:导出 PDF 之后,Notebook 本身就是报告的附录,而且编号能对上正文。

## 7.1 Test design ────────────────────────────────
from sklearn.model_selection import train_test_split, StratifiedKFold, cross_validate
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

X = df[num_cols + cat_cols]
y = (df['u5mr'] > 25).astype(int)          # 阈值来自 SDG 3.2.1

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.30, stratify=y, random_state=42)   # 分层 + 固定种子

pre = ColumnTransformer([
    ('num', Pipeline([('imp', SimpleImputer(strategy='median')),
                      ('sc',  StandardScaler())]), num_cols),
    ('cat', OneHotEncoder(handle_unknown='ignore', drop='first'), cat_cols),
])   # 所有统计量只在 fit 时从训练集算 —— 这就是防预处理泄漏的写法

## 6.2 Algorithm selection ────────────────────────
models = {
    'logreg': LogisticRegression(max_iter=1000, class_weight='balanced'),
    'tree':   DecisionTreeClassifier(max_depth=2, min_samples_leaf=12, random_state=42),
}
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for name, clf in models.items():
    pipe = Pipeline([('pre', pre), ('clf', clf)])
    cvres = cross_validate(pipe, X_train, y_train, cv=cv,
                           scoring=['accuracy', 'f1', 'roc_auc'])
    print(name, {k: f'{v.mean():.3f} ± {v.std():.3f}'
                 for k, v in cvres.items() if k.startswith('test_')})

## 7.2 Execute + 8.1 Evaluate ─────────────────────
best = Pipeline([('pre', pre), ('clf', models['logreg'])]).fit(X_train, y_train)
proba = best.predict_proba(X_test)[:, 1]

## 8.4 阈值扫描(第 18 章的代价表)
for t in [0.1, 0.15, 0.2, 0.3, 0.5, 0.7]:
    pred = (proba >= t).astype(int)
    tn, fp, fn, tp = confusion_matrix(y_test, pred).ravel()
    print(f'thr={t:.2f} recall={tp/(tp+fn):.3f} prec={tp/(tp+fp):.3f} '
          f'FN={fn} FP={fp} cost(10:1)={fn*10+fp}')

四个细节值得指出,它们各对应前面某一章的结论:

  • stratify=yrandom_state=42 —— 第 17 章的分层与可复现。
  • ColumnTransformer 包住填补与缩放 —— 第 13 章的预处理泄漏防线。
  • handle_unknown='ignore' —— 第 11 章那个「列规格要冻住」的 bug。
  • 最后那个阈值循环 —— 第 18 章的代价表,五行代码换 Step 8 里一整块分。
⚠ OSAS 那次的三个常见失分点

1. Notebook 不能从头跑通。你在探索时会来回改单元格,最后的执行顺序和呈现顺序不一致。提交前必须 Restart Kernel and Run All,看到全部单元格无错。这是 Step 7.2「models must execute」的直接检查项。

2. Tableau 只做了一张饼图。Tableau 在这门课的价值是给决策者的仪表板:至少三个视图(地图或条形排名 + 分布 + 增益/散点),一个筛选器。并在报告里写「该仪表板对应 9.1 的交付形式」——把它和部署方案挂起来。

3. Weka 跑完不写结论。Weka 那三个算法的对比要写成一句:「Weka 的 10 折交叉验证结果(J48 Kappa 0.59、NaiveBayes 0.68、IBk 0.69)与 Python 侧一致,交叉印证了实现的正确性。」「交叉印证」是这次迭代能拿到的最漂亮的一句话——两个独立实现得到相近结果,是可复现性的直接证据。

⇄ 九步 → SPSS 节点 → Python 一行对照(可以贴进报告当附录)
步骤SPSS ModelerPython
2.2 描述Data Auditdf.describe(include='all')
2.3 相关Statistics(Correlations)df.corr(numeric_only=True)
3.1 去列Filterdf.drop(columns=[...])
3.2 哨兵值Fillerdf.replace(999, np.nan)
3.2 去重Distinctdf.drop_duplicates(subset=keys)
3.2 填补Missing Values SuperNodeSimpleImputer(strategy='median')
3.3 构造Derivedf['log_gdp'] = np.log10(df['gdp_pc'])
3.5 角色Type(无对应;由 X/y 的划分表达)
4.1 PCAPCA/FactorPCA(n_components=2)
7.1 划分Partition(Stratify by)train_test_split(stratify=y)
6 建模C5.0 / LogisticDecisionTreeClassifier / LogisticRegression
8.1 混淆矩阵Analysisconfusion_matrix
8.2 增益Evaluation(Gains/Lift)手写分箱(第 19 章)

这张表贴进 OSAS 报告的附录,能同时证明两件事:你理解方法论与工具无关(LO2 的原话是 compare, contrast and synthesise a process),以及你真的两条线都做了。

▣ 本章交付物 —— 两次迭代分别交什么

Iteration 2(ISAS):① 报告(Step 1–8,编号对齐);② .str 流文件(用相对路径);③ 全景流截图 + 关键节点设置截图 + 全部输出截图;④ 节点注释里写着排除理由与参数依据。

Iteration 3(OSAS):① 报告(Step 1–2、5 可复用 ISAS 的,3–8 重写);② Notebook(.ipynb 且 Restart & Run All 通过);③ 五工具各一处证据(SQL、Kettle 转换、Notebook、Weka 截图、Tableau 仪表板);④ 工具分工与理由那一段;⑤ 一节「与 Iteration 2 的结果对比」——指标差异及其原因(划分方式不同、默认参数不同、编码方式不同)。

第 ⑤ 项是 OSAS 那次最容易被忽略的加分项,因为课程的整个设计就是为了让你做这个对比。

这一章的一句话

SPSS Modeler 的节点顺序几乎就是九步顺序,所以流的截图+节点注释本身就是方法论证据;OSAS 那次不要平均用力——MySQL 存、Kettle 清、Python 建模、Weka 横比、Tableau 出板,每个工具留一处证据,再补一节「与 ISAS 的结果对比」。

下一章是环境风险最高的一次迭代:AWS EC2 上的 PySpark。它有三处思维差会让熟悉 pandas 的人栽跟头,而其中最贵的一个叫数据倾斜——一个热键能让作业从 2.7 分钟变成 77 分钟。