淘洗 INFOSYS 722 预习手记 §0 · 这门课的地图

Data Mining & Big Data · 从零预习

淘洗

机器学习的模型只会给你「它以为对」的答案。这门课真正教的,是把一大堆脏数据,一步步淘洗成一个能落地的决策。这本手记把你要预习的地基,用能上手拖动的方式讲给你听。

噪声 → 信号:模型做的就是这件事
无笔试 · 项目制 2026 S2 · 7/20 开课 课程细节据近版大纲(≈2024–25) 权重/迭代数 待 Canvas

写给已经会写代码、但 pandas 生疏、sklearn / Spark 没碰过的你。数学不回避——你有线代底子,正好把公式看穿。

00 先看地图

一张图看懂这门课在干什么

这门课不教你「新算法」,教你一套把数据变成决策的标准流程,然后逼你用不同工具把同一个项目重做几遍。流程用的是 OSEMN 五步(也会提 CRISP-DM 六阶段,本质一样)。

这门课的招牌结构 同一个项目 → 至少三套工具各做一遍(商业方案 SPSS Modeler → 开源方案 Python/Weka/Kettle → 大数据方案 PySpark on AWS),另有微软 Azure ML 供自学、不计分。每一遍都按 OSEMN 写一份结构化报告。分数几乎全在这个「一题多做 + 报告」上,而不在算法难度上。(🕓 结构据近版大纲,确切迭代数/权重待 Canvas。)

下面按 OSEMN 顺序走一遍。Model 那节是重头——四个能拖的 demo 都在那里。

O Obtain · 取数

把数据读进来

数据来自 CSV、Excel、数据库(课程会用 MySQL)、API。开源迭代里你 99% 的时间在一个 DataFrame 里活动——把它想成「带列名和类型的二维表」,或者一张能用代码操作的 Excel。

# pandas:一张表就是一个 DataFrame
import pandas as pd
df = pd.read_csv("life_expectancy.csv")   # 也有 read_excel / read_sql
df.shape          # (行数, 列数)
df.head()          # 前 5 行 —— 拿到数据第一件事永远是"看一眼"
df.info()          # 每列的类型 + 有多少非空
df["Status"].value_counts()   # 某一分类列的取值分布
对齐到 SDG期末项目要挂靠联合国 17 个可持续发展目标之一。好上手的公开数据:WHO Life Expectancy(Kaggle,回归,对齐 SDG 3 健康)、World Bank / Our World in Data 的能源可及性(SDG 7)、贫困指标(SDG 1)。选一个「列不多、有明确预测目标」的,别一上来就啃几百列的巨表。

S Scrub · 淘洗

真实数据是脏的(这一步最花时间)

没人会提前警告你:一个数据项目里,六七成时间在洗数据,不在建模。缺失值、类型不对、重复行、异常值、分类要编码、量纲要统一——课程报告里这一步写得扎不扎实,直接决定分数。下面这张脏表,点一下看它被洗干净:

脏 → 净 · 点击切换
国家年份寿命GDP状态

淘洗清单 每一项在报告里都要交代

# 1) 缺失值:先看有多少,再决定填还是删
df.isna().sum()
df["GDP"] = df["GDP"].fillna(df["GDP"].median())  # 中位数比均值抗异常值
# 2) 类型:字符串数字要转成数值;日期要转成 datetime
df["Year"] = pd.to_numeric(df["Year"], errors="coerce")
# 3) 重复行
df = df.drop_duplicates()
# 4) 分类变量 → 数值(模型只吃数字)
df = pd.get_dummies(df, columns=["Status"])   # one-hot
# 5) 量纲统一(对距离/梯度类模型很关键,见"探查"与"过拟合")
from sklearn.preprocessing import StandardScaler
X = StandardScaler().fit_transform(X)

课程的 Kettle/Spoon(Pentaho)就是把上面这些步骤画成可视化流程图的 ETL 工具——同样的清洗,换成拖拽节点。理解了代码版,GUI 版一看就懂。

