Skip to content

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

学习目标

本节将带领读者深入理解机器学习时代的兴起与发展。读者将理解机器学习的兴起背景,掌握机器学习的核心概念和分类方法,了解统计学习方法的发展历程,掌握支持向量机的基本原理,了解决策树和随机森林算法,并理解机器学习时代的特点和局限性。这些知识将为后续深入学习深度学习等技术打下坚实基础。

课程内容

1. 机器学习的兴起

1.1 从符号主义到统计学习

符号主义人工智能在发展过程中遇到了困境,主要体现在知识获取困难,难以将人类专家的知识形式化。难以处理不确定性问题,符号逻辑难以表达和处理概率性信息。无法处理大规模数据,规则系统难以扩展到海量数据场景。缺乏泛化能力,基于硬编码规则的系统难以适应新情况。

统计学习的兴起解决了这些问题。统计学习从数据中学习规律,通过统计方法从大量数据中发现模式。使用概率和统计方法处理不确定性和噪声,能够量化预测的可靠性。具有泛化能力,学习到的模型可以应用于未见过的数据。

统计学习带来的关键转变是从知识驱动转向数据驱动,不再依赖人工编码知识,而是让算法从数据中自动发现知识。从规则推理转向模式识别,从逻辑推导转向统计推断。从符号操作转向数值计算,使用数值优化方法求解问题。

1.2 机器学习的定义

Arthur Samuel在1959年提出,机器学习是使计算机能够在没有明确编程的情况下学习的研究领域。Tom Mitchell在1997年给出了更精确的定义,如果一个程序在任务T上的性能(由P衡量)随着经验E的提高而提高,那么该程序就从经验E中学习到了任务T。机器学习的核心要素包括任务、经验和性能三个方面,任务是要解决的问题,经验是训练数据,性能是评估标准。

1.3 机器学习的发展历程

1980年代是机器学习的复兴时期,神经网络的复兴得益于反向传播算法的提出,决策树算法如ID3和C4.5被广泛研究,贝叶斯学习理论得到发展。1990年代是统计学习理论时期,支持向量机成为研究热点,集成学习方法如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]  # 价格
# 学习:面积 -> 价格 的映射

监督学习的常用算法包括线性回归、逻辑回归、决策树、随机森林、支持向量机和神经网络。

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)

强化学习是通过与环境交互,学习最优策略以最大化累积奖励。核心要素包括智能体、环境、状态、动作和奖励,智能体是学习者和决策者,环境是智能体所处的外部世界,状态是环境的当前情况,动作是智能体可以执行的操作,奖励是环境给予的反馈。

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

强化学习的常用算法包括Q-learning、SARSA、Deep Q-Network DQN和Policy Gradient。

2.2 按学习目标分类

2.2.1 分类(Classification)

分类是预测离散的类别标签。例如垃圾邮件检测判断是否为垃圾邮件、图像识别区分猫狗鸟等、情感分析判断正面负面或中性。评估指标包括准确率、精确率、召回率和F1分数。

2.2.2 回归(Regression)

回归是预测连续的数值。例如房价预测、股票价格预测、温度预测。评估指标包括均方误差MSE、均方根误差RMSE、平均绝对误差MAE和R²分数。

2.2.3 聚类(Clustering)

聚类是将数据分组,使得组内相似度高,组间相似度低。例如客户分群、文档聚类、图像分割。评估指标包括轮廓系数、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.5

3.2 贝叶斯学习

贝叶斯学习的核心思想是将先验知识和观测数据结合,得到后验概率。其公式为后验概率 ∝ 似然 × 先验概率,即P(θ|X) ∝ P(X|θ) * P(θ)。贝叶斯学习的优势在于可以处理小样本问题,能够融入先验知识,并提供不确定性估计。贝叶斯学习的应用包括贝叶斯分类器、贝叶斯网络和贝叶斯优化。

3.3 过拟合与欠拟合

3.3.1 过拟合(Overfitting)

过拟合是模型在训练数据上表现很好,但在测试数据上表现很差。过拟合的原因包括模型过于复杂、训练数据太少和存在噪声数据。过拟合的表现是训练误差很低但测试误差很高,泛化能力差。解决过拟合的方法包括增加训练数据、简化模型、使用正则化和交叉验证。

3.3.2 欠拟合(Underfitting)

