Data Mining & Big Data · 从零预习
淘洗
机器学习的模型只会给你「它以为对」的答案。这门课真正教的,是把一大堆脏数据,一步步淘洗成一个能落地的决策。这本手记把你要预习的地基,用能上手拖动的方式讲给你听。
写给已经会写代码、但 pandas 生疏、sklearn / Spark 没碰过的你。数学不回避——你有线代底子,正好把公式看穿。
00 先看地图
一张图看懂这门课在干什么
这门课不教你「新算法」,教你一套把数据变成决策的标准流程,然后逼你用不同工具把同一个项目重做几遍。流程用的是 OSEMN 五步(也会提 CRISP-DM 六阶段,本质一样)。
下面按 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() # 某一分类列的取值分布
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.2 和 r=0.9 的点云差多少。
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 把最常考的概念拆开给你摸。
① 线性回归 = 找一条最省力的直线 最小二乘
拖动黑点,那条金线是让所有点到线的竖直距离平方和最小的直线(最小二乘)。R² 越接近 1,直线解释得越好;RMSE 是平均误差,越小越好。这就是 LinearRegression 内部在解的东西。
② 分类 = 画一条分界线 逻辑回归 · 混淆矩阵
预测「是/否」(还款/违约、患病/健康)就是分类。逻辑回归本质是找一条把两类分开的直线。这里让你亲手拖这条线的两个端点——sklearn 是用数学自动找它,但先自己找一遍,你就懂什么叫「线性可分」,以及为什么光看准确率会骗人。
试着把线拖到只圈住一小撮 A:准确率也许还行,但召回率掉下去了——漏掉了真正的 A。课程报告里,你要能解释为什么在你的 SDG 场景下该看 precision 还是 recall。
③ 过拟合 = 把噪声也背下来了 训练/测试 · 最该懂的一课
模型越复杂,训练误差一定越小——但那可能只是把噪声硬记下来。真正要看的是没见过的测试误差。拖动「复杂度」,看两条误差怎么分道扬镳:这就是为什么必须 train_test_split。
次数=1 太简单(欠拟合,两条都高);次数拉满,训练误差贴地、测试误差反弹(过拟合)。最优复杂度在中间——课程里的「模型选择」就是在找这个甜点。
④ 聚类 = 没有标签,自己找抱团 K-Means · 无监督
前三个都有「正确答案」(监督学习)。聚类没有——只有一堆点,让算法自己分组。K-Means 反复做两件事:把每个点归给最近的质心 → 把质心挪到各组中心。点「迭代一步」看它收敛。
质心(金色环)从随机位置开始,几步就稳定。初始位置会影响结果——所以真实的 KMeans 会多跑几次取最好的(n_init)。
N iNterpret · 解读
把数字翻译成一个决策(这步对你最新鲜)
建模对你不难。这门商学院课真正要你练的、也是打分重头的,是最后一步的商业翻译:模型说 β₁=0.8 或「这个郡的辍学风险 73%」——所以呢?该做什么?
模型输出
GDP 每升一档,预期寿命 +0.8 年(系数)。
翻成人话
经济与健康强相关,但这是相关不是因果,且有天花板。
给出决策
对齐 SDG 3:在低 GDP 高风险郡,优先投基础医疗,而非平摊。
↺ 一题多做
同一个模型,三套工具各写一遍
这是课程的核心工作量。好消息:底层是同一件事。下面是「训练一个逻辑回归」在三种迭代里的样子——切开看,你会发现大数据那套也没多神秘。
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 ② 定义哪列是目标 ③ 切 训练/测试 # ④ 双击设参数 ⑤ 跑,右键看混淆矩阵与准确率 # 概念完全一样:读→切→拟合→评估。只是用鼠标而不是键盘。
⣿ Big Data
Spark 的心智模型:什么时候「跑脚本」不再够用
你直觉「不就跑脚本」——单机、几万行时,对。Spark 的存在是为了另一种情形:数据大到一台机器装不下。它把表切成很多分区,散到多台机器并行算。两个关键概念值得先记住:
惰性求值 lazy
filter / select / join 这些转换不立刻算,只记账。直到遇到 count / show / write 这种动作,才真正开跑——Spark 借这段延迟做全局优化。
分区并行 partition
数据分块并行是免费午餐;但需要跨机器搬数据的操作(groupBy、join 触发的 shuffle)很贵——这才是大数据真正的难点所在。
课程让你在 AWS EC2 上跑一遍,是为了让你见过这套范式:同样的 .fit(),底下可能是一个集群。真要征服「大数据没那么简单」,得靠分布式系统/海量数据算法那类课——但作为见世面 + 低风险学分,这门够用了。
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 或组织决策问题,用三套工具各做一遍。开课前可以先把选题想好。
怎么选一个不坑的题
- 一句话能说清决策:「预测哪些郡辍学风险高,好把资源投过去」(SDG 4)。
- 数据现成、目标明确:有一列是你要预测的(回归=数值 / 分类=类别)。
- 规模适中:几千到几十万行足矣——大数据迭代靠「跑在 Spark 上」体现,不靠行数吓人。
每个迭代的报告骨架 按 OSEMN 套
| 段落 | 写什么 |
|---|---|
| 业务/SDG 理解 | 解决哪个目标?谁做决策?成功长什么样? |
| 数据理解 · Obtain/Explore | 数据来源、字段、分布、和目标的相关。 |
| 数据准备 · Scrub | 缺失/异常/编码/量纲——每步为什么这么做。 |
| 建模 · Model | 选了什么模型、怎么切训练测试、调了什么。 |
| 评估 · iNterpret | 指标(选对 precision/recall/RMSE)+ 局限。 |
| 部署/决策 | 结论翻成行动;这套工具的优劣评一句。 |
三个迭代同一套骨架、同一个问题,换工具重写。把第一个(sklearn 版)写扎实,后两个是"移植 + 对比",省一大半力气。
✓ 两周行动
加退课窗口内,半天就能跑通的预习
目标:亲手把这门课的缩影跑一遍,既补上 sklearn/Spark 的空白,也第一手判断它会不会闷到你。
- 30 min装环境。Miniconda + JupyterLab,
pip install pandas scikit-learn matplotlib seaborn pyspark。你已有 JDK,PySpark 本地直接起。 - 15 min拿数据。下 WHO Life Expectancy(或任一 SDG 数据集),
read_csv+head()看一眼。 - 1–1.5 h走一遍脊柱。用 sklearn 把 O→S→E→M→N 跑通:清洗 → 画图 → 线性/逻辑回归 → 一句解读。这一步就回答了「是不是就跑跑脚本」。
- 30 min移植到 Spark。同一个模型换 PySpark MLlib 本地跑一遍——感受「一题多做」的真实成本。
- —做决策。建模对你 trivial 吗(大概率)?那就把价值押在 SDG 立意 + 作品集上。替代课都出局、734 也满了——留着就是当前最优解。
▤ 附录
三张速查卡
| 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 同构) |