E Explore · 探查

先看再建模:相关有多强,长什么样

建模前先用图和统计量「摸」一遍数据。最常问的一句:两个变量相关吗?相关系数 r 从 −1 到 +1。但光看数字没感觉——拖下面的滑块,亲眼看看 r=0.2r=0.9 的点云差多少。

相关系数 r · 拖动感受
样本 r(实测)
r²(可解释的方差占比)

r 不是因果,也看不出曲线关系——所以要「先画图」。相关强 ≠ 关系简单:这正是下一节要建模的原因。

# 探查三件套
df.describe()              # 每列的均值/分位数/极值
df.corr()                  # 相关矩阵(挑和目标最相关的特征)
df.plot.scatter(x="GDP", y="Life")   # 一图胜千言

M Model · 建模(重头)

机器学习的骨架,其实就三行

sklearn 把所有模型收敛成同一套 API——这是你要抓住的唯一心智模型

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)     # ① 学:从数据里估参数
pred  = model.predict(X_test)     # ② 用:对新数据出预测
# 换任何模型(逻辑回归/决策树/随机森林/KMeans),都是这三步。

换模型 = 换第一行的类名,.fit / .predict 不变。所以「学 sklearn」不是学 100 个 API,是学一个 API 用在 100 个模型上。下面四个 demo 把最常考的概念拆开给你摸。

① 线性回归 = 找一条最省力的直线 最小二乘

拖动黑点,那条金线是让所有点到线的竖直距离平方和最小的直线(最小二乘)。 越接近 1,直线解释得越好;RMSE 是平均误差,越小越好。这就是 LinearRegression 内部在解的东西。

最小二乘 · 拖动黑点
数据点(可拖)拟合直线残差
斜率 β₁
截距 β₀
RMSE

② 分类 = 画一条分界线 逻辑回归 · 混淆矩阵

预测「是/否」(还款/违约、患病/健康)就是分类。逻辑回归本质是找一条把两类分开的直线。这里让你亲手拖这条线的两个端点——sklearn 是用数学自动找它,但先自己找一遍,你就懂什么叫「线性可分」,以及为什么光看准确率会骗人

决策边界 · 拖两端点分开两类
真实 A 类(●) 真实 B 类(■) 被分错(✗)
预测 A
预测 B
真 A
TP ✓
FN ✗
真 B
FP ✗
TN ✓
准确率 accuracy
精确率 precision(A)
召回率 recall(A)

试着把线拖到只圈住一小撮 A:准确率也许还行,但召回率掉下去了——漏掉了真正的 A。课程报告里,你要能解释为什么在你的 SDG 场景下该看 precision 还是 recall。

③ 过拟合 = 把噪声也背下来了 训练/测试 · 最该懂的一课

模型越复杂,训练误差一定越小——但那可能只是把噪声硬记下来。真正要看的是没见过的测试误差。拖动「复杂度」,看两条误差怎么分道扬镳:这就是为什么必须 train_test_split

多项式次数 · 拖动看训练 vs 测试
训练 RMSE
测试 RMSE
诊断
训练点 测试点 模型曲线

次数=1 太简单(欠拟合,两条都高);次数拉满,训练误差贴地、测试误差反弹(过拟合)。最优复杂度在中间——课程里的「模型选择」就是在找这个甜点。

④ 聚类 = 没有标签,自己找抱团 K-Means · 无监督

前三个都有「正确答案」(监督学习)。聚类没有——只有一堆点,让算法自己分组。K-Means 反复做两件事:把每个点归给最近的质心 → 把质心挪到各组中心。点「迭代一步」看它收敛。

K-Means · 逐步收敛

质心(金色环)从随机位置开始,几步就稳定。初始位置会影响结果——所以真实的 KMeans 会多跑几次取最好的(n_init)。

N iNterpret · 解读

把数字翻译成一个决策(这步对你最新鲜)

