Skip to content

第2天:机器学习时代(1980-2010)

学习目标

  • 理解机器学习的兴起背景
  • 掌握机器学习的核心概念和分类
  • 了解统计学习方法的发展
  • 掌握支持向量机(SVM)的原理
  • 了解决策树和随机森林
  • 理解机器学习时代的特点和局限

课程内容

1. 机器学习的兴起

1.1 从符号主义到统计学习

符号主义的困境

  • 知识获取困难
  • 难以处理不确定性
  • 无法处理大规模数据
  • 缺乏泛化能力

统计学习的兴起

  • 从数据中学习规律
  • 使用概率和统计方法
  • 处理不确定性和噪声
  • 具有泛化能力

关键转变

  • 从"知识驱动"到"数据驱动"
  • 从"规则推理"到"模式识别"
  • 从"符号操作"到"数值计算"

1.2 机器学习的定义

Arthur Samuel(1959): "机器学习是使计算机能够在没有明确编程的情况下学习的研究领域。"

Tom Mitchell(1997): "如果一个程序在任务T上的性能(由P衡量)随着经验E的提高而提高,那么该程序就从经验E中学习到了任务T。"

机器学习的核心要素

  • 任务(Task):要解决的问题
  • 经验(Experience):训练数据
  • 性能(Performance):评估标准

1.3 机器学习的发展历程

1980年代:机器学习的复兴

  • 神经网络的复兴(反向传播算法)
  • 决策树算法(ID3、C4.5)
  • 贝叶斯学习

1990年代:统计学习理论

  • 支持向量机(SVM)
  • 集成学习(Bagging、Boosting)
  • 核方法

2000年代:机器学习的繁荣

  • 随机森林
  • 梯度提升(GBDT)
  • 大规模机器学习

2. 机器学习的分类

2.1 按学习方式分类

2.1.1 监督学习(Supervised Learning)

定义:使用有标签的数据进行学习,学习输入到输出的映射关系。

典型任务

  • 分类:预测离散标签(如垃圾邮件检测)
  • 回归:预测连续值(如房价预测)

示例

python
# 分类任务
X = [[1, 2], [3, 4], [5, 6]]  # 特征
y = [0, 1, 0]  # 标签
# 学习:X -> y 的映射

# 回归任务
X = [[100], [200], [300]]  # 面积
y = [1000, 2000, 3000]  # 价格
# 学习:面积 -> 价格 的映射

常用算法

  • 线性回归、逻辑回归
  • 决策树、随机森林
  • 支持向量机(SVM)
  • 神经网络

2.1.2 无监督学习(Unsupervised Learning)

定义:使用无标签的数据进行学习,发现数据中的结构和模式。

典型任务

  • 聚类:将相似的数据分组(如客户分群)
  • 降维:减少数据维度(如PCA)
  • 关联规则:发现数据间的关联(如购物篮分析)

示例

python
# 聚类任务
X = [[1, 2], [3, 4], [5, 6], [1.1, 2.1]]
# 学习:将相似的数据分组
# 结果:[[1, 2], [1.1, 2.1]], [[3, 4]], [[5, 6]]

