ISAS 与 OSAS:同一条流,两种搭法
这一章不教你怎么用 SPSS Modeler 或 pandas,教你怎么把九步映射到具体的节点和代码,以及在 OSAS 那次怎么给五个工具分工——因为课程列出的开源栈有 Python、Jupyter、MySQL、MySQL Workbench、Kettle、Tableau、Weka 七样,而你只有两周。正确策略不是每个都深用,是每个都留一处证据。
ISAS:一条流的标准骨架
SPSS Modeler 的流是从左到右的一条链,而它的节点顺序几乎就是九步的顺序——这是它在这门课里最大的优势:流的截图本身就是方法论证据。
| 九步 | 节点 | 要点 |
|---|---|---|
| 2.1 收集 | Var. File(读 CSV)或 Database | 读进来先点 Preview 确认分隔符与类型没错 |
| 2.2 / 2.4 描述与质量 | Data Audit | 本次迭代最重要的一个节点。一次给出类型、缺失、极值、偏度、直方图。Quality 页签直接截图进 2.4 |
| 2.3 探索 | Statistics(相关)、Plot、Histogram、Graphboard | 相关矩阵在 Statistics 节点里勾 Correlations |
| 3.1 选择 | Filter(去列)、Select(去行) | 用 Filter 排除泄漏列,并在节点注释里写明理由(节点可以加注释!) |
| 3.2 清洗 | Filler(替换值)、Distinct(去重)、Data Audit → Generate → Missing Values SuperNode | 哨兵值 999 → 空用 Filler;去重用 Distinct 并指定键 |
| 3.3 构造 | Derive | 造 log_gdp 就在这里:log10(gdp_pc) |
| 3.4 整合 | Merge(join)、Append(union) | Merge 之后立刻接一个 Table 节点数行数 |
| 3.5 格式化 | Type(设角色)、Reclassify、Transform | Type 节点是关键:把目标设成 Target、无用列设成 None、其余 Input |
| 4 变换 | PCA/Factor、Feature Selection | PCA/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
- 整条流的全景图一张——它是 Step 3–7 的目录。
- 每个关键节点的设置对话框各一张:Filler 的条件、Partition 的比例与种子、C5.0 的参数。报告里「参数怎么填的」靠这些图,而不是靠你回忆。
- 每个输出各一张:Data Audit 的两个页签、Analysis 的混淆矩阵、Evaluation 的四张图、nugget 的树形。
- 给节点加注释。右键节点 → Annotations,写一句「排除 rate_reported:目标泄漏」。这些注释会显示在流上,于是你的全景截图自带解释。这是 ISAS 这次最省事的一个加分动作。
另外:流文件(.str)本身要提交,因为 Step 7.2 要求 models must execute。提交前重新打开一次确认路径没写死到机房的某个盘符——把数据文件和 .str 放同一个文件夹,用相对路径。
OSAS:五个工具的分工
课程给的开源栈很长,但你不需要平均用力。下面这个分工能让每个工具都在报告里留下一处证据,同时把主要工作留在你最快的那个工具里:
| 工具 | 负责哪一步 | 留下什么证据 | 时间 |
|---|---|---|---|
| MySQL + Workbench | 2.1 数据落库、3.1 选择 | 一段建表 SQL + 一段带 WHERE/JOIN 的查询截图;ER 图(Workbench 能自动生成) | 1 h |
| Kettle(Spoon) | 3.2 清洗、3.5 格式化 | 一条可视化转换(transformation)截图:CSV input → Data validator → Replace in string → Unique rows → Table output | 2 h |
| Python / Jupyter | 主线:3.3、4、6、7、8 | Notebook,从上到下可重跑 | 6 h |
| Weka | 6.2 多算法快速对比 | Explorer 的 Classify 页签截图:J48、NaiveBayes、IBk 三个算法的混淆矩阵与 Kappa | 1 h |
| Tableau | 2.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=y与random_state=42—— 第 17 章的分层与可复现。ColumnTransformer包住填补与缩放 —— 第 13 章的预处理泄漏防线。handle_unknown='ignore'—— 第 11 章那个「列规格要冻住」的 bug。- 最后那个阈值循环 —— 第 18 章的代价表,五行代码换 Step 8 里一整块分。
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 Modeler | Python |
|---|---|---|
| 2.2 描述 | Data Audit | df.describe(include='all') |
| 2.3 相关 | Statistics(Correlations) | df.corr(numeric_only=True) |
| 3.1 去列 | Filter | df.drop(columns=[...]) |
| 3.2 哨兵值 | Filler | df.replace(999, np.nan) |
| 3.2 去重 | Distinct | df.drop_duplicates(subset=keys) |
| 3.2 填补 | Missing Values SuperNode | SimpleImputer(strategy='median') |
| 3.3 构造 | Derive | df['log_gdp'] = np.log10(df['gdp_pc']) |
| 3.5 角色 | Type | (无对应;由 X/y 的划分表达) |
| 4.1 PCA | PCA/Factor | PCA(n_components=2) |
| 7.1 划分 | Partition(Stratify by) | train_test_split(stratify=y) |
| 6 建模 | C5.0 / Logistic | DecisionTreeClassifier / LogisticRegression |
| 8.1 混淆矩阵 | Analysis | confusion_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 分钟。