机器学习之监督学习(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

1.监督学习定义

监督学习(supervised learning)是一种机器学习方法,在这种方法中,算法通过训练集中的输入数据(特征)和相应的输出标签(目标)来学习映射关系,从而能够对未见过的数据进行预测或分类。


2.监督学习分类

2.1回归 regression

回归的目标是根据输入数据预测连续的数值输出,输出标签是连续的实数,例如预测房价。

2.2 分类 classification

分类的目标是根据输入数据将样本分配到不同类别中,输出标签是离散的如有限的类别。例如垃圾邮件过滤。


3.线性回归 linear regression

3.1 单特征线性回归

案例:根据房子尺寸预测房价

符号定义
x:输入向量
y:输出/目标向量
m:训练数据量
(x,y): 训练集中的一个数据
(x(i),y(i)):训练集中第i个数据

线性回归模型
y ^ = f w , b ( x ) = w x + b \hat{y}=f_{w,b}(x) =wx+b y^=fw,b(x)=wx+b

代价函数 cost function
平均平方误差函数 squared error function
J ( w , b ) = 1 2 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(w,b)=\frac{1}{2m}\sum_{i=1}^{m}(\hat{y}^{(i)}-y^{(i)})^2 J(w,b)=2m1i=1m(y^(i)y(i))2
说明:
1、额外乘 1 2 \frac{1}{2} 21是为了便于后续求导
2、代价函数J是关于线性系数w和b的函数

训练目标:最小化代价J

训练思路:梯度下降 gradient descent


补充一:梯度下降

何为梯度下降?
先看看单变量梯度下降
一元函数中可以认为梯度即是导数,从下图中可以看出,我们从任意点出发,当该点导数大于0时,往左移动靠近极小值点,当该点导数小于0时,往右移动靠近极小值点。因此给出一种收敛到极小值点的方法: w − w − α ∂ J ( w ) ∂ w w-w-\alpha\frac{\partial{J(w)}}{\partial{w}} wwαwJ(w),其中 α \alpha α是学习率,用来控制每一次移动步距。当学习率太小时,收敛缓慢,当学习率太大时,由于步距大,可能造成远离极值点而无法收敛,故应该选择合适的学习率进行训练。进行足够多次梯度下降后,w近似取到极小值点。
在这里插入图片描述
再来看多变量梯度下降,这里以方便可视化的二元函数梯度下降为例,学过高数的我们知道梯度的定义为:
∇ f = [ f x , f y ] T \nabla{f}=[f_x,f_y]^T f=[fx,fy]T
即由两个偏导构成的梯度向量,当方向导数和梯度方向一致时,方向导数最大,方向相反时,方向导数最小。因此想要最快下降到山谷位置,应沿着梯度反方向走,用数学表述为(假设两个变量是w和b)
[ w , b ] T = [ w , b ] T − α ∇ f [w,b]^T=[w,b]^T-\alpha\nabla{f} [w,b]T=[w,b]Tαf
w = w − α ∂ J ∂ w , b = b − α ∂ J ∂ w w=w-\alpha\frac{\partial{J}}{\partial{w}},b=b-\alpha\frac{\partial{J}}{\partial{w}} w=wαwJ,b=bαwJ
在这里插入图片描述
对于多元函数,梯度下降表达式即
[ x 1 , x 2 . . . , x n ] T = [ x 1 , x 2 . . . , x n ] T − α [ ∂ J ∂ x 1 , ∂ J ∂ x 2 , . . . , ∂ J ∂ x n ] T [x_1,x_2...,x_n]^T=[x_1,x_2...,x_n]^T-\alpha[\frac{\partial{J}}{\partial{x_1}},\frac{\partial{J}}{\partial{x_2}},...,\frac{\partial{J}}{\partial{x_n}}]^T [x1,x2...,xn]T=[x1,x2...,xn]Tα[x1J,x2J,...,xnJ]T
梯度下降算法的起始点随机确定,但收敛的极值点不一定是全局极值点,有可能陷入局部极值点,一种解决的思路是多次随机生成起点进行多次梯度下降,比较每次极值进行比较获取全局极值。


对于上面线性回归模型中提到的成本函数,其3D图像是凹函数,即只有一个极值点,因此不必考虑陷入局部极值的问题。

求偏导过程如下,注意求导和求和可以互换,即先导再求和:

∂ ∂ w J ( w , b ) = ∂ ∂ w 1 2 m ∑ i = 1 m ( w x ( i ) + b − y ( i ) ) 2 = 1 2 m ∑ i = 1 m 2 ( w x ( i ) + b − y ( i ) ) x ( i ) = 1 m ∑ i = 1 m x ( i ) ( w x ( i ) + b − y ( i ) ) \frac{\partial}{\partial{w}}J(w,b)=\frac{\partial}{\partial{w}}\frac{1}{2m}\sum_{i=1}^{m}(wx^{(i)}+b-y^{(i)})^2\\=\frac{1}{2m}\sum_{i=1}^{m}2(wx^{(i)}+b-y^{(i)})x^{(i)}=\frac{1}{m}\sum_{i=1}^{m}x^{(i)}(wx^{(i)}+b-y^{(i)}) wJ(w,b)=w2m1i=1m(wx(i)+by(i))2=2m1i=1m2(wx(i)+by(i))x(i)=m1i=1mx(i)(wx(i)+by(i))
∂ ∂ b J ( w , b ) = ∂ ∂ b 1 2 m ∑ i = 1 m ( w x ( i ) + b − y ( i ) ) 2 = 1 2 m ∑ i = 1 m 2 ( w x ( i ) + b − y ( i ) ) = 1 m ∑ i = 1 m ( w x ( i ) + b − y ( i ) ) \frac{\partial}{\partial{b}}J(w,b)=\frac{\partial}{\partial{b}}\frac{1}{2m}\sum_{i=1}^{m}(wx^{(i)}+b-y^{(i)})^2\\=\frac{1}{2m}\sum_{i=1}^{m}2(wx^{(i)}+b-y^{(i)})=\frac{1}{m}\sum_{i=1}^{m}(wx^{(i)}+b-y^{(i)}) bJ(w,b)=b2m1i=1m(wx(i)+by(i))2=2m1i=1m2(wx(i)+by(i))=m1i=1m(wx(i)+by(i))

关于学习率的选择

梯度下降算法是否有效与学习率的选择密切相关
如果学习率太小,梯度下降速率太慢
如果学习率太大,可能无法收敛(发散)/无法抵达极小值点
可以绘制学习曲线cost-iteration,发现曲线下降太慢/没达到收敛时,说明学习率太小,适当增加学习率;当曲线上升(不收敛)时,说明学习率太大,适当减小学习率
推荐的学习率尝试是…0.003、0.01、0.03、0.1…,即以3倍的公比调整
在这里插入图片描述

代码实现:
一元线性回归梯度下降代码实现

3.2 多特征线性回归

案例:
根据房子尺寸、房间数量、楼层数、年龄预测房价
在这里插入图片描述

符号定义
x j 表示第 j 个特征, x ⃗ ( i ) 表示第 i 个数据, n 表示特征数量, m 表示数据量 , , x ⃗ j ( i ) 表示第 i 个数据第 j 个特征 x_j表示第j个特征,\vec{x}^{(i)}表示第i个数据,n表示特征数量,m表示数据量,,\vec{x}^{(i)}_j表示第i个数据第j个特征 xj表示第j个特征,x (i)表示第i个数据,n表示特征数量,m表示数据量,x j(i)表示第i个数据第j个特征

多元线性回归模型
w = [ w 1 , w 2 , . . . , w n ]     y ^ ( i ) = f w ⃗ , b ( x ⃗ ) = w ⃗ ⋅ x ⃗ + b w=[w_1,w_2,...,w_n]~~~\\ \hat{y}^{(i)}=f_{\vec{w},b}(\vec{x})=\vec{w}\cdot\vec{x}+b w=[w1,w2,...,wn]   y^(i)=fw ,b(x )=w x +b

代价函数 cost function
平均平方误差函数 squared error function
J ( w , b ) = 1 2 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(w,b)=\frac{1}{2m}\sum_{i=1}^{m}(\hat{y}^{(i)}-y^{(i)})^2 J(w,b)=2m1i=1m(y^(i)y(i))2

训练目标:最小化代价J

训练思路:梯度下降 gradient descent

n个特征,即参数包含n个w和1个b,共n+1个参数

先计算偏导:

∂ ∂ w j J ( w ⃗ , b ) = ∂ ∂ w j 1 2 m ∑ i = 1 m ( w ⃗ ⋅ x ⃗ ( i ) + b − y ( i ) ) 2 = 1 2 m ∑ i = 1 m 2 ( w ⃗ ⋅ x ⃗ ( i ) + b − y ( i ) ) x j ( i ) = 1 m ∑ i = 1 m x j ( i ) ( w ⃗ ⋅ x ⃗ ( i ) + b − y ( i ) ) \frac{\partial}{\partial{w_j}}J(\vec{w},b)=\frac{\partial}{\partial{w_j}}\frac{1}{2m}\sum_{i=1}^{m}(\vec{w}\cdot\vec{x}^{(i)}+b-y^{(i)})^2\\=\frac{1}{2m}\sum_{i=1}^{m}2(\vec{w}\cdot\vec{x}^{(i)}+b-y^{(i)})x_j^{(i)}=\frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}(\vec{w}\cdot\vec{x}^{(i)}+b-y^{(i)}) wjJ(w ,b)=wj2m1i=1m(w x (i)+by(i))2=2m1i=1m2(w x (i)+by(i))xj(i)=m1i=1mxj(i)(w x (i)+by(i))
∂ ∂ b J ( w ⃗ , b ) = ∂ ∂ b 1 2 m ∑ i = 1 m ( w ⃗ ⋅ x ⃗ ( i ) + b − y ( i ) ) 2 = 1 2 m ∑ i = 1 m 2 ( w ⃗ ⋅ x ⃗ ( i ) + b − y ( i ) ) = 1 m ∑ i = 1 m ( w ⃗ ⋅ x ⃗ ( i ) + b − y ( i ) ) \frac{\partial}{\partial{b}}J(\vec{w},b)=\frac{\partial}{\partial{b}}\frac{1}{2m}\sum_{i=1}^{m}(\vec{w}\cdot\vec{x}^{(i)}+b-y^{(i)})^2\\=\frac{1}{2m}\sum_{i=1}^{m}2(\vec{w}\cdot\vec{x}^{(i)}+b-y^{(i)})=\frac{1}{m}\sum_{i=1}^{m}(\vec{w}\cdot\vec{x}^{(i)}+b-y^{(i)}) bJ(w ,b)=b2m1i=1m(w x (i)+by(i))2=2m1i=1m2(w x (i)+by(i))=m1i=1m(w x (i)+by(i))