# 降维任务
X = [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
# 学习:将4维数据降维到2维

常用算法

  • K-means聚类
  • 层次聚类
  • 主成分分析(PCA)
  • 自编码器

2.1.3 强化学习(Reinforcement Learning)

定义:通过与环境交互,学习最优策略以最大化累积奖励。

核心要素

  • 智能体(Agent):学习者和决策者
  • 环境(Environment):智能体所处的外部世界
  • 状态(State):环境的当前情况
  • 动作(Action):智能体可以执行的操作
  • 奖励(Reward):环境给予的反馈

示例

python
# 游戏AI
状态:游戏画面
动作:上、下、左、右
奖励:得分、生命值
目标:最大化累积奖励

常用算法

  • Q-learning
  • SARSA
  • Deep Q-Network(DQN)
  • Policy Gradient

2.2 按学习目标分类

2.2.1 分类(Classification)

定义:预测离散的类别标签。

示例

  • 垃圾邮件检测(是/否)
  • 图像识别(猫/狗/鸟)
  • 情感分析(正面/负面/中性)

评估指标

  • 准确率(Accuracy)
  • 精确率(Precision)
  • 召回率(Recall)
  • F1分数

2.2.2 回归(Regression)

定义:预测连续的数值。

示例

  • 房价预测
  • 股票价格预测
  • 温度预测

评估指标

  • 均方误差(MSE)
  • 均方根误差(RMSE)
  • 平均绝对误差(MAE)
  • R²分数

2.2.3 聚类(Clustering)

定义:将数据分组,使得组内相似度高,组间相似度低。

示例

  • 客户分群
  • 文档聚类
  • 图像分割

评估指标

  • 轮廓系数(Silhouette Coefficient)
  • Calinski-Harabasz指数
  • Davies-Bouldin指数

3. 统计学习方法

3.1 概率论基础

3.1.1 条件概率

定义:在事件B发生的条件下,事件A发生的概率。

公式

P(A|B) = P(A ∩ B) / P(B)

示例

P(感冒|发烧) = P(感冒 ∩ 发烧) / P(发烧)

3.1.2 贝叶斯定理

公式

P(A|B) = P(B|A) * P(A) / P(B)

应用

  • 垃圾邮件分类
  • 医疗诊断
  • 模式识别

示例

P(垃圾邮件|包含"中奖") = 
    P(包含"中奖"|垃圾邮件) * P(垃圾邮件) / 
    P(包含"中奖")

3.1.3 最大似然估计(MLE)

思想:选择使观测数据出现概率最大的参数。

步骤

  1. 写出似然函数 L(θ|X)
  2. 对数化:log L(θ|X)
  3. 求导并令导数为0
  4. 解方程得到参数估计

示例

python
# 抛硬币问题
# 观测数据:正面5次,反面5次
# 估计硬币正面概率p

# 似然函数
L(p) = p^5 * (1-p)^5

# 对数化
log L(p) = 5*log(p) + 5*log(1-p)

# 求导
d/dp [5*log(p) + 5*log(1-p)] = 0
5/p - 5/(1-p) = 0
p = 0.5

3.2 贝叶斯学习

核心思想:将先验知识和观测数据结合,得到后验概率。

公式

后验概率 ∝ 似然 × 先验概率
P(θ|X) ∝ P(X|θ) * P(θ)

优势

  • 可以处理小样本
  • 融入先验知识
  • 提供不确定性估计

应用

  • 贝叶斯分类器
  • 贝叶斯网络
  • 贝叶斯优化

3.3 过拟合与欠拟合

3.3.1 过拟合(Overfitting)

定义:模型在训练数据上表现很好,但在测试数据上表现很差。

原因

  • 模型过于复杂
  • 训练数据太少
  • 噪声数据

表现

  • 训练误差很低
  • 测试误差很高
  • 泛化能力差

解决方法

  • 增加训练数据
  • 简化模型
  • 正则化
  • 交叉验证

3.3.2 欠拟合(Underfitting)

定义:模型在训练数据和测试数据上表现都很差。

原因

  • 模型过于简单
  • 特征不足
  • 训练时间不够

表现

  • 训练误差很高
  • 测试误差很高
  • 无法学习数据规律

解决方法

  • 增加模型复杂度
  • 增加特征
  • 减少正则化
  • 增加训练时间

3.3.3 偏差-方差权衡(Bias-Variance Tradeoff)

偏差(Bias)

  • 模型的简化假设带来的误差
  • 高偏差:欠拟合
  • 低偏差:过拟合

方差(Variance)

  • 模型对训练数据变化的敏感度
  • 高方差:过拟合
  • 低方差:欠拟合

权衡

  • 简单模型:高偏差,低方差
  • 复杂模型:低偏差,高方差
  • 目标:找到偏差和方差的最佳平衡点

4. 支持向量机(SVM)

4.1 SVM的基本思想

核心思想:找到一个超平面,将不同类别的数据分开,并且使得间隔(Margin)最大化。

超平面

  • 在二维空间中是一条直线
  • 在三维空间中是一个平面
  • 在高维空间中是一个超平面

间隔(Margin)

  • 超平面到最近数据点的距离
  • 间隔越大,泛化能力越强

示例

二维空间中的分类:

● ● ● ● ●
● ● ● ● ●
━━━━━━━━━━━  ← 超平面
○ ○ ○ ○ ○
○ ○ ○ ○ ○

4.2 线性可分SVM

数学表达

超平面方程

w·x + b = 0

分类决策

if w·x + b > 0: 类别1
else: 类别2

优化目标

最大化间隔:max (2/||w||)
等价于:min (1/2)||w||^2

约束条件:
y_i(w·x_i + b) ≥ 1, for all i

支持向量

  • 位于间隔边界上的数据点
  • 决定了超平面的位置
  • 其他点对决策边界没有影响

4.3 核方法(Kernel Method)

问题:线性可分的情况很少,如何处理线性不可分的数据?

解决方案:将数据映射到高维空间,在高维空间中寻找超平面。

核函数

  • 避免显式计算高维映射
  • 直接计算高维空间中的内积
  • K(x, y) = φ(x)·φ(y)

常用核函数

1. 线性核(Linear Kernel)

K(x, y) = x·y

2. 多项式核(Polynomial Kernel)

K(x, y) = (x·y + c)^d

3. 高斯核(RBF Kernel)

K(x, y) = exp(-γ||x-y||^2)

4. Sigmoid核

K(x, y) = tanh(αx·y + c)

示例

python
from sklearn.svm import SVC

# 线性核
svm_linear = SVC(kernel='linear')

# RBF核
svm_rbf = SVC(kernel='rbf')

# 多项式核
svm_poly = SVC(kernel='poly', degree=3)

4.4 软间隔SVM

问题:数据中存在噪声或异常点,如何处理?

解决方案:允许部分数据点被错误分类,引入松弛变量。

优化目标

min (1/2)||w||^2 + C∑ξ_i

约束条件:
y_i(w·x_i + b) ≥ 1 - ξ_i
ξ_i ≥ 0, for all i

参数C

  • C越大,对误分类的惩罚越大
  • C越小,对误分类的惩罚越小
  • C控制偏差-方差权衡

4.5 SVM的优势与局限

优势

  • 理论基础扎实(统计学习理论)
  • 在高维空间中表现良好
  • 使用核方法可以处理非线性问题
  • 泛化能力强

局限

  • 对大规模数据训练效率低
  • 对噪声和缺失数据敏感
  • 参数选择(核函数、C、γ)需要调优
  • 难以处理多分类问题(需要使用一对一或一对多策略)

5. 决策树与随机森林

5.1 决策树

5.1.1 决策树的基本思想

核心思想:通过一系列的判断规则,将数据逐步分类。

示例

是否是哺乳动物?
├─ 是 → 是否有翅膀?
│       ├─ 是 → 蝙蝠
│       └─ 否 → 狗
└─ 否 → 是否会飞?
        ├─ 是 → 鸟
        └─ 否 → 鱼

优点

  • 直观、易于理解
  • 不需要数据预处理
  • 可以处理数值型和分类型数据
  • 可以处理缺失值

缺点

  • 容易过拟合
  • 不稳定(数据小变化可能导致树的大变化)
  • 难以学习线性关系

5.1.2 决策树的构建

核心问题:如何选择最优的分裂属性?

信息增益(Information Gain)

信息增益 = 熵(父节点) - 加权熵(子节点)

熵(Entropy)

H(S) = -∑p_i * log2(p_i)

信息增益率(Information Gain Ratio)

信息增益率 = 信息增益 / 分裂信息

基尼系数(Gini Index)

Gini(S) = 1 - ∑p_i^2

5.1.3 ID3算法

算法步骤

  1. 如果所有样本属于同一类别,返回叶子节点
  2. 如果没有特征可用,返回多数类
  3. 选择信息增益最大的特征作为分裂属性
  4. 根据分裂属性的值创建子节点
  5. 递归构建子树

5.1.4 C4.5算法

改进

  • 使用信息增益率代替信息增益
  • 可以处理连续属性
  • 可以处理缺失值
  • 支持剪枝

5.1.5 CART算法

特点

  • 使用基尼系数作为分裂标准
  • 可以构建分类树和回归树
  • 支持剪枝

5.2 随机森林

5.2.1 集成学习

核心思想:通过组合多个模型,提高预测性能。

两种主要方法

  • Bagging(Bootstrap Aggregating):并行训练多个模型,然后投票
  • Boosting:串行训练多个模型,每个模型关注前一个模型的错误

5.2.2 随机森林的原理

核心思想:构建多个决策树,然后组合它们的预测结果。

构建步骤

  1. 使用Bootstrap采样从训练集中抽取多个样本集
  2. 对每个样本集构建一棵决策树
  3. 在构建每棵树时,随机选择特征子集
  4. 分类:投票;回归:平均

示例

python
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(
    n_estimators=100,  # 树的数量
    max_features='sqrt',  # 每棵树使用的特征数
    max_depth=None,  # 树的最大深度
    min_samples_split=2,  # 分裂所需的最小样本数
    random_state=42
)

rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)

