序言
监督学习是机器学习领域中的一项基础技术,其核心在于利用带有已知标签的数据集来训练模型,使模型能够学习输入与输出之间的映射关系。这种学习方式的特点在于,通过已知的输入-输出对来指导模型的学习过程,从而确保模型能够对新的、未见过的数据做出准确的预测。
监督学习算法(Supervised Learning Algorithms)
-
定义:
- 监督学习算法,粗略地说,是给定一组输入 x \boldsymbol{x} x和输出 y y y的训练集,学习如何关联输入和输出。
- 在许多情况下,输出 y y y很难自动收集,必须由人来提供”管理“,不过该术语仍然适用于训练集目标可以被自动收集的情况。
-
概率监督学习(Probabilistic Supervised Learning)
- 大部分监督学习算法都是基于估计概率分布 p ( y ∣ x ) p(y\mid\boldsymbol{x}) p(y∣x)。我们可以使用最大似然估计找到对有参分布簇 p ( y ∣ x ; θ ) p(y\mid\boldsymbol{x;\theta}) p(y∣x;θ)最好的参数向量 θ \boldsymbol{\theta} θ。
- 我们已经看到,线性回归对应于分布簇: p ( y ∣ x ; θ ) = N ( y ; θ ⊤ x , I ) p(y\mid\boldsymbol{x;\theta})=\mathcal{N}(y;\boldsymbol{\theta}^\top \boldsymbol{x}, \boldsymbol{I}) p(y∣x;θ)=N(y;θ⊤x,I)
- 通过定义一簇不同的概率分布,我们可以将线性回归扩展到分类情况中。如果我们有两个类:类0和类1,那么我们只需要指定这两类之一的概率。类1的概率决定了类0的概率,因为这两个值加起来必须等于1。
-
- 我们用于线性回归的实数正态分布是用均值参数化的。我们提供这个均值的任何值都是有效的。
- 二元变量上的分布稍微复杂些,因为它的均值必须始终在0和1之间。解决这个问题的一种方法是使用logistic sigmoid函数将线性回归函数的输出压缩进区间(0,1)。该值可以解释为概率: p ( y = 1 ∣ x ; θ ) = σ ( θ ⊤ x ) p(y=1\mid\boldsymbol{x;\theta})=\sigma(\boldsymbol{\theta}^\top \boldsymbol{x}) p(y=1∣x;θ)=σ(θ⊤x),这个方法被称为逻辑回归(logistic regression)。 注意:该方法用于分类,而非回归。
- 线性回归中,我们能够通过求解正规方程以找到最佳权重。而逻辑回归中,其最佳权重没有闭解。
- 反之,我们必须最大化对数似然来搜索最优解。我们可以通过梯度下降最小化负对数似然达到这一点。
- 通过确定正确的输入和输出变量上的有参条件概率分布簇,相同的策略基本上可以用于任何监督学习问题。
-
支持向量机(support vector machine, SVM)
- 支持向量机(support vector machine, SVM)是监督学习中最有影响力的方法之一。
- 逻辑回归(LR)与支持向量机(SVM)异同点:
- 类似于逻辑回归,这个模型也是基于线性函数 w ⊤ x + b \boldsymbol{w}^\top \boldsymbol{x}+b w⊤x+b。
- 不同于逻辑回归的是,支持向量机不输出概率,只输错类别。
- 当 w ⊤ x + b \boldsymbol{w}^\top \boldsymbol{x}+b w⊤x+b为正时,支持向量机预测属于正类。
- 当 w ⊤ x + b \boldsymbol{w}^\top \boldsymbol{x}+b w⊤x+b为负时,支持向量机预测属于负类。
- 核技巧(kernel trick)
- 支持向量机的一个重要创新是核技巧。核策略观察到许多机器学习算法都可以写成样本间点积的形式。
- 例如,支持向量机中的线性函数可以重写为: w ⊤ x + b = ∑ i = 1 m α i x ⊤ x ( i ) + b \boldsymbol{w}^\top \boldsymbol{x}+b=\sum\limits_{i=1}^m \alpha_i\boldsymbol{x}^\top x^{(i)}+b w⊤x+b=i=1∑mαix⊤x(i)+b。
- 说明:
- x ( i ) \boldsymbol{x}^{(i)} x(i)是训练样本, α \alpha α是系数向量。
- 核函数(kernel function)
- 学习算法重写为这种形式允许我们将
x
\boldsymbol{x}
x替换为特征函数
ϕ
(
x
)
\phi(\boldsymbol{x})
ϕ(x)的输出,点积(即公式书写用
⊙
\odot
⊙,编码用
⋅
\cdot
⋅)替换为被称为核函数(kernel function)的函数:
k
(
x
,
x
(
i
)
)
=
ϕ
(
x
)
⋅
ϕ
(
x
(
i
)
)
k(\boldsymbol{x},\boldsymbol{x}^{(i)})=\phi(\boldsymbol{x})\cdot\phi(\boldsymbol{x}^{(i)})
k(x,x(i))=ϕ(x)⋅ϕ(x(i))。
-
注意:该公式中” ⋅ \cdot ⋅“操作表示类似于 ϕ ( x ) ϕ ( x ( i ) ) \phi(\boldsymbol{x})\phi(\boldsymbol{x}^{(i)}) ϕ(x)ϕ(x(i))的点积。
-
对于某些特征空间,我们可能不会书面地使用向量内积。
-
在某些无限维空间中,我们需要使用其他类型的内积,如基于积分而非总和的内积。
-
核估计替换点积之后,我们可以使用如下函数进行预测: f ( x ) = b + ∑ i α i k ( x , x ( i ) ) f(\boldsymbol{x})=b+\sum\limits_i\alpha_i k(\boldsymbol{x},\boldsymbol{x}^{(i)}) f(x)=b+i∑αik(x,x(i))
-
这个函数关于 x \boldsymbol{x} x是非线性的,关于 ϕ ( x ) \phi(\boldsymbol{x}) ϕ(x)是线性的。 α \alpha α和 f ( x ) f(\boldsymbol{x}) f(x)之间的关系也是线性的。
-
核函数完全等价于用 ϕ ( x ) \phi(\boldsymbol{x}) ϕ(x)预处理所有的输入,然后在新的转换空间学习线性模型。
-
- 核策略十分强大有两个原因:
- 首先,它使我们能够使用保证有效收敛的凸优化技术来学习作为 x \boldsymbol{x} x的函数的非线性模型。这是可能的,因为我们可以认为 θ \theta θ是固定的,仅优化 α \alpha α,即优化算法可以将决策函数视为不同空间中的线性函数。
- 其次,核函数 k k k的实现方法通常有比直接构建 ϕ ( x ) \phi(\boldsymbol{x}) ϕ(x)再算点积高效很多。
- 有些情况下, θ ( x ) \theta(\boldsymbol{x}) θ(x)甚至可以是无限维的,对于普通的显示方法而言,这将是无限的计算代价。
- 在很多情况下,即使
θ
(
x
)
\theta(\boldsymbol{x})
θ(x)是难算的,
k
(
x
,
x
′
)
k(\boldsymbol{x},\boldsymbol{x}^\prime)
k(x,x′)却会是一个关于
x
\boldsymbol{x}
x非线性的,容易计算的函数。
- 例如,无限维空间易解的核例子,我们构建一个作用于非负整数 x \boldsymbol{x} x上的特征映射 θ ( x ) \theta(\boldsymbol{x}) θ(x)。
- 假设这个映射返回一个由开头 x x x个1,随后是无限个0的向量。我们可以写一个核函数 k ( x , x ( i ) ) = min ( x , x ( i ) ) k(x,x^{(i)})=\min(x,x^{(i)}) k(x,x(i))=min(x,x(i)),完全等价于对应的无限维点积。
- 学习算法重写为这种形式允许我们将
x
\boldsymbol{x}
x替换为特征函数
ϕ
(
x
)
\phi(\boldsymbol{x})
ϕ(x)的输出,点积(即公式书写用
⊙
\odot
⊙,编码用
⋅
\cdot
⋅)替换为被称为核函数(kernel function)的函数:
k
(
x
,
x
(
i
)
)
=
ϕ
(
x
)
⋅
ϕ
(
x
(
i
)
)
k(\boldsymbol{x},\boldsymbol{x}^{(i)})=\phi(\boldsymbol{x})\cdot\phi(\boldsymbol{x}^{(i)})
k(x,x(i))=ϕ(x)⋅ϕ(x(i))。
- 高斯核(Gaussian kernel)
- 最常用的核函数是高斯核(Gaussian kernel), k ( u , v ) = N ( u − v ; 0 , σ 2 I ) k(\boldsymbol{u},\boldsymbol{v})=\mathcal{N}(\boldsymbol{u}-\boldsymbol{v};\boldsymbol{0},\sigma^2 \boldsymbol{I}) k(u,v)=N(u−v;0,σ2I)
- 说明:
- 其中 N ( x ; μ , Σ ) \mathcal{N}(x;\boldsymbol{\mu},\boldsymbol{\Sigma}) N(x;μ,Σ)是标准正态密度。这个核也被称为径向基函数(radial basis function, RBF)核,因为其值沿 v \boldsymbol{v} v中从 u \boldsymbol{u} u向外辐射的方向减小。
- 高斯核对应于无限维空间中的点积,但是该空间的推导没有整数上的 min \min min核实例直观。
- 我们可以认为高斯核在执行一种模板匹配。训练标签 y y y相关的训练样本 x \boldsymbol{x} x变成了类别 y y y的模板。
- 当测试点 x ′ \boldsymbol{x}^\prime x′到 x \boldsymbol{x} x的欧几里得距离很小时,对应的高斯核很大,表明 x ′ \boldsymbol{x}^\prime x′和模板 x \boldsymbol{x} x非常相似。
- 该模型进而会赋予相对应的训练标签 y y y较大的权重。
- 总的来说,预测将会组合很多这种通过训练样本相似性加权的训练标签。
- 支持向量机不是唯一可以使用核策略来增强的算法。许多其他的线性模型可以通过这种方式来增强。
- 核机器(kernel machine)、核方法(kernel method)
- 使用核策略的算法类别被称为核机器(kernel machine)或核方法(kernel method)。
- 支持向量(support vector)
- 核机器的一个主要缺点是计算决策函数的成本关于训练样本的数目是线性的。
- 因为第 i i i个样本贡献 α i k ( x , x ( i ) ) \alpha_ik(\boldsymbol{x},\boldsymbol{x}^{(i)}) αik(x,x(i))到决策函数。支持向量机能够通过学习主要包含零的向量 α \boldsymbol{\alpha} α,以缓和这个缺点。那么判断新样本的类别仅需要计算非零 α i \alpha _i αi对应的训练样本的核函数。这些训练样本被称为支持向量(support vector)。
- 当数据集很大时,核机器的计算量也会很大。带通用核的核机器会泛化得更好。
- 现在深度学习的设计旨在克服核机器的这些限制。
-
其他简单的监督学习算法
- 我们在应用数学与机器学习基础 - 容量、过拟合和欠拟合篇介绍过另一个非概率监督学习算法,即近邻回归。
- 更一般地, k k k-最近邻是一类可用于分类或回归的技术。作为一个非参数学习算法, k k k-最近邻并不局限于固定数目的参数。
- 我们通常认为 k k k-最近邻算法没有任何参数,而是使用训练数据的简单函数。事实上,甚至也没有一个真正的训练阶段或学习过程。反之,在测试阶段我们希望在新的测试输入 x \boldsymbol{x} x上产生 y y y,我们需要在训练数据 X \boldsymbol{X} X上找到 x \boldsymbol{x} x的 k k k-最近邻。然后我们返回训练集上对应的 y y y值的平均值。这几乎适用于任何类型可以确定 y y y值平均值的监督学习。
- 在分类情况中,我们可以关于One-Hot编码向量 c \boldsymbol{c} c求平均,其中 c y = 1 c_y=1 cy=1,其他的 i i i值取 c i = 0 c_i=0 ci=0。然后,我们可以解释这些One-Hot编码的均值为类别的概率分布。
- 作为一个非参数学习算法, k k k-最近邻能达到非常高的容量。
- 例如,假设我们有一个用0-1误差度量性能的多分类任务。
- 在此设定中,当训练样本数目趋向无限大时,1-最近邻收敛到两倍贝叶斯误差。超出贝叶斯误差的原因是它会随机从等距离的邻近点中随机挑选一个。
- 当有限的训练数据时,所有测试点 x \boldsymbol{x} x周围距离为零的邻近点有无限多个。
- 如果我们使用所有这些邻近点投票的决策方式,而不是随机挑选一个,那么该过程将会收敛到贝叶斯错误率。
k
k
k-最近邻的高容量使其在训练样本数目大时能够获取较高的精度。然而,它的计算成本很高,另外在训练集较小时泛化能力很差。
k
k
k-最近邻的一个弱点是它不能学习出哪一个特征比其他更具识别力。
- 例如,假设我们在做从各向同性的高斯分布中抽取 x ∈ R 100 \boldsymbol{x} \in \mathbb{R}^{100} x∈R100的回归任务,但是只有一个变量 x 1 x_1 x1和结果相关。
- 进一步假设该特征直接决定了输出,即在所有情况中 y = x 1 y=x_1 y=x1。
- k k k-最近邻回归不能检测到这个简单模式。大多数点 x \boldsymbol{x} x的最临近将取决于 x 2 x_2 x2到 x 100 x_{100} x100的大多数特征,而不是单独取决于特征 x 1 x_1 x1。因此小训练集上的输出将会非常随机。
- 决策树(decision tree)
-
决策树及其变种是一类将输入空间分布成不同的区域,每个区域有独立的参数的算法。如下图例:
-
说明:
- 决策树的每个节点都与输入空间的一个区域相关联,并且内部节点继续将区域分成子节点下的子区域(通常使用坐标轴拆分区域)。
- 空间由此细分成不重叠的区域,叶节点和输入区域之间形成一一对应的关系。每个叶节点将其输入区域的每个点映射到相同的输出。
- 如果允许学习任意大小的决策树,那么可以被视作非参数算法。然而实践中通常有大小限制作为正则化项将其转变成有参模型。
- 注意:由于决策树通常使用坐标轴相关的拆分,并且每个子节点关联到常数输出,因此有时解决一些对于逻辑回归很简单的问题很费力。
-
决策树工作原理:
- (上面部分)这个树中每个节点都选择将输入样本送到左子节点(0)或者右子节点(1)。
- 内部的节点用圆圈表示,叶节点用方块表示。
- 每一个节点可以用一个二值的字符串识别并对应树中的位置,这个字符串是通过给起父亲节点的字符串添加一个bit为来实现的(0表示选择左或者上,1表示选择右或者下)。
- (下面部分)这个树将空间分为区域。这个二维平面说明决策树可以分割 S e t R 2 SetR^2 SetR2。
- 平面中画了树的节点,每个内容点穿过分割线并用来给样本分类,叶节点画在样本是所属区域的中心。
- 结果是一个分块常数函数,每一个叶节点一个区域。
- 每一个叶节点需要至少一个训练样本来定义,所以决策树不可能用来学习一个拥有比训练样本数量还多的局部极大值的函数。
-
案例源码分享
下面是一个完整的监督学习案例代码,使用scikit-learn库中的鸢尾花(Iris)数据集进行分类任务。我们将使用逻辑回归(Logistic Regression)作为分类器。
首先,导入了必要的库,然后加载了鸢尾花数据集。数据集包含了150个样本,每个样本有四个特征(花萼(sepal)长度、花萼宽度、花瓣(pedal)长度、花瓣宽度)和一个目标变量(花的种类,共有三类)。
接着,我们使用train_test_split函数将数据集划分为训练集和测试集,其中测试集占20%。
然后,我们创建了逻辑回归模型对象,并使用训练数据拟合了模型。
之后,我们使用模型对测试集进行了预测,并计算了预测的准确率。
最后,我们输出了模型的系数和截距(仅当输入特征是数值型时)。这些系数和截距表示了模型学习到的特征与目标变量之间的关系。
请注意,由于鸢尾花数据集的特征已经是数值型的,因此我们可以直接将其用于逻辑回归模型。如果特征是非数值型的(例如文本或类别型数据),则需要进行适当的预处理(如编码)才能用于模型训练。
# coding: utf-8
# 导入所需的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建逻辑回归模型
model = LogisticRegression(max_iter=1000)
# 使用训练数据拟合模型
model.fit(X_train, y_train)
# 使用模型对测试集进行预测
y_pred = model.predict(X_test)
# 计算预测准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')
# 如果需要,可以输出模型系数(仅当输入特征是数值型时)
print(f'Model coefficients: {model.coef_}')
print(f'Model intercept: {model.intercept_}')
总结
监督学习是机器学习的重要分支,它基于已知标签的数据集训练模型,使模型能预测新数据的输出。其核心在于通过输入-输出对的关系,训练模型学习映射规则。监督学习广泛应用于图像识别、自然语言处理等领域,并具备多种算法如决策树、支持向量机等。其性能依赖于数据质量和模型选择,面临数据收集和模型过拟合等挑战。随着技术发展,监督学习将在更多领域发挥重要作用。