更新参数:
w j = w j − α ∂ ∂ w j J ( w ⃗ , b ) ( j = 1 、 2... 、 n ) b = b − α ∂ ∂ b J ( w ⃗ , b ) w_j=w_j-\alpha\frac{\partial}{\partial{w_j}}J(\vec{w},b)(j=1、2...、n)\\b=b-\alpha\frac{\partial}{\partial{b}}J(\vec{w},b) wj=wjαwjJ(w ,b)(j=12...n)b=bαbJ(w ,b)

代码实现:
多元线性回归梯度下降代码实现


补充二:正规方程 normal equation

优化损失函数,除了梯度下降这种不断迭代直至收敛的算法外,从数学角度上还有一种暴力解法叫正规方程。

正规方程(Normal Equation)是用于求解线性回归模型参数的一种解析方法。它通过最小化误差平方和来找到最佳参数,不需要使用迭代优化方法如梯度下降。正规方程尤其适用于小规模数据集,因为它在大规模数据集上计算成本可能较高。

首先列出需要用到的线代知识:
①y是一维向量,则
y T y = ∣ ∣ y ∣ ∣ 2 = y ⋅ y y^Ty=||y||^2=y\cdot{y} yTy=∣∣y2=yy
②转置相关公式:
( A + B ) T = A T + B T ( A B ) T = B T A T (A+B)^T=A^T+B^T\\(AB)^T=B^TA^T (A+B)T=AT+BT(AB)T=BTAT
③p,q是一维列向量,则
p ⋅ q = p T q = q T p p\cdot{q}=p^Tq=q^Tp pq=pTq=qTp
④矩阵求导公式:
∂ ( A X ) ∂ X = A T \frac{\partial (AX)}{\partial X} = A^T X(AX)=AT
∂ ( X T A X ) ∂ X = ( A + A T ) X    [ A 对称时 = 2 A X ] \frac{\partial (X^T A X)}{\partial X} = (A + A^T) X~~[A对称时=2AX] X(XTAX)=(A+AT)X  [A对称时=2AX]