5.2.3 随机森林的优势

优势

  • 准确率高
  • 不容易过拟合
  • 可以处理高维数据
  • 可以评估特征重要性
  • 并行化训练

特征重要性

python
import matplotlib.pyplot as plt

importances = rf.feature_importances_
indices = np.argsort(importances)[::-1]

plt.figure(figsize=(10, 6))
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices])
plt.xticks(range(X.shape[1]), feature_names[indices], rotation=90)
plt.show()

6. 机器学习时代的特点

6.1 技术特点

数据驱动

  • 从规则驱动转向数据驱动
  • 从专家知识转向统计学习
  • 从符号操作转向数值计算

统计基础

  • 概率论和统计学成为理论基础
  • 强调泛化能力和不确定性
  • 注重评估和验证

算法多样化

  • 监督学习、无监督学习、强化学习
  • 分类、回归、聚类、降维
  • 线性模型、非线性模型、集成模型

6.2 应用特点

广泛应用

  • 垃圾邮件过滤
  • 推荐系统
  • 欺诈检测
  • 图像识别
  • 自然语言处理

商业化成功

  • 搜索引擎
  • 在线广告
  • 电子商务
  • 金融风控

6.3 局限性

特征工程依赖

  • 需要人工设计特征
  • 特征质量决定模型性能
  • 领域知识至关重要

