Appearance
第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)
思想:选择使观测数据出现概率最大的参数。
步骤:
- 写出似然函数 L(θ|X)
- 对数化:log L(θ|X)
- 求导并令导数为0
- 解方程得到参数估计
示例:
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.53.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·y2. 多项式核(Polynomial Kernel):
K(x, y) = (x·y + c)^d3. 高斯核(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^25.1.3 ID3算法
算法步骤:
- 如果所有样本属于同一类别,返回叶子节点
- 如果没有特征可用,返回多数类
- 选择信息增益最大的特征作为分裂属性
- 根据分裂属性的值创建子节点
- 递归构建子树
5.1.4 C4.5算法
改进:
- 使用信息增益率代替信息增益
- 可以处理连续属性
- 可以处理缺失值
- 支持剪枝
5.1.5 CART算法
特点:
- 使用基尼系数作为分裂标准
- 可以构建分类树和回归树
- 支持剪枝
5.2 随机森林
5.2.1 集成学习
核心思想:通过组合多个模型,提高预测性能。
两种主要方法:
- Bagging(Bootstrap Aggregating):并行训练多个模型,然后投票
- Boosting:串行训练多个模型,每个模型关注前一个模型的错误
5.2.2 随机森林的原理
核心思想:构建多个决策树,然后组合它们的预测结果。
构建步骤:
- 使用Bootstrap采样从训练集中抽取多个样本集
- 对每个样本集构建一棵决策树
- 在构建每棵树时,随机选择特征子集
- 分类:投票;回归:平均
示例:
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实现一个简单的分类器。
要求:
- 实现K近邻(KNN)分类器
- 实现逻辑回归分类器
- 在Iris数据集上测试
- 评估分类性能
代码框架:
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进行分类。
要求:
- 使用不同的核函数(线性、RBF、多项式)
- 调整超参数(C、gamma)
- 在Iris数据集上测试
- 可视化决策边界
代码框架:
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:实现决策树和随机森林
目标:实现决策树和随机森林分类器。
要求:
- 使用scikit-learn的决策树和随机森林
- 在Iris数据集上测试
- 可视化决策树
- 分析特征重要性
代码框架:
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:贝叶斯分类器
题目:实现一个简单的贝叶斯分类器。
要求:
- 实现朴素贝叶斯分类器
- 在垃圾邮件数据集上测试
- 评估分类性能
- 分析误分类的样本
作业2:模型比较
题目:比较不同分类算法的性能。
要求:
- 选择至少3个分类算法(如KNN、SVM、决策树、随机森林)
- 在多个数据集上测试
- 比较准确率、精确率、召回率、F1分数
- 分析不同算法的优缺点
作业3:特征工程
题目:研究特征工程对模型性能的影响。
要求:
- 选择一个数据集
- 尝试不同的特征工程方法(特征选择、特征变换、特征构造)
- 比较特征工程前后的模型性能
- 总结特征工程的最佳实践
参考资料
必读文献
Vapnik, V. N. (1998). Statistical Learning Theory. Wiley.
- 统计学习理论经典著作
Breiman, L. (2001). "Random Forests". Machine Learning, 45(1), 5-32.
- 随机森林原始论文
Quinlan, J. R. (1986). "Induction of Decision Trees". Machine Learning, 1(1), 81-106.
- 决策树经典论文
推荐阅读
Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.). Springer.
- 统计学习经典教材
Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.
- 机器学习经典教材
Murphy, K. P. (2012). Machine Learning: A Probabilistic Perspective. MIT Press.
- 概率视角的机器学习
在线资源
Scikit-learn Documentation: https://scikit-learn.org/
- 机器学习库文档
Andrew Ng's Machine Learning Course: https://www.coursera.org/learn/machine-learning
- 机器学习经典课程
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杜"公众号,获取更多技术内容和最新动态