欠拟合是模型在训练数据和测试数据上表现都很差。欠拟合的原因包括模型过于简单、特征不足和训练时间不够。欠拟合的表现是训练误差很高、测试误差很高,无法学习数据规律。解决欠拟合的方法包括增加模型复杂度、增加特征、减少正则化和增加训练时间。

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

偏差是模型的简化假设带来的误差,高偏差导致欠拟合,低偏差可能导致过拟合。方差是模型对训练数据变化的敏感度,高方差导致过拟合,低方差可能导致欠拟合。权衡的方法是简单模型具有高偏差低方差,复杂模型具有低偏差高方差,目标是找到偏差和方差的最佳平衡点。

4. 支持向量机(SVM)

4.1 SVM的基本思想

支持向量机的核心思想是找到一个超平面,将不同类别的数据分开,并且使得间隔Margin最大化。超平面在二维空间中是一条直线,在三维空间中是一个平面,在高维空间中是一个超平面。间隔是超平面到最近数据点的距离,间隔越大,泛化能力越强。

4.2 线性可分SVM

超平面方程为w·x + b = 0。分类决策规则是如果w·x + b > 0则预测为类别1,否则预测为类别2。优化目标是最大化间隔max (2/||w||),等价于最小化(1/2)||w||^2,约束条件是y_i(w·x_i + b) ≥ 1, for all i。支持向量是位于间隔边界上的数据点,它们决定了超平面的位置,其他点对决策边界没有影响。

4.3 核方法(Kernel Method)

核方法要解决的问题是线性可分的情况很少,需要处理线性不可分的数据。解决方案是将数据映射到高维空间,在高维空间中寻找超平面。核函数可以避免显式计算高维映射,直接计算高维空间中的内积,公式为K(x, y) = φ(x)·φ(y)。

常用核函数包括线性核K(x, y) = x·y,多项式核K(x, y) = (x·y + c)^d,高斯核RBF Kernel K(x, y) = exp(-γ||x-y||^2),以及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

软间隔SVM要解决的问题是数据中存在噪声或异常点。解决方案是允许部分数据点被错误分类,引入松弛变量。优化目标是min (1/2)||w||^2 + C∑ξ_i,约束条件是y_i(w·x_i + b) ≥ 1 - ξ_i且ξ_i ≥ 0, for all i。参数C越大,对误分类的惩罚越大,C越小,对误分类的惩罚越小,C控制偏差-方差权衡。

4.5 SVM的优势与局限

支持向量机的优势在于理论基础扎实基于统计学习理论,在高维空间中表现良好,使用核方法可以处理非线性问题,泛化能力强。局限在于对大规模数据训练效率低,对噪声和缺失数据敏感,参数选择核函数、C、γ需要调优,难以处理多分类问题需要使用一对一或一对多策略。

5. 决策树与随机森林

5.1 决策树

5.1.1 决策树的基本思想

决策树的核心思想是通过一系列的判断规则,将数据逐步分类。例如判断是否是哺乳动物,首先看是否有翅膀,再看是否会飞,最终判断是蝙蝠、狗、鸟还是鱼。决策树的优点是直观、易于理解,不需要数据预处理,可以处理数值型和分类型数据,可以处理缺失值。缺点是容易过拟合,不稳定数据小变化可能导致树的大变化,难以学习线性关系。

5.1.2 决策树的构建

决策树构建的核心问题是如何选择最优的分裂属性。信息增益的计算公式是信息增益等于熵父节点减去加权熵子节点。熵的计算公式是H(S) = -∑p_i * log2(p_i)。信息增益率是信息增益除以分裂信息。基尼系数是Gini(S) = 1 - ∑p_i^2。

5.1.3 ID3算法

ID3算法的步骤是首先如果所有样本属于同一类别则返回叶子节点,其次如果没有特征可用则返回多数类,然后选择信息增益最大的特征作为分裂属性,接着根据分裂属性的值创建子节点,最后递归构建子树。

5.1.4 C4.5算法

C4.5算法的改进包括使用信息增益率代替信息增益,可以处理连续属性,可以处理缺失值,支持剪枝。

5.1.5 CART算法

CART算法的特点是使用基尼系数作为分裂标准,可以构建分类树和回归树,支持剪枝。

5.2 随机森林

5.2.1 集成学习

集成学习的核心思想是通过组合多个模型,提高预测性能。两种主要方法是Bagging并行训练多个模型然后投票,和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实现一个简单的分类器。

要求

  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杜"公众号,获取更多技术内容和最新动态