泛化能力有限

  • 在特定任务上表现良好
  • 难以处理复杂任务
  • 缺乏通用智能

可解释性差

  • 黑盒模型难以解释
  • 决策过程不透明
  • 影响信任和接受度

7. 机器学习的挑战

7.1 数据挑战

数据质量

  • 噪声数据
  • 缺失值
  • 不平衡数据

数据量

  • 大数据需要分布式计算
  • 小数据容易过拟合

数据隐私

  • 个人隐私保护
  • 数据安全

7.2 算法挑战

模型选择

  • 如何选择合适的模型
  • 如何调优超参数

可解释性

  • 黑盒模型难以解释
  • 决策过程不透明

鲁棒性

  • 对噪声和异常值敏感
  • 泛化能力有限

7.3 应用挑战

领域知识

  • 需要深入理解应用领域
  • 特征工程需要专业知识

部署和维护

  • 模型部署到生产环境
  • 模型监控和更新

实践任务

任务1:实现简单的分类器

目标:使用Python实现一个简单的分类器。

要求

  1. 实现K近邻(KNN)分类器
  2. 实现逻辑回归分类器
  3. 在Iris数据集上测试
  4. 评估分类性能

代码框架

python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# KNN分类器
class KNN:
    def __init__(self, k=3):
        self.k = k
    
    def fit(self, X, y):
        pass
    
    def predict(self, X):
        pass

# 逻辑回归分类器
class LogisticRegression:
    def __init__(self, learning_rate=0.01, n_iterations=1000):
        self.learning_rate = learning_rate
        self.n_iterations = n_iterations
    
    def fit(self, X, y):
        pass
    
    def predict(self, X):
        pass

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练和评估
knn = KNN(k=3)
knn.fit(X_train, y_train)
y_pred_knn = knn.predict(X_test)
print("KNN Accuracy:", accuracy_score(y_test, y_pred_knn))

lr = LogisticRegression()
lr.fit(X_train, y_train)
y_pred_lr = lr.predict(X_test)
print("Logistic Regression Accuracy:", accuracy_score(y_test, y_pred_lr))

任务2:使用SVM进行分类

目标:使用scikit-learn的SVM进行分类。

要求

  1. 使用不同的核函数(线性、RBF、多项式)
  2. 调整超参数(C、gamma)
  3. 在Iris数据集上测试
  4. 可视化决策边界