建模对你不难。这门商学院课真正要你练的、也是打分重头的,是最后一步的商业翻译:模型说 β₁=0.8 或「这个郡的辍学风险 73%」——所以呢?该做什么?

模型输出

GDP 每升一档,预期寿命 +0.8 年(系数)。

翻成人话

经济与健康强相关,但这是相关不是因果,且有天花板。

给出决策

对齐 SDG 3:在低 GDP 高风险郡,优先投基础医疗,而非平摊。

评分雷达报告里每个迭代都要回答:你解决的是哪个 SDG / 决策问题?数据支不支持结论?局限在哪(偏差、缺失、因果)?换成决策者,下一步做什么? 工程实现只是入场券,这层叙事才拉开分差。

一题多做

同一个模型,三套工具各写一遍

这是课程的核心工作量。好消息:底层是同一件事。下面是「训练一个逻辑回归」在三种迭代里的样子——切开看,你会发现大数据那套也没多神秘。

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
Xtr,Xte,ytr,yte = train_test_split(X, y, test_size=0.3)
clf = LogisticRegression().fit(Xtr, ytr)
clf.score(Xte, yte)          # 准确率
# 同一个模型,跑在 Spark 上(单机或集群,代码一样)
from pyspark.sql import SparkSession
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import VectorAssembler
spark = SparkSession.builder.master("local[*]").getOrCreate()
df = spark.read.csv("data.csv", header=True, inferSchema=True)
df = VectorAssembler(inputCols=cols, outputCol="features").transform(df)
tr, te = df.randomSplit([0.7, 0.3])
clf = LogisticRegression(labelCol="y").fit(tr)   # 还是 .fit
# SPSS Modeler:没有代码,是一张"流"图,拖节点连线
[数据源] → [类型] → [数据分区] → [逻辑回归节点] → [分析]
# ① 读 CSV   ② 定义哪列是目标   ③ 切 训练/测试
# ④ 双击设参数   ⑤ 跑,右键看混淆矩阵与准确率
# 概念完全一样:读→切→拟合→评估。只是用鼠标而不是键盘。
"不就跑跑脚本吗?"——诚实回答在这门课里,基本上是的:PySpark 跑在单台机器、模型是入门级。大数据真正难的部分(分布式调度、shuffle、数据倾斜、容错、流式)不是这门课的重点。它给你的是广度和一个能写进作品集的完整项目,不是分布式系统的深度。看下一节,把这条边界划清楚。

Big Data

Spark 的心智模型:什么时候「跑脚本」不再够用

你直觉「不就跑脚本」——单机、几万行时,。Spark 的存在是为了另一种情形:数据大到一台机器装不下。它把表切成很多分区,散到多台机器并行算。两个关键概念值得先记住:

惰性求值 lazy

filter / select / join 这些转换不立刻算,只记账。直到遇到 count / show / write 这种动作,才真正开跑——Spark 借这段延迟做全局优化。

分区并行 partition

数据分块并行是免费午餐;但需要跨机器搬数据的操作(groupByjoin 触发的 shuffle)很贵——这才是大数据真正的难点所在。

课程让你在 AWS EC2 上跑一遍,是为了让你见过这套范式:同样的 .fit(),底下可能是一个集群。真要征服「大数据没那么简单」,得靠分布式系统/海量数据算法那类课——但作为见世面 + 低风险学分,这门够用了。

本机就能预习你是 Android 老兵,机器上已经有 JDK——PySpark 本地零配置:SparkSession.builder.master("local[*]") 直接起,先不用碰 AWS。等开课再上云。

工具速览

那些你平时不碰的老派工具,一眼过

这门课的新鲜面主要在工具,不在算法。开课前混个脸熟,第一周就不慌。

SPSS Modeler 商业·计分

IBM 的拖拽式建模,无需写码。就是把 OSEMN 画成节点流。

坑:UI 老派、笨重;license 一般要选课后经 UoA 拿。

Weka 开源

