
本文共 6904 字,大约阅读时间需要 23 分钟。
目录
线性回归
提到逻辑回归我们不得不提一下线性回归,逻辑回归和线性回归同属于广义线性模型,逻辑回归就是用线性回归模型的预测值去拟合真实标签的的对数几率(一个事件的几率(odds)是指该事件发生的概率与不发生的概率之比,如果该事件发生的概率是 P P P,那么该事件的几率是 P 1 − P \frac{P}{1-P} 1−PP,对数几率就是 l o g P 1 − P log\frac{P}{1-P} log1−PP)。
逻辑回归和线性回归本质上都是得到一条直线,不同的是,线性回归的直线是尽可能去拟合输入变量X的分布,使得训练集中所有样本点到直线的距离最短;而逻辑回归的直线是尽可能去拟合决策边界,使得训练集样本中的样本点尽可能分开。因此,两者的目的是不同的。 线性回归方程: y = w x + b y=wx+b y=wx+b 此处,y为因变量,x为自变量。在机器学习中y是标签,x是特征。Sigmoid函数
我们想要的函数应该是,能接受所有的输入然后预测出类别。例如在二分类的情况下,函数能输出0或1。那拥有这 类性质的函数称为海维赛德阶跃函数(Heaviside step function),又称之为单位阶跃函数(如下图所示)。


逻辑回归
通过将线性模型和Sigmoid函数结合,我们可以得到逻辑回归的公式:
y = 1 1 + e − ( ω x + b ) y=\frac{1}{1+e^{-(\omega x+b)}} y=1+e−(ωx+b)1 这样一来,y的取值范围就是(0,1)。 对于二项回归:

逻辑回归的损失函数
LR损失函数为:






正则化
不过当损失过于小的时候,也就是模型能够拟合绝大部分的数据,这时候就容易出现过拟合。为了防止过拟合,我们会引入正则化。
L1正则化
Lasso 回归,相当于为模型添加了这样一个先验知识: ω \omega ω服从零均值拉普拉斯分布。
拉普拉斯分布:


L2正则化
Ridge 回归,相当于为模型添加了这样一个先验知识: ω \omega ω服从零均值正态分布。
正态分布公式:


L1正则化和L2正则化的区别
- 两者引入的关于模型参数的先验知识不一样,L1是拉普拉斯分布,L2是正态分布。
- L1偏向于使模型参数变得稀疏(但实际上并不那么容易),L2偏向于使模型每一个参数都很小,但是更加稠密,从而防止过拟合。
为什么L1偏向于稀疏,L2偏向于稠密呢? 看下面两张图,每一个圆表示loss的等高线,即在该圆上loss都是相同的,可以看到L1更容易在坐标轴上达到,而L2则容易在象限里达到。

梯度下降法
梯度下降法的代数方式描述
先决条件
确认优化模型的假设函数和损失函数。 比如对于线性回归,假设函数表示为 h θ ( x 1 , x 2 , … … , x n ) = θ 0 + θ 1 x 1 + … … + θ n x n h_{\theta}(x_1,x_2,……,x_n)=\theta_0+\theta_1x_1+……+\theta_nx_n hθ(x1,x2,……,xn)=θ0+θ1x1+……+θnxn,其中 θ i ( i = 0 , 1 , … … , n ) \theta_i \ (i=0,1,……,n) θi (i=0,1,……,n)为模型参数, x i ( i = 0 , 1 , … … , n ) x_i \ (i=0,1,……,n) xi (i=0,1,……,n)为每个样本的n个特征值。这个表达式可以简化,我们增加一个特征 x 0 = 1 x_0=1 x0=1,这样 h θ ( x 1 , x 2 , … … , x n ) = ∑ i = 0 n θ i x i h_{\theta}(x_1,x_2,……,x_n)=\sum_{i=0}^{n}\theta_ix_i hθ(x1,x2,……,xn)=∑i=0nθixi。 同样是线性回归,对应于上面的假设函数,损失函数为(此处在损失函数之前加上 1 2 m \frac{1}{2m} 2m1,主要是为了修正损失函数让计算公式结果更加美观):

