# 00 · 机器学习导论与建模流程 > AI生成|2026年10月26日|codebuddy **本篇目标**:建立机器学习的整体概念框架,理解「模型到底在学什么」,并掌握一个可以复用到任何任务的建模流程。 **导航**:[栏目首页](./README.md) | 下一篇:[01 · 线性回归与逻辑回归](./01-线性回归与逻辑回归.md) --- ## 一、核心概念 ### 1.1 什么是机器学习 Tom Mitchell 的经典定义:一个程序在任务 **T** 上的表现(由性能度量 **P** 衡量)随着经验 **E** 的增加而提升,就说它关于 E 和 T 进行了**学习**。 换成白话:**机器学习不是「写规则」,而是「从数据里总结出规则」**。 | | 传统编程 | 机器学习 | | --- | --- | --- | | 输入 | 规则 + 数据 | 数据 + 答案(标签) | | 输出 | 答案 | 规则(模型) | | 典型例子 | 按税率表算税 | 用历史成交价预测房价 | ### 1.2 三类学习范式 | 范式 | 数据形态 | 目标 | 代表算法 | | --- | --- | --- | --- | | **监督学习** | 有标签 (x, y) | 学到 x → y 的映射 | 线性回归、决策树、SVM、神经网络 | | **无监督学习** | 无标签 x | 发现数据结构 | K-Means、DBSCAN、PCA | | **强化学习** | 状态-动作-奖励序列 | 学到最大化累积奖励的策略 | Q-Learning、PPO | 介于两者之间的常见变体: - **半监督学习**:少量标签 + 大量无标签数据,通常先自训练再微调。 - **自监督学习**:从数据自身构造监督信号(如掩码语言建模),是预训练大模型的根基。 ### 1.3 必须掌握的术语 | 术语 | 含义 | 例子 | | --- | --- | --- | | 样本(sample) | 一条数据 | 一个用户的一条借款记录 | | 特征(feature) | 样本的属性列 | 年龄、收入、负债比 | | 标签(label) | 要预测的目标 | 是否逾期(0/1) | | 训练集 / 验证集 / 测试集 | 学参数 / 选超参数 / 只做最终评估 | 6 : 2 : 2 | | 参数(parameter) | 模型从数据中学到的量 | 线性回归的权重 w | | 超参数(hyperparameter) | 人设定的、模型学不到的量 | 树的深度、正则强度 λ | | 损失函数(loss) | 衡量单次预测有多差 | MSE、交叉熵 | | 假设空间 | 模型能表达的所有函数的集合 | 所有线性函数的集合 | ### 1.4 偏差-方差权衡 模型泛化误差可以分解为三项: ```text 泛化误差 = 偏差²(Bias,拟合能力不足,学歪了) + 方差(Variance,对训练集过于敏感,学抖了) + 不可约误差(数据本身的噪声,学不了) ``` | 现象 | 表现 | 典型原因 | 应对 | | --- | --- | --- | --- | | **欠拟合** | 训练集和测试集都差 | 模型太简单、特征不够 | 换更复杂模型、加特征、减小正则 | | **过拟合** | 训练集好、测试集差 | 模型太复杂、数据太少 | 加数据、正则化、早停、降低复杂度 | --- ## 二、建模七步流程 ```text 1. 定义问题 ── 是分类还是回归?业务指标是什么?基线(baseline)是多少? 2. 获取数据 ── 数据源、样本量、标签可靠性、是否存在泄漏? 3. 探索分析 ── 分布、缺失值、异常值、相关性 4. 特征工程 ── 编码、缩放、组合、衍生(对表格数据往往比换模型更有效) 5. 训练模型 ── 从简单基线开始(线性回归 / 逻辑回归),逐步增加复杂度 6. 评估调优 ── 交叉验证 + 按业务目标选指标 + 搜索超参数 7. 部署监控 ── 持久化模型、监控数据漂移与效果衰减、定期重训 ``` **两条黄金原则**: 1. **先有基线**:任何复杂模型的第一个对手都是「最简单模型的表现」,没跑赢基线的复杂度不值得付出成本。 2. **测试集只碰一次**:调参过程中反复看测试集,等于把测试集信息泄漏进了模型,最终上线效果会崩。 --- ## 三、实例:一个通用 Pipeline 跑通全流程 用鸢尾花数据集演示完整的「切分 → 建模 → 交叉验证 → 评估」。这段代码的结构可以直接套用到任何表格任务上。 ```python import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, StratifiedKFold, cross_val_score from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 1) 取数据 iris = load_iris() X, y = iris.data, iris.target feature_names = iris.feature_names # 2) 划分:stratify 保证各类别比例在 train/test 一致(分类任务务必加) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) # 3) 组装 Pipeline:把缩放和模型绑在一起,避免预处理用到测试集信息 pipe = Pipeline([ ("scaler", StandardScaler()), ("clf", LogisticRegression(max_iter=200, C=1.0)), ]) # 4) 在训练集上做 5 折交叉验证(分层抽样:每折各类别比例一致) cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(pipe, X_train, y_train, cv=cv, scoring="accuracy") print("CV accuracy: {:.4f} +/- {:.4f}".format(scores.mean(), scores.std())) # 5) 用全量训练集拟合,测试集只评估这一次 pipe.fit(X_train, y_train) print(classification_report(y_test, pipe.predict(X_test), target_names=iris.target_names)) # 6) 看学到的参数:每个特征对每个类别的贡献方向 for name, row in zip(feature_names, pipe.named_steps["clf"].coef_.T): print("{:20s} {}".format(name, np.round(row, 3))) ``` **怎么读输出**: - `CV accuracy` 的**均值**代表模型的稳定水平,**标准差**代表它对数据划分有多敏感。标准差大说明结果不稳定,需要更多数据或更简单的模型。 - `classification_report` 里重点看每一类的 recall;三类鸢尾花样本均衡时 accuracy 才有意义。 - `coef_` 的绝对值说明「哪个特征在推动预测」,前提是**特征已经做过标准化**——这正是 Pipeline 里放 `StandardScaler` 的原因。 --- ## 四、常见坑与调参建议 | 坑 | 现象 | 解决 | | --- | --- | --- | | 数据泄漏 | CV 分数很好,上线一塌糊涂 | 所有预处理放进 `Pipeline`;先划分数据再做任何统计变换 | | 只看 accuracy | 正负样本 1:99 时 99% 准确率毫无价值 | 改用 recall / precision / F1 / ROC-AUC / PR-AUC | | 忘记设随机种子 | 每次跑结果都不一样 | 统一 `random_state=42`,只在最终模型上重跑多次验证稳定性 | | 特征没缩放 | KNN / SVM / 神经网络效果极差、收敛慢 | Pipeline 里加 `StandardScaler`(树模型不需要) | | 一开始就用大模型 | 两天调参不如十分钟跑个线性回归 | 遵守「基线优先」原则 | **调参的优先级**:数据量 > 特征质量 > 模型选择 > 超参数。超参数能带来的提升通常远小于前三项,别把时间花错地方。 --- ## 五、小结 - 机器学习 = 用数据自动拟合出一个函数,主要用来处理**难以手写规则**的任务。 - 泛化误差 = 偏差² + 方差 + 噪声;正则化、集成学习本质上都是在调整这两项的比例。 - 建模流程是可以复用的骨架:定义问题 → 数据 → 特征 → 模型 → 评估 → 上线,之后要做的是在每一环里加深细节。 **本篇约定**:后续所有文档都沿用「heading + 固定章节结构 + 可运行实例 + 常见坑」这套写法。 下一篇从最经典的模型开始:[01 · 线性回归与逻辑回归](./01-线性回归与逻辑回归.md)。