代码框架

python
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
import matplotlib.pyplot as plt

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10, 100],
    'gamma': [1, 0.1, 0.01, 0.001],
    'kernel': ['rbf', 'poly', 'linear']
}

# 网格搜索
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2)
grid.fit(X_train, y_train)

# 最佳参数
print("Best Parameters:", grid.best_params_)
print("Best Score:", grid.best_score_)

# 预测
y_pred = grid.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))

# 可视化决策边界(仅使用前两个特征)
def plot_decision_boundary(X, y, model):
    # 实现决策边界可视化
    pass

任务3:实现决策树和随机森林

目标:实现决策树和随机森林分类器。

要求

  1. 使用scikit-learn的决策树和随机森林
  2. 在Iris数据集上测试
  3. 可视化决策树
  4. 分析特征重要性

代码框架

python
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.ensemble import RandomForestClassifier

# 决策树
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_train, y_train)
y_pred_dt = dt.predict(X_test)
print("Decision Tree Accuracy:", accuracy_score(y_test, y_pred_dt))

# 可视化决策树
plt.figure(figsize=(20, 10))
plot_tree(dt, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

# 随机森林
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
print("Random Forest Accuracy:", accuracy_score(y_test, y_pred_rf))

# 特征重要性
importances = rf.feature_importances_
indices = np.argsort(importances)[::-1]

plt.figure(figsize=(10, 6))
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices])
plt.xticks(range(X.shape[1]), [iris.feature_names[i] for i in indices], rotation=90)
plt.show()

课后作业

作业1:贝叶斯分类器

题目:实现一个简单的贝叶斯分类器。

要求

  1. 实现朴素贝叶斯分类器
  2. 在垃圾邮件数据集上测试
  3. 评估分类性能
  4. 分析误分类的样本

作业2:模型比较

题目:比较不同分类算法的性能。

要求

  1. 选择至少3个分类算法(如KNN、SVM、决策树、随机森林)
  2. 在多个数据集上测试
  3. 比较准确率、精确率、召回率、F1分数
  4. 分析不同算法的优缺点

作业3:特征工程

题目:研究特征工程对模型性能的影响。

要求

  1. 选择一个数据集
  2. 尝试不同的特征工程方法(特征选择、特征变换、特征构造)
  3. 比较特征工程前后的模型性能
  4. 总结特征工程的最佳实践

参考资料

必读文献

  1. Vapnik, V. N. (1998). Statistical Learning Theory. Wiley.

    • 统计学习理论经典著作
  2. Breiman, L. (2001). "Random Forests". Machine Learning, 45(1), 5-32.

    • 随机森林原始论文
  3. Quinlan, J. R. (1986). "Induction of Decision Trees". Machine Learning, 1(1), 81-106.

    • 决策树经典论文

推荐阅读

  1. Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.). Springer.

    • 统计学习经典教材
  2. Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.

    • 机器学习经典教材
  3. Murphy, K. P. (2012). Machine Learning: A Probabilistic Perspective. MIT Press.

    • 概率视角的机器学习

在线资源

  1. Scikit-learn Documentation: https://scikit-learn.org/

    • 机器学习库文档
  2. Andrew Ng's Machine Learning Course: https://www.coursera.org/learn/machine-learning

    • 机器学习经典课程
  3. Kaggle: https://www.kaggle.com/

    • 数据科学竞赛平台

扩展阅读

机器学习前沿

  • Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.

    • 深度学习教材
  • Scholkopf, B., & Smola, A. J. (2002). Learning with Kernels. MIT Press.

    • 核方法专著

机器学习应用

  • Koren, Y., Bell, R., & Volinsky, C. (2009). "Matrix Factorization Techniques for Recommender Systems". Computer, 42(8), 30-37.

    • 推荐系统
  • Provost, F., & Fawcett, T. (2013). Data Science for Business. O'Reilly Media.

    • 商业数据科学

下节预告

下一节我们将学习深度学习革命(2010-2017),了解深度学习的兴起、CNN、RNN、LSTM、AlphaGo等突破性进展,以及它们如何推动AI进入新的时代。


架构师AI杜公众号二维码

扫描二维码关注"架构师AI杜"公众号,获取更多技术内容和最新动态