老牌 Java 数据挖掘 GUI,内置一堆算法,点点就能跑分类聚类。

坑:数据要转 ARFF 格式;界面上世纪。

Kettle / Spoon 开源·ETL

Pentaho 的可视化 ETL,把「淘洗」画成流程图。

坑:本质是 §2 的清洗,别被 GUI 唬住。

Tableau 开源迭代·可视化

拖拽出交互图表和仪表盘,用来讲「解读」那一步的故事。

坑:学生版要申请;重表达、轻建模。

PySpark / AWS 大数据·计分

见 §7。EC2 起实例、PySpark 跑同一个模型。

坑:AWS 账单——用完关实例。

Azure ML / Power BI 微软·自学不计分

近版新增,官方明说供自学、不占成绩。有余力再碰。

坑:别为不计分的东西花大力气。

你的项目

选题 + 一份能拿分的报告骨架

期末只有一个大作业:一个能跑的分析原型,解决一个 SDG 或组织决策问题,用三套工具各做一遍。开课前可以先把选题想好。

怎么选一个不坑的题

每个迭代的报告骨架 按 OSEMN 套

段落写什么
业务/SDG 理解解决哪个目标?谁做决策?成功长什么样?
数据理解 · Obtain/Explore数据来源、字段、分布、和目标的相关。
数据准备 · Scrub缺失/异常/编码/量纲——每步为什么这么做。
建模 · Model选了什么模型、怎么切训练测试、调了什么。
评估 · iNterpret指标(选对 precision/recall/RMSE)+ 局限。
部署/决策结论翻成行动;这套工具的优劣评一句。

三个迭代同一套骨架、同一个问题,换工具重写。把第一个(sklearn 版)写扎实,后两个是"移植 + 对比",省一大半力气。

两周行动

加退课窗口内,半天就能跑通的预习

目标:亲手把这门课的缩影跑一遍,既补上 sklearn/Spark 的空白,也第一手判断它会不会闷到你。

  1. 30 min装环境。Miniconda + JupyterLab,pip install pandas scikit-learn matplotlib seaborn pyspark。你已有 JDK,PySpark 本地直接起。
  2. 15 min拿数据。下 WHO Life Expectancy(或任一 SDG 数据集),read_csv + head() 看一眼。
  3. 1–1.5 h走一遍脊柱。用 sklearn 把 O→S→E→M→N 跑通:清洗 → 画图 → 线性/逻辑回归 → 一句解读。这一步就回答了「是不是就跑跑脚本」。
  4. 30 min移植到 Spark。同一个模型换 PySpark MLlib 本地跑一遍——感受「一题多做」的真实成本。
  5. 做决策。建模对你 trivial 吗(大概率)?那就把价值押在 SDG 立意 + 作品集上。替代课都出局、734 也满了——留着就是当前最优解。
开课后第一件事Canvas 一上线,核对确切迭代数、评分权重、指定数据集——本手记里标 🕓/待确认 的都以官方大纲为准,届时我帮你逐条对齐。

附录

三张速查卡

pandas · 淘洗作用
df.head() / .info() / .describe()看结构、类型、统计
df.isna().sum()各列缺多少
df.fillna(...) / .dropna()填 / 删缺失
df.groupby("k")["v"].mean()分组聚合
pd.get_dummies(df, columns=[...])分类 → one-hot
scikit-learn · 建模作用
train_test_split(X, y, test_size=.3)切训练/测试(永远先做)
StandardScaler().fit_transform(X)标准化
LinearRegression() / LogisticRegression()回归 / 分类
KMeans(n_clusters=3)聚类(无监督)
classification_report(y, pred)准确/精确/召回一次出
PySpark · 大数据作用
SparkSession.builder.master("local[*]")本机起 Spark
spark.read.csv(..., inferSchema=True)读成 Spark DataFrame
VectorAssembler(...)把多列拼成特征向量(Spark 要求)
.randomSplit([.7,.3]) · .fit()切分 · 训练(和 sklearn 同构)