算法相关参数初始化
主要是初始化 θ i ( i = 0 , 1 , … … , n ) \theta_i \ (i=0,1,……,n) θi (i=0,1,……,n),算法终止距离 ϵ \epsilon ϵ以及步长 α \alpha α。在没有任何先验知识的时候, 我们比较倾向于将所有的 θ \theta θ初始化为0,将步长初始化为1。在调优的时候再进行优化。
算法过程
(1).确定当前位置的损失函数的梯度,对于 θ i \theta_i θi,其梯度表达式如下:







梯度下降法的矩阵方式描述
先决条件
需要确认优化模型的假设函数和损失函数。对于线性回归,假设函数 h θ ( x 1 , x 2 , … … , x n ) = θ 0 + θ 1 x 1 + … … + θ n x n h_{\theta}(x_1,x_2,……,x_n)=\theta_0+\theta_1x_1+……+\theta_nx_n hθ(x1,x2,……,xn)=θ0+θ1x1+……+θnxn的矩阵表达方式为:


算法相关参数初始化
在没有任何先验知识的时候, 我们比较倾向于将所有的 θ \theta θ初始化为0,将步长初始化为1。在调优的时候再进行优化。
算法过程
(1).确定当前位置的损失函数的梯度,对于 θ \theta θ向量,其梯度表达式如下:





梯度下降法分类
批量梯度下降法BGD
批量梯度下降法(Batch Gradient Descent,BGD)是梯度下降法常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新。

随机梯度下降法SGD
随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:

小批量梯度下降法MBGD
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个子样本来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是:

总结
BGD会获得全局优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新都会很慢。
SGD以高方差频繁更新,优点是使得SGD会跳到新的和潜在更好的局部优解,缺点是使得收敛到局部优解的过程更加的复杂。 MBGD降结合了BGD和SGD的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中可以采用这种方法,将数据一个batch一个batch的送进去训练。梯度下降的算法调优
- 算法的步长选择。步长的选择实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了,步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较优的值。
- 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值; 当然如果损失函数是凸函数则一定是优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,选择损失函数小化的初值。
- 标准化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据标准化,也就是对于每个特征x,求出它的期望和标准差,然后转化为:
这样一来,特征的新期望为0,新方差为1,收敛速度可以大大加快。
python中实现逻辑回归
from sklearn.linear_model import LogisticRegression as LRfrom sklearn.datasets import load_breast_cancerimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score#精确性分数 data = load_breast_cancer()#乳腺癌数据集X = data.datay = data.target X.data.shape#(569, 30) lrl1 = LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000) lrl2 = LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000) #逻辑回归的重要属性coef_,查看每个特征所对应的参数(theta)lrl1 = lrl1.fit(X,y)lrl1.coef_ (lrl1.coef_ != 0).sum(axis=1)#array([10]) 30个特征中有10个特征的系数不为0 lrl2 = lrl2.fit(X,y)lrl2.coef_
那么,L1和L2正则化哪个更好呢?
l1 = []l2 = []l1test = []l2test = [] Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420) for i in np.linspace(0.05,1.5,19): lrl1 = LR(penalty="l1",solver="liblinear",C=i,max_iter=1000) lrl2 = LR(penalty="l2",solver="liblinear",C=i,max_iter=1000) lrl1 = lrl1.fit(Xtrain,Ytrain) l1.append(accuracy_score(lrl1.predict(Xtrain),Ytrain)) l1test.append(accuracy_score(lrl1.predict(Xtest),Ytest)) lrl2 = lrl2.fit(Xtrain,Ytrain) l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain)) l2test.append(accuracy_score(lrl2.predict(Xtest),Ytest))graph = [l1,l2,l1test,l2test]color = ["green","black","lightgreen","gray"]label = ["L1","L2","L1test","L2test"] plt.figure(figsize=(6,6))for i in range(len(graph)): plt.plot(np.linspace(0.05,1.5,19),graph[i],color[i],label=label[i])plt.legend(loc=4) #图例的位置在哪里?----4表示,在右下角plt.show()
发表评论
最新留言
关于作者
