斯坦福机器学习讲义中文完整版实战指南
简介:《斯坦福机器学习讲义》中文版由黄海广整理,系统介绍了机器学习的核心概念与主流算法,涵盖监督学习、无监督学习、半监督学习与强化学习。讲义内容从基础模型如线性回归、逻辑回归到高级算法如随机森林、支持向量机和深度学习,全面覆盖机器学习理论与实践。同时讲解了损失函数、优化算法、正则化方法以及模型评估指标,帮助读者掌握从建模到调优的全流程技能。通过丰富的案例与练习,适合初学者入门和进阶者提升实战能力。
1. 机器学习概述与发展背景
机器学习作为人工智能的核心分支,旨在通过数据驱动的方式,使计算机系统具备从经验中学习并改进自身性能的能力,而无需依赖明确的程序指令。其基本思想是通过算法自动识别数据中的模式,并利用这些模式进行预测或决策。
从发展历程来看,机器学习经历了从早期的感知机、支持向量机等统计学习方法,到如今以深度学习为代表的神经网络模型的演进。随着大数据和计算能力的提升,机器学习在图像识别、自然语言处理、推荐系统等领域取得了广泛应用。
本章将引导读者逐步理解机器学习的核心概念、主要分类及其在现代科技中的关键作用,为后续章节的深入学习奠定坚实基础。
2. 监督学习概念与分类回归应用
监督学习作为机器学习中最基础、应用最广泛的类别之一,其核心在于通过已知的输入-输出对来训练模型,使其具备对未知数据进行准确预测的能力。本章将从监督学习的基本原理入手,深入探讨分类与回归任务的本质区别,并介绍若干经典的监督学习算法,最后通过一个实际案例——房价预测,展示监督学习在现实问题中的具体应用。
2.1 监督学习的基本原理
监督学习(Supervised Learning)是一种基于带标签数据的机器学习方法,其核心目标是通过训练集中的输入特征(X)与输出标签(Y)之间的映射关系,建立一个模型,使得该模型在面对新的输入数据时能够准确地预测出对应的输出标签。
2.1.1 什么是监督学习
监督学习可以看作是一种“有老师”的学习方式,其中训练数据包含明确的输入和输出信息。模型在训练过程中不断调整参数,以最小化预测误差。常见的监督学习任务包括分类(Classification)和回归(Regression)。
监督学习的数学表达可以表示为:
y = f(x) + \epsilon
其中:
- $ x $:输入特征向量;
- $ y $:对应的输出标签;
- $ f(x) $:我们希望学习的真实函数;
- $ \epsilon $:噪声项,表示数据中不可避免的误差。
监督学习的训练过程本质上是一个函数逼近问题,即寻找一个近似函数 $ \hat{f}(x) $,使得其在训练数据上的误差最小,并且具备良好的泛化能力。
2.1.2 数据集的结构与标签的作用
一个典型的监督学习数据集由若干个样本组成,每个样本包括输入特征(特征向量)和输出标签(目标变量)。例如:
| 特征1 | 特征2 | 特征3 | 标签 |
|---|---|---|---|
| 2.3 | 1.5 | 0.7 | 1 |
| 1.8 | 0.9 | 2.1 | 0 |
- 特征(Features) :用于描述样本的各种属性,通常为数值型或经过编码的类别型数据。
- 标签(Labels) :表示样本的输出或目标变量,监督学习的目标是通过特征预测标签。
标签在监督学习中起着至关重要的作用,它为模型训练提供了“正确答案”,从而指导模型调整参数以提高预测准确性。没有标签的数据无法用于监督学习,这也是监督学习与无监督学习的根本区别。
2.2 分类问题与回归问题的区别
监督学习的两个主要任务是分类与回归,它们在目标变量的性质、模型结构和评估指标等方面存在显著差异。
2.2.1 分类任务的典型应用场景
分类任务的目标是预测离散的类别标签。例如:
- 垃圾邮件检测 :判断一封邮件是否为垃圾邮件;
- 图像识别 :识别图像中是否包含猫、狗或汽车;
- 疾病诊断 :根据病人的症状判断是否患有某种疾病。
分类任务的输出是有限的类别集合,通常使用如逻辑回归、决策树、支持向量机(SVM)、K近邻(KNN)等算法实现。
以二分类任务为例,假设我们使用逻辑回归模型进行分类,其输出为:
P(y=1|x) = \frac{1}{1 + e^{-(w^T x + b)}}
其中:
- $ w $:权重向量;
- $ b $:偏置项;
- $ x $:输入特征;
- $ P(y=1|x) $:在给定输入特征 $ x $ 的条件下,输出为 1 的概率。
最终分类结果可通过设定阈值(如0.5)来决定:
\hat{y} =
\begin{cases}
1, & P(y=1|x) \geq 0.5 \
0, & P(y=1|x) < 0.5
\end{cases}
2.2.2 回归任务的数学建模与预测目标
回归任务的目标是预测连续的数值型变量。例如:
- 房价预测 :根据房屋面积、位置、楼层等信息预测价格;
- 股票价格预测 :根据历史数据预测未来价格;
- 温度预测 :根据气象数据预测气温。
回归任务通常使用线性回归、岭回归、Lasso回归、支持向量回归(SVR)等模型实现。
以线性回归为例,其模型形式为:
y = w_1 x_1 + w_2 x_2 + \dots + w_n x_n + b
其中:
- $ w_i $:各特征的权重;
- $ x_i $:输入特征;
- $ b $:偏置项。
训练的目标是最小化损失函数,最常用的是均方误差(MSE):
\text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2
其中:
- $ y_i $:真实值;
- $ \hat{y}_i $:模型预测值;
- $ N $:样本数量。
2.3 常见监督学习算法介绍
本节将介绍几种经典且广泛使用的监督学习算法,包括线性模型、K近邻算法和朴素贝叶斯方法。
2.3.1 线性模型的基本思想
线性模型是一类简单但高效的监督学习模型,广泛应用于分类与回归任务。其基本思想是通过线性组合的方式建立输入特征与输出之间的关系。
以线性回归为例,其目标是找到一组权重 $ w $ 和偏置 $ b $,使得:
\hat{y} = w^T x + b
训练过程中,通常使用梯度下降法或正规方程(Normal Equation)来求解最优参数。
from sklearn.linear_model import LinearRegression
import numpy as np
# 示例数据
X = np.array([[1], [2], [3]])
y = np.array([2, 4, 6])
# 创建模型
model = LinearRegression()
model.fit(X, y)
# 预测
print(model.predict([[4]])) # 输出:[8.]
代码分析:
- LinearRegression() :创建线性回归模型;
- fit(X, y) :使用训练数据拟合模型;
- predict([[4]]) :预测输入为 4 时的输出值;
- 输出结果为 8,说明模型成功学习了 $ y = 2x $ 的线性关系。
2.3.2 K近邻算法与朴素贝叶斯方法
K近邻算法(KNN) 是一种基于距离的非参数学习方法,适用于分类和回归任务。其基本思想是:对于一个新样本,找到训练集中与其最接近的 K 个邻居,根据这些邻居的信息进行预测。
from sklearn.neighbors import KNeighborsClassifier
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X, y)
print(model.predict([[1.1]])) # 输出:[0]
代码分析:
- n_neighbors=3 :设置最近邻居数量为 3;
- fit(X, y) :训练模型;
- predict([[1.1]]) :预测输入为 1.1 时的类别;
- 输出为 0,表示该点更接近类别 0 的样本。
朴素贝叶斯(Naive Bayes) 是一种基于贝叶斯定理并假设特征之间相互独立的概率分类方法。其公式为:
P(y|x_1, x_2, …, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i|y)
适用于文本分类、垃圾邮件识别等场景。
from sklearn.naive_bayes import GaussianNB
X = [[1, 2], [2, 3], [3, 4], [4, 5]]
y = [0, 0, 1, 1]
model = GaussianNB()
model.fit(X, y)
print(model.predict([[2.5, 3.5]])) # 输出:[1]
代码分析:
- GaussianNB() :使用高斯朴素贝叶斯模型;
- fit(X, y) :训练模型;
- predict([[2.5, 3.5]]) :预测新样本的类别;
- 输出为 1,表示该点更可能属于类别 1。
2.4 实践应用:使用监督学习进行房价预测
为了更深入地理解监督学习的实际应用,我们将通过一个房价预测的案例,演示从数据预处理、特征工程到模型训练与评估的全过程。
2.4.1 数据预处理与特征工程
我们使用一个简化版的房价数据集,包含面积、卧室数量、楼层、地理位置等特征。
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 加载数据
df = pd.read_csv("house_prices.csv")
# 查看数据
print(df.head())
# 特征选择与标准化
X = df[['area', 'bedrooms', 'floor']]
y = df['price']
# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
代码分析:
- pd.read_csv() :加载CSV格式数据;
- StandardScaler() :对特征进行标准化,使各特征处于同一量纲;
- fit_transform() :拟合并转换数据,去除量纲影响。
2.4.2 模型训练与预测评估
我们使用线性回归模型进行训练,并使用均方误差(MSE)和决定系数(R²)来评估模型性能。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测与评估
y_pred = model.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))
print("R²:", r2_score(y_test, y_pred))
代码分析:
- train_test_split() :将数据集划分为训练集与测试集;
- fit(X_train, y_train) :训练模型;
- predict(X_test) :预测测试集输出;
- mean_squared_error() :计算均方误差;
- r2_score() :计算决定系数,衡量模型解释方差的能力。
2.4.3 模型调优与结果分析
我们可以尝试使用岭回归(Ridge Regression)来引入正则化,防止模型过拟合。
from sklearn.linear_model import Ridge
# 使用岭回归
ridge_model = Ridge(alpha=1.0)
ridge_model.fit(X_train, y_train)
# 评估
y_ridge_pred = ridge_model.predict(X_test)
print("Ridge MSE:", mean_squared_error(y_test, y_ridge_pred))
print("Ridge R²:", r2_score(y_test, y_ridge_pred))
代码分析:
- Ridge(alpha=1.0) :设置正则化强度;
- alpha :正则化系数,控制模型复杂度;
- 正则化可以有效缓解多重共线性问题,提升模型泛化能力。
通过本章的学习,我们不仅掌握了监督学习的基本原理,还深入了解了分类与回归任务的区别,以及几种常用算法的应用方式。最后通过房价预测案例,展示了监督学习从数据预处理到模型训练与评估的完整流程。这为后续章节中更复杂的机器学习任务奠定了坚实的基础。
3. 无监督学习聚类与降维技术
在机器学习的三大范式中,无监督学习因其无需标注数据的特性而独具魅力。它在探索性数据分析、模式识别、图像压缩、市场细分等领域中发挥着不可替代的作用。本章将系统地介绍无监督学习的核心思想,重点解析聚类和降维技术的原理与实现方法,并通过实际案例展示其在客户细分和数据可视化中的应用价值。
3.1 无监督学习的核心思想
无监督学习是机器学习中一种不依赖标签数据的学习方式,其核心在于从原始数据中发现潜在的结构、模式或分布规律。这种学习方法广泛应用于数据预处理、特征提取和探索性分析中。
3.1.1 无标签数据的价值
现实世界中,大量数据是未标注的。例如,用户在网站上的行为日志、传感器采集的原始数据、社交媒体上的文本信息等。这些数据虽然没有明确的标签,但它们内部蕴含着丰富的结构信息。无监督学习正是通过对这些数据进行建模,挖掘出数据之间的相似性、关联性或分布特征。
例如,用户行为聚类可以帮助电商平台识别出不同类型的客户群体,从而制定更精准的营销策略;在图像处理中,无监督学习可以用于图像分割和特征提取;在自然语言处理中,它可以用于词向量学习和语义聚类。
3.1.2 聚类与降维的应用意义
聚类(Clustering)和降维(Dimensionality Reduction)是无监督学习的两大核心技术。
- 聚类 :将相似的数据点归为一类,常用于客户细分、异常检测、图像分割等任务。
- 降维 :通过压缩数据维度保留关键信息,适用于数据可视化、特征提取和模型加速。
这两种技术常常协同使用,例如先通过PCA对数据降维,再使用K均值进行聚类,从而提升模型效率和可解释性。
3.2 常见聚类算法
聚类算法种类繁多,其中最常见的是K均值(K-Means)、层次聚类(Hierarchical Clustering)和基于密度的DBSCAN算法。它们各自适用于不同结构的数据集。
3.2.1 K均值聚类的基本流程
K均值是一种基于距离的迭代聚类算法,其核心思想是将数据划分为K个簇,使得每个数据点尽可能靠近其所属簇的中心。
算法流程:
- 随机初始化K个质心(Cluster Centroids);
- 将每个数据点分配到最近的质心所在的簇;
- 重新计算每个簇的质心;
- 重复步骤2和3,直到质心不再显著变化或达到最大迭代次数。
Python代码示例:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, random_state=42)
# 初始化KMeans模型
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)
# 输出聚类结果
print("Cluster centers:\n", kmeans.cluster_centers_)
print("Labels:\n", kmeans.labels_)
代码逻辑分析:
-
make_blobs:生成用于聚类的二维模拟数据。 -
KMeans:初始化聚类模型,指定簇的数量为4。 -
fit:执行聚类过程。 -
cluster_centers_:输出每个簇的质心坐标。 -
labels_:输出每个数据点所属的簇标签。
参数说明:
| 参数 | 说明 |
|---|---|
n_clusters | 需要划分的簇数量 |
random_state | 控制随机种子,确保结果可复现 |
init | 质心初始化方法(默认为 ‘k-means++’) |
优缺点:
| 优点 | 缺点 |
|---|---|
| 计算效率高,适合大规模数据 | 需要预先指定K值 |
| 实现简单,易于理解 | 对异常值和初始质心敏感 |
3.2.2 层次聚类与DBSCAN算法比较
层次聚类(Hierarchical Clustering)
层次聚类分为 凝聚式 (Agglomerative)和 分裂式 (Divisive)两种方式。最常用的是凝聚式聚类,其过程如下:
- 将每个样本视为一个簇;
- 逐步合并最相似的两个簇;
- 直到所有样本合并为一个簇或达到预设簇数。
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 生成数据
X, y = make_blobs(n_samples=50, centers=3, random_state=42)
# 层次聚类
clustering = AgglomerativeClustering(n_clusters=3)
labels = clustering.fit_predict(X)
# 可视化树状图
Z = linkage(X, 'ward')
dendrogram(Z)
plt.title("Dendrogram for Hierarchical Clustering")
plt.show()
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
DBSCAN是一种基于密度的聚类算法,适用于发现任意形状的簇,并能识别噪声点。
- 核心思想:如果一个区域的点密度超过某个阈值,则认为该区域是一个簇。
- 参数:
eps(邻域半径)、min_samples(邻域内最小样本数)
from sklearn.cluster import DBSCAN
# 使用DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)
print("DBSCAN labels:", labels)
对比分析:
| 特性 | 层次聚类 | DBSCAN |
|---|---|---|
| 是否需要指定K | 否(可通过树状图选择) | 否(自动识别簇数) |
| 对噪声的处理 | 不擅长 | 擅长 |
| 适用数据分布 | 球形簇 | 任意形状簇 |
| 计算复杂度 | O(n²) | O(n log n)(优化后) |
3.3 降维技术的实现方法
降维技术主要用于压缩数据维度,去除冗余信息,保留关键特征。它在可视化、特征提取和模型优化中具有重要作用。
3.3.1 主成分分析(PCA)原理
主成分分析(Principal Component Analysis, PCA)是一种线性降维方法,通过正交变换将原始数据投影到新的坐标轴上,使得新轴方向上的方差最大化。
核心步骤:
- 数据标准化;
- 计算协方差矩阵;
- 求解特征值与特征向量;
- 选择前k个特征向量构建投影矩阵;
- 数据映射到新空间。
示例代码:
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 应用PCA降维至2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 可视化降维结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.title("PCA of Iris Dataset")
plt.colorbar(label="Species")
plt.show()
参数说明:
| 参数 | 说明 |
|---|---|
n_components | 降维后的维度数 |
svd_solver | 特征分解算法(默认 ‘auto’) |
代码逻辑分析:
-
fit_transform:同时进行特征值分解与数据映射; -
scatter:绘制二维空间中的数据点,颜色表示类别; -
PCA能有效保留数据的主要方差方向,便于后续聚类或分类。
3.3.2 t-SNE与UMAP的可视化应用
t-SNE(t-Distributed Stochastic Neighbor Embedding)和UMAP(Uniform Manifold Approximation and Projection)是两种非线性降维方法,特别适用于高维数据的可视化。
t-SNE 示例:
from sklearn.manifold import TSNE
# 使用t-SNE降维
tsne = TSNE(n_components=2, perplexity=30, learning_rate=200, n_iter=1000)
X_tsne = tsne.fit_transform(X)
# 可视化
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='tab10')
plt.title("t-SNE Visualization of Iris")
plt.show()
UMAP 示例:
import umap
# 使用UMAP降维
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1)
embedding = reducer.fit_transform(X)
# 可视化
plt.scatter(embedding[:, 0], embedding[:, 1], c=y, cmap='Set1')
plt.title("UMAP Visualization of Iris")
plt.show()
算法对比表格:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| PCA | 线性、速度快、易于解释 | 只能处理线性关系 | 快速降维、特征提取 |
| t-SNE | 保留局部结构、可视化效果好 | 计算复杂度高、结果不稳定 | 高维数据可视化 |
| UMAP | 保留局部与全局结构、速度较快 | 参数调优较复杂 | 可视化与嵌入学习 |
3.4 实践案例:客户细分与数据可视化
为了更好地理解无监督学习的实际应用,我们以客户数据为例,进行客户细分与数据可视化。
3.4.1 客户数据的聚类分析
我们使用一个模拟的客户数据集,包含客户的年龄、年收入和消费评分。
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 模拟客户数据
data = {
'Age': [25, 35, 45, 50, 23, 42, 60, 48, 37, 29],
'Annual Income (k$)': [15, 80, 60, 70, 10, 65, 90, 75, 62, 20],
'Spending Score': [39, 81, 15, 70, 60, 50, 85, 78, 65, 40]
}
df = pd.DataFrame(data)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df)
# 使用KMeans聚类
kmeans = KMeans(n_clusters=3, random_state=42)
df['Cluster'] = kmeans.fit_predict(X_scaled)
print(df)
输出结果示例:
Age Annual Income (k$) Spending Score Cluster
0 25 15 39 2
1 35 80 81 0
2 45 60 15 1
3 50 70 70 0
4 23 10 60 2
分析结论:
- Cluster 0 :高收入、高消费,可能是高端客户;
- Cluster 1 :中等收入、低消费,可能是保守型客户;
- Cluster 2 :低收入、中等消费,可能是年轻客户群体。
3.4.2 使用PCA进行数据降维与可视化展示
# 使用PCA降维至2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 可视化聚类结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=df['Cluster'], cmap='Set1', s=100)
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.title("Customer Segmentation using PCA")
plt.colorbar(label="Cluster")
plt.show()
流程图展示:
graph TD
A[客户数据收集] --> B[数据标准化]
B --> C[KMeans聚类]
C --> D[聚类结果分析]
D --> E[PCA降维]
E --> F[二维可视化]
本章深入讲解了无监督学习的原理与实现方法,涵盖聚类与降维两大核心技术,结合代码示例与图表分析,帮助读者理解其在客户细分和数据可视化中的实际应用价值。
4. 半监督学习与强化学习原理
在机器学习的三大主要范式中,除了监督学习和无监督学习,半监督学习与强化学习因其独特的问题建模方式和广泛的应用前景,逐渐成为研究热点。本章将深入探讨这两种学习范式的理论基础、算法模型及其在实际问题中的应用。通过本章内容,读者将掌握半监督学习在有限标注数据场景下的优势,以及强化学习中Agent如何通过试错机制学习最优策略。
4.1 半监督学习的基本模式
半监督学习(Semi-Supervised Learning, SSL)是介于监督学习和无监督学习之间的一种机器学习方法,它利用少量的标注数据与大量的未标注数据相结合,以提高模型的泛化能力和预测性能。其核心思想是在缺乏足够标注样本的前提下,通过未标注数据来辅助模型训练,从而减少对人工标注的依赖。
4.1.1 少量标注数据与大量未标注数据的结合
在现实应用中,获取大量标注数据往往成本高昂。例如,在图像识别、语音识别或医疗诊断中,标注工作通常需要领域专家完成,效率低且费用高。此时,半监督学习通过引入未标注数据,可以显著提升模型的学习效率。
其典型框架如下:
graph TD
A[原始数据集] --> B{标注数据}
A --> C{未标注数据}
B --> D[初始模型训练]
D --> E[伪标签生成]
E --> F[与原始标注数据合并]
F --> G[重新训练模型]
该流程展示了半监督学习中的迭代思想:通过初始模型对未标注数据进行预测,生成伪标签(pseudo-label),然后将这些伪标签数据与原始标注数据一起训练模型,从而逐步提升模型性能。
4.1.2 半监督学习的典型应用场景
半监督学习特别适用于以下场景:
| 应用领域 | 说明 |
|---|---|
| 图像分类 | 使用少量标注图像与大量未标注图像提升分类准确率 |
| 自然语言处理 | 如文本分类、情感分析等任务中,标注语料稀缺 |
| 医疗诊断 | 医疗图像标注需专家参与,数据获取成本高 |
| 网络安全 | 异常检测中正常样本丰富,攻击样本稀少 |
此外,近年来深度学习中的半监督方法,如FixMatch、Mean Teacher、Virtual Adversarial Training(VAT)等,已经在多个基准数据集上取得了接近全监督学习的性能。
4.2 强化学习的基本概念
强化学习(Reinforcement Learning, RL)是一种基于试错机制的学习方法,其核心思想是Agent通过与环境的交互不断学习最优策略,以最大化长期累积奖励。强化学习与监督学习的关键区别在于,它不依赖于标注数据,而是通过探索与环境的互动来学习。
4.2.1 Agent、环境与奖励机制
强化学习的基本组成包括:
- Agent(智能体) :学习和决策的主体,通过观察环境状态采取动作。
- Environment(环境) :Agent所处的外部世界,可以是现实环境或模拟环境。
- State(状态) :环境在某一时刻的表现形式。
- Action(动作) :Agent可以采取的行动。
- Reward(奖励) :Agent执行动作后环境给予的反馈信号,用于评估动作的优劣。
其交互过程可以用以下流程图表示:
graph LR
A[Agent] --> B[执行Action]
B --> C[Environment]
C --> D[返回State和Reward]
D --> A
4.2.2 Q-learning与策略梯度方法简介
Q-learning 是一种经典的无模型强化学习算法,它通过维护一个Q表(Q-table)来记录在某个状态下采取某个动作所能获得的预期回报。
Q-learning的更新公式如下:
Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha [r_t + \gamma \max_{a} Q(s_{t+1}, a) - Q(s_t, a_t)]
其中:
- $ Q(s, a) $:状态-动作对的Q值
- $ \alpha $:学习率(0 ≤ α ≤ 1)
- $ r_t $:当前奖励
- $ \gamma $:折扣因子,用于权衡当前奖励与未来奖励的重要性
策略梯度方法 (Policy Gradient)则直接优化策略函数 π(a|s),而不是学习值函数。这类方法通常用于连续动作空间的问题,例如机器人控制。
4.3 深度强化学习的前沿发展
随着深度学习的发展,深度强化学习(Deep Reinforcement Learning, DRL)成为强化学习的重要分支。它将深度神经网络作为函数逼近器,用于估计Q值或策略函数,从而处理高维状态空间和复杂动作空间的问题。
4.3.1 DQN与Actor-Critic架构
DQN(Deep Q-Network) 是将Q-learning与深度神经网络结合的经典算法。其主要改进包括:
- 使用经验回放(Experience Replay)来打破数据相关性
- 使用目标网络(Target Network)稳定训练过程
DQN的网络结构如下:
graph LR
Input[状态输入] --> DQN[深度神经网络]
DQN --> Output[输出各动作Q值]
Actor-Critic 架构 是一种结合策略梯度(Actor)与值函数估计(Critic)的方法。Actor用于选择动作,Critic用于评估当前策略的优劣,两者协同优化策略。
Actor-Critic结构示意如下:
graph LR
State[状态输入] --> Actor[Actor网络]
Actor --> Action[输出动作]
Action --> Environment[环境]
Environment --> Reward[获得奖励与新状态]
Reward --> Critic[Critic网络]
Critic --> Loss[更新Actor与Critic]
4.3.2 应用于游戏控制与机器人路径规划
深度强化学习在多个领域取得了突破性成果:
- 游戏控制 :AlphaGo 使用 DRL 技术击败世界顶级围棋选手,成为深度强化学习的里程碑事件。
- 机器人路径规划 :通过训练Agent在复杂环境中自主导航,如无人机避障、自动驾驶路径规划等。
以机器人路径规划为例,Agent需要在地图中寻找从起点到终点的最优路径。以下是一个简单的路径规划代码示例:
import gym
import numpy as np
from stable_baselines3 import DQN
# 创建路径规划环境
env = gym.make('Deterministic-4x4-FrozenLake-v0')
# 使用DQN训练Agent
model = DQN('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=10000)
# 测试训练后的Agent
obs = env.reset()
for _ in range(100):
action, _states = model.predict(obs, deterministic=True)
obs, reward, done, info = env.step(action)
env.render()
if done:
break
代码解释:
-
gym.make('Deterministic-4x4-FrozenLake-v0'):创建一个4x4的网格环境,目标是找到安全路径到达终点。 -
DQN('MlpPolicy', env, verbose=1):使用DQN算法训练,策略为多层感知机(MLP)。 -
model.learn(total_timesteps=10000):训练10000步。 -
model.predict(obs):根据当前状态预测最优动作。
参数说明:
-
total_timesteps:控制训练的总步数,数值越大训练越充分。 -
deterministic=True:表示使用确定性策略进行预测,避免随机探索。 -
verbose=1:输出训练过程信息。
4.4 实践应用:使用Q-learning实现迷宫导航
为了更直观地理解强化学习的工作机制,我们通过一个简单的迷宫导航任务来实现Q-learning算法。
4.4.1 环境设置与Agent行为设计
假设迷宫是一个5x5的网格,Agent从起点出发,寻找通往终点的路径。墙壁为不可穿越区域,Agent每次可以向上、下、左、右移动。
我们使用Q-learning算法实现Agent的训练过程,代码如下:
import numpy as np
# 初始化Q表
q_table = np.zeros([25, 4]) # 25个状态,每个状态有4个动作
# 定义环境参数
env = {
'start': 0,
'end': 24,
'walls': [5, 6, 7, 12, 18, 19, 20],
'actions': {'up': 0, 'down': 1, 'left': 2, 'right': 3}
}
# Q-learning参数
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
epsilon = 0.1 # 探索率
# 训练过程
for episode in range(1000):
state = env['start']
done = False
while not done:
if np.random.uniform() < epsilon:
action = np.random.choice(4) # 探索
else:
action = np.argmax(q_table[state])
# 执行动作并获得下一个状态和奖励
next_state, reward, done = step(state, action)
# 更新Q表
q_table[state, action] = q_table[state, action] + alpha * (
reward + gamma * np.max(q_table[next_state]) - q_table[state, action]
)
state = next_state
代码逻辑分析:
-
q_table:记录每个状态和动作的Q值。 -
step()函数:模拟环境转移函数,需自行实现。 -
np.random.uniform() < epsilon:实现ε-greedy策略,平衡探索与利用。 -
q_table[state, action] = ...:Q-learning的更新公式实现。
4.4.2 训练过程与收敛分析
随着训练轮次(episode)的增加,Q表逐渐收敛,Agent学会从起点到终点的最优路径。我们可以通过绘制每轮episode的奖励曲线来分析训练效果。
import matplotlib.pyplot as plt
# 记录每轮episode的奖励
rewards = []
# 在训练循环中加入记录
for episode in range(1000):
...
rewards.append(reward)
# 绘制奖励曲线
plt.plot(rewards)
plt.xlabel('Episode')
plt.ylabel('Reward')
plt.title('Q-learning Training Curve')
plt.show()
参数说明:
-
rewards:记录每轮训练的奖励值。 -
plt.plot():绘制训练过程中的奖励变化趋势。 - 若曲线趋于平稳并接近最大奖励值,说明训练已收敛。
本章系统介绍了半监督学习与强化学习的核心概念、典型算法及其实现方式,通过代码示例展示了Q-learning在实际问题中的应用。下一章将聚焦于线性回归模型的设计与实现,进一步夯实机器学习的基础建模能力。
5. 线性回归模型设计与实现
线性回归是机器学习中最基础也是最重要的回归算法之一。它不仅为理解更复杂的回归模型奠定了基础,而且在实际应用中也具有广泛的价值。本章将从线性回归的基本原理入手,逐步深入到模型实现、评估诊断以及实际案例的应用分析。通过本章的学习,读者将掌握如何从零开始构建一个线性回归模型,并能对模型性能进行科学评估与调优。
5.1 线性回归的基本原理
线性回归是一种用于建模因变量(目标变量)与一个或多个自变量(特征变量)之间线性关系的统计方法。其核心思想是通过寻找最佳拟合直线(或超平面),使得预测值与真实值之间的误差最小。
5.1.1 模型形式与参数估计
线性回归的基本模型形式如下:
y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_n x_n + \epsilon
其中:
- $ y $:因变量(目标变量)
- $ x_i $:第 $ i $ 个自变量(特征)
- $ \beta_0 $:截距项(偏置项)
- $ \beta_i $:第 $ i $ 个特征的系数(权重)
- $ \epsilon $:误差项,表示模型未解释的随机噪声
模型的参数估计通常使用 最小二乘法 (Ordinary Least Squares, OLS)进行求解,其目标是最小化预测值与真实值之间的平方误差之和。
5.1.2 最小二乘法与损失函数
最小二乘法的目标函数(损失函数)定义为:
\text{Loss} = \sum_{i=1}^{m} (y_i - \hat{y}_i)^2
其中:
- $ y_i $:第 $ i $ 个样本的真实值
- $ \hat{y}_i $:第 $ i $ 个样本的预测值
- $ m $:样本数量
通过求解该损失函数的最小值,可以得到最优的参数 $ \beta $ 值。使用矩阵形式表达为:
\hat{\beta} = (X^T X)^{-1} X^T y
其中:
- $ X $:特征矩阵(包含截距项)
- $ y $:目标变量向量
这个公式被称为 正规方程 (Normal Equation),适用于数据量较小的情况。对于大规模数据集,通常采用 梯度下降法 进行参数优化。
5.2 模型实现的关键步骤
构建一个完整的线性回归模型需要经历数据准备、特征选择、模型训练与参数优化等多个关键步骤。本节将详细解析这些步骤的实现逻辑。
5.2.1 特征选择与数据预处理
特征选择是影响模型性能的关键因素之一。在实际建模过程中,需遵循以下原则:
- 去除无关特征 :剔除与目标变量无显著关系的特征。
- 处理多重共线性 :使用方差膨胀因子(VIF)等方法检测特征之间的相关性。
- 标准化/归一化 :对特征进行标准化(如 Z-Score)或归一化(如 Min-Max)以提升模型收敛速度。
- 处理缺失值与异常值 :填充缺失值(如均值、中位数)或删除异常样本。
以下是一个使用 Python 的 pandas 和 sklearn 进行特征预处理的示例代码:
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 加载数据
data = pd.read_csv('sales_data.csv')
# 特征选择
X = data[['TV', 'Radio', 'Newspaper']]
y = data['Sales']
# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
代码逻辑分析:
- pd.read_csv 用于读取CSV格式的销售数据。
- X 表示输入特征,包括广告支出(TV、Radio、Newspaper)。
- y 表示输出目标,即销售额。
- StandardScaler 对特征进行标准化,使其均值为0,标准差为1,有助于线性回归模型更快收敛。
5.2.2 模型训练与参数优化
在数据预处理完成后,使用 sklearn.linear_model.LinearRegression 进行模型训练:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 模型训练
model = LinearRegression()
model.fit(X_train, y_train)
# 输出参数
print('Coefficients:', model.coef_)
print('Intercept:', model.intercept_)
代码逻辑分析:
- train_test_split 将数据集划分为训练集和测试集,用于模型评估。
- LinearRegression() 创建线性回归模型对象。
- fit() 方法用于训练模型,计算每个特征的系数。
- coef_ 属性返回模型的权重参数, intercept_ 返回截距项。
模型参数说明:
假设输出如下:
Coefficients: [0.045, 0.178, -0.001]
Intercept: 4.623
则模型形式为:
\text{Sales} = 4.623 + 0.045 \cdot \text{TV} + 0.178 \cdot \text{Radio} - 0.001 \cdot \text{Newspaper}
从参数可见,TV和Radio的系数为正,说明广告投入增加会提升销售额;Newspaper的系数为负且接近0,说明其对销售额的影响较小,可能可忽略。
5.3 模型评估与诊断
构建完线性回归模型后,必须进行评估和诊断,以判断模型是否合理、是否存在过拟合或欠拟合等问题。
5.3.1 残差分析与拟合优度评估
残差是指真实值与预测值之间的差异。通过分析残差可以判断模型是否满足线性回归的基本假设(如正态性、同方差性等)。
import matplotlib.pyplot as plt
# 预测
y_pred = model.predict(X_test)
# 残差计算
residuals = y_test - y_pred
# 绘制残差图
plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.show()
代码逻辑分析:
- predict() 方法用于在测试集上进行预测。
- 残差图用于观察预测值与残差之间的关系,理想情况下残差应随机分布在0附近,无明显趋势。
- 若残差呈扇形分布,说明存在 异方差性 ,可能需要使用加权最小二乘法(WLS)或转换目标变量。
此外,常用的拟合优度指标包括:
| 指标 | 含义 |
|---|---|
| R²(决定系数) | 表示模型解释的方差比例,取值范围 [0,1],越接近1越好 |
| MAE(平均绝对误差) | 平均预测误差的绝对值 |
| MSE(均方误差) | 平均预测误差的平方,对大误差更敏感 |
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
# 计算评估指标
r2 = r2_score(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print(f'R²: {r2:.3f}, MAE: {mae:.3f}, MSE: {mse:.3f}')
5.3.2 多重共线性与异方差问题
多重共线性是指自变量之间存在高度相关性,可能导致模型参数不稳定。常用诊断方法包括:
- 方差膨胀因子(VIF) :VIF > 10 表示存在严重共线性。
- 条件指数 :>30 可能存在共线性。
异方差性是指误差项的方差不恒定,可通过以下方式解决:
- 使用加权最小二乘法(WLS)
- 对目标变量进行对数变换(log(y))
- 使用稳健标准误(Robust Standard Errors)
5.4 实践项目:使用线性回归分析销售数据
本节将以一个实际案例展示如何使用线性回归分析销售数据,从数据清洗、特征工程到模型构建与结果解释的完整流程。
5.4.1 数据清洗与特征工程
首先加载并查看数据结构:
import pandas as pd
# 加载数据
df = pd.read_csv('sales_data.csv')
# 查看数据
print(df.head())
print(df.info())
假设输出如下:
TV Radio Newspaper Sales
0 230.1 37.8 69.2 22.1
1 44.5 39.3 45.1 10.4
2 17.2 45.9 69.3 9.3
3 151.5 41.3 58.5 18.5
4 180.8 10.8 58.4 12.9
接下来进行缺失值处理:
# 检查缺失值
print(df.isnull().sum())
# 填充缺失值(假设存在)
df.fillna(df.mean(), inplace=True)
进行特征工程时,可以考虑引入交互项或多项式特征:
from sklearn.preprocessing import PolynomialFeatures
# 构建二阶多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X_scaled)
5.4.2 模型构建与结果解释
使用多项式特征后重新训练模型:
# 重新划分数据集
X_train_poly, X_test_poly, y_train, y_test = train_test_split(X_poly, y, test_size=0.2, random_state=42)
# 模型训练
model_poly = LinearRegression()
model_poly.fit(X_train_poly, y_train)
# 评估
y_pred_poly = model_poly.predict(X_test_poly)
r2_poly = r2_score(y_test, y_pred_poly)
print(f'Polynomial R²: {r2_poly:.3f}')
模型结果解释:
- 若多项式模型的 R² 为 0.93,而原始线性模型为 0.89,则说明引入多项式特征提升了模型拟合能力。
- 需注意过拟合风险,可使用交叉验证(Cross-Validation)进一步验证模型泛化能力。
以下为使用交叉验证的示例:
from sklearn.model_selection import cross_val_score
# 交叉验证
scores = cross_val_score(model_poly, X_poly, y, cv=5, scoring='r2')
print(f'Cross-Validated R²: {scores.mean():.3f}')
流程图展示:
graph TD
A[加载销售数据] --> B[数据清洗]
B --> C[特征选择与标准化]
C --> D[构建多项式特征]
D --> E[划分训练集与测试集]
E --> F[线性回归模型训练]
F --> G[模型评估与诊断]
G --> H[结果解释与优化]
通过该流程图可以清晰地看到整个建模过程的逻辑结构,帮助开发者系统性地理解模型构建的每一步。
本章完整地介绍了线性回归模型的设计与实现流程,从理论推导到代码实现,再到模型评估与实际应用,涵盖了从入门到实战的全过程。下一章将深入讲解逻辑回归模型,进一步拓展读者对回归与分类模型的理解与应用能力。
6. 逻辑回归分类算法详解
逻辑回归(Logistic Regression)是机器学习中应用最广泛的分类算法之一,尽管其名称中含有“回归”,但它本质上是一个分类模型,尤其适用于二分类问题。本章将从逻辑回归的基本原理入手,逐步深入探讨其模型训练与优化方式,并拓展至多类别分类方法,最后通过一个实际案例展示其在邮件分类中的应用。
6.1 逻辑回归的基本原理
逻辑回归的核心思想是将线性回归的输出映射到一个概率值上,从而进行分类决策。这主要依赖于 Sigmoid 函数。
6.1.1 概率建模与 Sigmoid 函数
Sigmoid 函数的数学形式如下:
\sigma(z) = \frac{1}{1 + e^{-z}}
其输出值范围为 (0,1),非常适合用来表示一个样本属于某一类别的概率。例如,在二分类任务中,若输出值大于0.5,则判定为类别1;否则为类别0。
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(z):
return 1 / (1 + np.exp(-z))
z = np.linspace(-10, 10, 200)
plt.plot(z, sigmoid(z))
plt.title('Sigmoid Function')
plt.xlabel('z')
plt.ylabel('σ(z)')
plt.grid(True)
plt.show()
代码说明:
-np.linspace(-10, 10, 200):生成 -10 到 10 之间等距的200个点。
-sigmoid(z):计算每个点对应的 Sigmoid 值。
- 绘制 Sigmoid 函数曲线,帮助理解其非线性映射特性。
6.1.2 决策边界与分类效果
逻辑回归的决策边界由以下公式定义:
\hat{y} =
\begin{cases}
1 & \text{if } \sigma(w^T x + b) \geq 0.5 \
0 & \text{otherwise}
\end{cases}
该边界将输入空间划分为两个区域,分别对应两个类别。在二维空间中,决策边界是一条直线(线性可分)。
6.2 模型训练与优化
逻辑回归的训练目标是通过优化损失函数来找到最优的参数 $w$ 和 $b$。
6.2.1 交叉熵损失函数
逻辑回归使用交叉熵作为损失函数,其定义如下:
L(w, b) = -\frac{1}{N} \sum_{i=1}^{N} [y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)})]
其中,$ \hat{y}^{(i)} = \sigma(w^T x^{(i)} + b) $
该损失函数鼓励模型对真实类别输出接近1的概率,对错误类别输出接近0的概率。
6.2.2 梯度下降法在逻辑回归中的应用
梯度下降法用于最小化损失函数,更新参数的公式如下:
w := w - \alpha \frac{\partial L}{\partial w}, \quad b := b - \alpha \frac{\partial L}{\partial b}
其中,$\alpha$ 是学习率,控制更新步长。
以下是逻辑回归的简化实现代码:
def compute_loss(y, y_hat):
m = y.shape[0]
loss = -1/m * np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat))
return loss
def gradient_descent(X, y, w, b, learning_rate, num_iterations):
m = X.shape[0]
for i in range(num_iterations):
z = np.dot(X, w) + b
y_hat = sigmoid(z)
dw = 1/m * np.dot(X.T, (y_hat - y))
db = 1/m * np.sum(y_hat - y)
w -= learning_rate * dw
b -= learning_rate * db
if i % 100 == 0:
print(f"Iteration {i}: Loss = {compute_loss(y, y_hat)}")
return w, b
参数说明:
-X:特征矩阵,形状为 (m, n)
-y:标签向量,形状为 (m, 1)
-w:权重参数,形状为 (n, 1)
-b:偏置项
-learning_rate:学习率
-num_iterations:迭代次数
6.3 多类别分类的扩展方法
虽然逻辑回归本质上是一个二分类器,但可以通过一些策略扩展至多类别分类任务。
6.3.1 One-vs-Rest 与 Softmax 回归
- One-vs-Rest (OvR) :对于 K 个类别,分别训练 K 个二分类模型,每个模型区分当前类别与其他类别。
- Softmax 回归 :适用于多类别分类,输出为每个类别的概率分布。
Softmax 函数定义如下:
\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}
Softmax 损失函数为:
L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{K} y_{ij} \log(\hat{y}_{ij})
6.3.2 多分类性能评估方法
对于多类别分类,常用的评估指标包括:
| 指标名称 | 说明 |
|---|---|
| 准确率(Accuracy) | 正确预测样本数 / 总样本数 |
| 精确率(Precision) | 预测为正类中真实为正的比例 |
| 召回率(Recall) | 真实为正类中被预测为正的比例 |
| F1 分数 | 精确率与召回率的调和平均 |
| 混淆矩阵(Confusion Matrix) | 显示预测与真实标签分布的矩阵 |
6.4 实践应用:使用逻辑回归进行邮件分类
本节将使用逻辑回归构建一个简单的垃圾邮件分类器。
6.4.1 文本数据的向量化处理
首先,使用 TfidfVectorizer 对文本进行向量化:
from sklearn.feature_extraction.text import TfidfVectorizer
# 假设有以下邮件样本
emails = ["Free money now!!!", "Meeting rescheduled to 3 PM", "Claim your prize today", "Project update attached"]
labels = [1, 0, 1, 0] # 1 表示垃圾邮件,0 表示正常邮件
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(emails)
说明:
-TfidfVectorizer将文本转换为 TF-IDF 特征向量。
- 该过程将每个词的重要性(词频 × 逆文档频率)作为特征。
6.4.2 模型训练与分类准确率评估
接下来使用 LogisticRegression 进行训练与评估:
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
model = LogisticRegression()
model.fit(X, labels)
# 测试集预测
test_emails = ["Win money now", "See you in meeting"]
X_test = vectorizer.transform(test_emails)
predictions = model.predict(X_test)
print("Predictions:", predictions)
print("Accuracy on training data:", accuracy_score(labels, model.predict(X)))
输出示例:
Predictions: [1 0] Accuracy on training data: 1.0说明:
- 模型成功将测试邮件分类为垃圾邮件或正常邮件。
- 在训练集上准确率为 100%,但实际部署时应使用更多数据和交叉验证以避免过拟合。流程图展示训练流程:
graph TD
A[原始文本数据] --> B[文本清洗]
B --> C[分词处理]
C --> D[Tfidf向量化]
D --> E[逻辑回归模型训练]
E --> F[预测新邮件]
F --> G[输出分类结果]
下一章节我们将深入探讨决策树与随机森林算法的原理与实践应用,进一步拓展分类模型的知识体系。
简介:《斯坦福机器学习讲义》中文版由黄海广整理,系统介绍了机器学习的核心概念与主流算法,涵盖监督学习、无监督学习、半监督学习与强化学习。讲义内容从基础模型如线性回归、逻辑回归到高级算法如随机森林、支持向量机和深度学习,全面覆盖机器学习理论与实践。同时讲解了损失函数、优化算法、正则化方法以及模型评估指标,帮助读者掌握从建模到调优的全流程技能。通过丰富的案例与练习,适合初学者入门和进阶者提升实战能力。
更多推荐



所有评论(0)