假设我们有一个线性回归模型:

y = X β + ϵ y = X\beta + \epsilon y=+ϵ

其中:
y 是目标变量向量( M × 1 M \times 1 M×1
X 是特征矩阵( M × ( N + 1 ) M \times (N+1) M×(N+1)),第一列通常为1,对应于截距项
β 是待估参数向量( ( N + 1 ) × 1 (N+1) \times 1 (N+1)×1
ϵ 是误差项向量( M × 1 M \times 1 M×1

则代价函数表示为
J ( β ) = ∣ ∣ y − X β ∣ ∣ 2 = ( y − X β ) T ( y − X β ) = ( y T − β T X T ) ( y − X β ) = y T y − y T X β − β T X T y + β T X T X β = y T y − 2 y T X β + β T X T X β J(\beta)=||y-X\beta||^2=(y-X\beta)^T(y-X\beta)=(y^T-\beta^TX^T)(y-X\beta)\\=y^Ty-y^TX\beta-\beta^TX^Ty+\beta^TX^TX\beta=y^Ty-2y^TX\beta+\beta^TX^TX\beta J(β)=∣∣y2=(y)T(y)=(yTβTXT)(y)=yTyyTβTXTy+βTXT=yTy2yT+βTXT
求导,令导数为0
∂ J ( β ) ∂ β = − 2 X T y + 2 X T X β = 0 → β = ( X T X ) − 1 X T y \frac{∂J(β)}{∂\beta}=-2X^Ty+2X^TX\beta=0\rightarrow\beta=(X^TX)^{-1}X^Ty βJ(β)=2XTy+2XT=0β=(XTX)1XTy

从最优参数向量的表达式可以看出,但矩阵规模较大时,计算成本很大,因此我们通常会在面对大规模数据集时选择梯度下降算法进行训练。

除此之外,我们还可以顺便证明一下平均平方损失函数是凸函数,如何判定凸函数,一般采用黑塞矩阵,是由目标函数在点X处的二阶偏导数组成的对称矩阵是否是半正定的,对J求二阶导:
J ′ ′ ( β ) = 2 X T X J^{''}(\beta)=2X^TX J′′(β)=2XTX
由于XTX为半正定矩阵,因此代价函数J的确是凸函数,计算出的极值即全局最值。

除此之外,正规方程法一个缺点是只适用于线性回归问题,而梯度下降在后续的逻辑回归、神经网络中都是我们优化算法的核心。


补充三: 梯度下降分类

根据不同的损失函数和迭代方式,梯度下降可以被分为批量梯度下降(Batch Gradient Descent,BGD)、随机梯度下降(Stochastic Gradient Descent,SGD)、小批量梯度下降(Mini-batch Gradient Descent)等。

1、批量梯度下降(Batch Gradient Descent,BGD)
前面所讲的批量梯度下降(Batch Gradient Descent,BGD)通过在每一次迭代中计算所有训练样本的梯度来更新模型参数。

优点:
稳定收敛,由于每次更新都使用整个训练数据集,梯度计算精确,更新方向稳定

缺点:
①需要处理所有训练样本,计算量较大,因此不适合处理大规模数据集。
②对于比较稀疏的数据集,BGD 的计算效率较低,因为大部分数据都是无关的。
③由于每次迭代都需要处理整个数据集,因此在处理在线学习或实时学习等实时数据流问题时,BGD 的计算效率也较低。

2 、随机梯度下降(Stochastic Gradient Descent,SGD)
随机梯度下降(Stochastic Gradient Descent,SGD是一种常用的梯度下降算法,它通过在每一次迭代中计算一个训练样本的梯度来更新模型参数。

优点:
①计算效率高,每次迭代只计算一个样本的梯度,计算开销小,适合大规模数据集。
②能逃离局部最优,由于更新过程的随机性,SGD 更容易跳出局部最优。

缺点:
①收敛不稳定,由于每次更新使用的样本不同,梯度方向多变,可能导致损失值在收敛过程中不断波动
②可能无法保证收敛到全局最优解,因为更新方向是随机的。

3、批量梯度下降(Mini-batch Gradient Descent, MGD)
小批量梯度下降(Mini-batch Gradient Descent,MBGD)是一种介于批量梯度下降(Batch Gradient Descent,BGD)和随机梯度下降(Stochastic Gradient Descent,SGD)之间的梯度下降算法,它通过在每一次迭代中计算一小部分训练样本的梯度来更新模型参数。

优点:
结合了批量梯度下降和随机梯度下降的优点,每次更新使用一个小批量的数据,计算效率和收敛稳定性之间取得了平衡

实际应用中的常见选择(来自chatgpt)
深度学习:在深度学习中,越来越多的情况下选择小批量梯度下降(MGD),结合自适应学习率方法如 Adam、RMSProp 等。这是因为深度学习模型通常需要大规模数据,MGD 能够有效利用计算资源,且自适应学习率方法能够自动调整学习率,提高收敛速度和稳定性。

传统机器学习:在一些传统的机器学习任务中,如线性回归、逻辑回归等,如果数据集规模较小,批量梯度下降(BGD)仍然是一个常见选择。如果数据规模中等或较大,随机梯度下降(SGD)和小批量梯度下降(MGD)也广泛应用。

3.3 特征缩放 feature scaling

特征缩放(Feature Scaling)是数据预处理中的一个重要步骤,它涉及到调整不同特征值的尺度,使它们处于相同的量级。这样做的目的是帮助优化算法(比如梯度下降)更快、更有效地收敛。

当特征的尺度(范围)相差很大时,损失函数的等高线图(在参数空间中)将变得非常扁平和延伸。这意味着在某些方向上,损失函数的变化会非常缓慢,而在其他方向上,它可能变化得非常快。在这种情况下,梯度下降算法在尝试找到最小值的过程中,会在较扁平的方向上迈出很小的步伐,而在陡峭的方向上迈出较大的步伐。这会导致算法在参数空间中走“之字形”路径,从而减慢收敛速度。

通过特征缩放,我们可以将所有特征的范围调整到相似的尺度上。这样做的直接结果是,损失函数的等高线将变得更加接近圆形,而不是延伸的椭圆形。这意味着无论梯度下降在哪个方向上进行,步伐的大小都将更加一致,减少了在参数空间中走“之字形”路径的需要。因此,梯度下降能够更直接、更有效地朝着最小值方向前进,从而加快了收敛速度。

常见的特征缩放有:

1、Z-score 标准化 Z-score normalization
x ′ = x − μ σ x^{'}=\frac{x-\mu}{\sigma} x=σxμ
如果特征满足正态分布,则Z-标准化将其线性变换为均值为0,标准差为1的标准正态分布

特点:
1、对有异常值的数据有较强的鲁棒性(数据分析前应该先清洗异常数据)
2、对大多数机器学习算法效果好
3、对于非正态分布的数据,效果可能不明显

2、Min-Max 标准化 Min-Max normalization
x ′ = x − x m i n x m a x − x m i n x^{'}=\frac{x-x_{min}}{x_{max}-x_{min}} x=xmaxxminxxmin

将数据映射到[0,1]区间内,缺点是对对于存在异常值的数据不鲁棒,异常值会显著影响缩放效果

3、最大绝对值缩放 MaxAbs scaling
x ′ = x m a x ( a b s ( x ) ) x^{'}=\frac{x}{max(abs(x))} x=max(abs(x))x

将数据映射到[-1,1]区间内,特点是能保持稀疏数据的稀疏性,对于稀疏数据(如文本数据)非常有效

以上特征缩放的代码实现较为简单,读者不妨自己练手实现。

补充四: 引入scikit-learn

scikit-learn 是一个用于机器学习的开源库,基于Python编写,提供了一系列简单且高效的工具进行数据挖掘和数据分析。它建立在NumPy、SciPy和matplotlib等基础科学计算库之上,是Python生态系统中机器学习和数据科学领域的重要工具之一。

数据预处理
下面引入scikit-learn库谈谈如何利用其中的预处理模块快速实现特征缩放。

模块:sklearn.preprocessing(预处理模块)
StandardScaler->Z-score normalization
MinMaxScaler->Min-Max normalization
MaxAbsScaler->MaxAbs scaling

import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler

# 创建示例数据
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 初始化StandardScaler(以Z-score 标准化为例)
scaler = StandardScaler()

# 使用fit_transform方法转化数据
scaled_data = scaler.fit_transform(data)

print("原始数据:")
print(data)
print("标准化后的数据:")
print(scaled_data)

线性回归
sklearn中的linear_model模块用于实现线性回归
LinearRegression:使用normal equation求解最优参数
SGDRegressor:采用随机梯度下降算法(没有现成的批量梯度下降和小批量梯度下降工具,前者可以通过手动编写代码实现,后者可以利用tensorflow中的神经网络框架辅助实现[后续讨论])

from sklearn.linear_model import LinearRegression, SGDRegressor

'''
max_iter=1000:最大迭代次数
eta0=0.01:初始学习率
learning_rate=‘invscaling’:学习率调度策略(详见下方)
penalty='l2':正则化类型
alpha:正则化系数[正则化内容详见正则化部分]
'''
#创建随机梯度下降线性回归器
gdr = SGDRegressor(max_iter=1000,learning_rate=‘adaptive’)
#使用fit方法,匹配数据集进行训练
sgdr.fit(X_norm, y_train)
#训练后查看相关属性
sgdr.n_iter_#实际迭代次数
sgdr.intercept_#回归b值->list
sgdr.coef_#回归w值->list
sgdr.predict(X_new)#模型预测
R2_score=sgdr.score(X_test,y_test)#评估模型性能,返回R^2 score

补充参数解释:
learning_rate string类型,默认’invscaling’
选项:
①’constant’,学习率不变,eta=eta0
②’optimal’: η t = 1 α t η_t=\frac{1}{\alpha{t}} ηt=αt1,使用 Léon Bottou 提出的理论学习率,通常能够更好地适应不同的数据规模和特性。
③’invascaling’: η t = e t a 0 t p o w e r t η_t=\frac{eta0}{t^{power_{t}}} ηt=tpowerteta0,其中power_t(默认0.25)是另一个函数参数。使用反向比例缩放学习率,学习率随迭代次数增加而逐渐减小。
​④‘adaptive’:自适应学习率策略,当迭代过程中的损失停止改善时,学习率会动态调整。

4.多项式回归 polynomial regression

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值