一句话:逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。




SKlearn回归 sklearn回归方法输出损失_数据


假设的伯努利分布的形式

我们需要知道,有监督模型从整体上可以分为判别式模型和生成式模型,而判别式模型又可以分为概率判别式模型和常规的判别式模型,前者以逻辑回归为典型,后者则常见的决策树系列均是这个类型,概率判别式模型假设了输入x和输出y之间的条件概率分布P(y|X)满足某个给定分布,例如逻辑回归假设伯努利分布,然后用极大似然的方法求解这个分布的参数。而决策树则是直接针对f(X)=y进行建模,从而直接得到输入与输出的映射关系。


SKlearn回归 sklearn回归方法输出损失_SKlearn回归_02


我们这里设置:


SKlearn回归 sklearn回归方法输出损失_SKlearn回归_03


则根据极大似然法,我们可以得到:


SKlearn回归 sklearn回归方法输出损失_权重_04


这里需要注意的是,上面这个式子是取负数之后的结果。因为极大似然本来是通过梯度上升法来求解的,不过考虑到日常中还是梯度下降更常见也更符合思维习惯,所以取反将求极大的问题转化为求最小的问题

关于逻辑回归这个损失函数前面的1/m这个参数,主要是因为除以样本个数之后可以使得损失函数大小与样本数量的大小无关

考虑到sympy的局限性,这里仅针对单个样本来计算梯度更新公式:


SKlearn回归 sklearn回归方法输出损失_权重_05


下面是使用sympy来推导一下:


import


这样我们关于参数theta就可以得到:


SKlearn回归 sklearn回归方法输出损失_SKlearn回归_06


因为yi不是0就是1,所以带入上式再转化一下就可以得到:

!!!!! 这个地方截图错误,实际上前面还有一个乘项Xi,整体的公式应该是Xi*(h_theta(Xi)-yi)实际上应该是这个:


SKlearn回归 sklearn回归方法输出损失_SKlearn回归_07

下面的这个公式不完整,实际上是上面的这个。。。。

SKlearn回归 sklearn回归方法输出损失_权重_08


即为单个样本的梯度更新量,

所以这里梯度更新量就一目了然了:

就是样本Xi和权重W相乘之后进入sigmoid函数得到一个0~1之间的输出,然后和样本Xi的真实标签yi相减,最后还要再乘上Xi,这样,就完成了单个样本的完整的梯度更新量的计算

接下来直接上代码——from《机器学习实战》:


import


关于逻辑回归的初始化问题具体可见,从公式上可以看出逻辑回归对于初始化的方法的类型并不敏感,权重总能得到更新,只要输入x是变化的话就行:

Michelle Yang:谈谈神经网络权重为什么不能初始化为0zhuanlan.zhihu.com


从源代码实现上看代价敏感学习与重复采样:

如果我们要对正负样本进行加权那么也很简单:


SKlearn回归 sklearn回归方法输出损失_权重_09


例如我们要对标签为1的类别赋权,那么只要在这个公式中当yi=1的时候,即样本属于类别1的时候


SKlearn回归 sklearn回归方法输出损失_初始化_10


这个单样本的单个损失函数表达式前面乘上一个权重系数就可以了,那么梯度更新量前面也相应的会出现这个系数,因为权重系数theta是一个常数,大小不受求导影响

我们首先从sgd的角度考虑,sgd是单个样本直接影响权重系数theta:


SKlearn回归 sklearn回归方法输出损失_SKlearn回归_07


每一次逻辑回归的参数都是直接变动 learning_rate*上面这个式子,那么我们可以看到代价敏感使用的权重的引入使得 加权的样本给逻辑回归的参数 变动更加剧烈,幅度更大,权重系数也更不容易收敛,从而达到对少类样本赋权的作用。而bgd和mini-batchc实际上也是类似的只不过没有sgb理解这么直观而已.

从公式角度看常规的balanceweight或者sample_weight 和 重复采样的关系:

我们从公式上也可以看出,实际上代价敏感函数在逻辑回归的损失函数上所带来的效果和重复采样的效果是一样的,例如我们对样本A赋予2的权重,实际上就相当于向原始数据中加入了一个新的样本A,这样在公式上的表示实际上是一致的。 所以我们常用的代价敏感其本质也是类似在重复采样,或者说重复采样本质上也就是代价敏感,因此使用代价敏感看起来没有改变数据的分布实际上是等同于间接改变了数据的分布使得训练之后的模型变得有偏。

逻辑回归的收敛问题:

tol : float
Stopping criterion. For the newton-cg and lbfgs solvers, the iteration
will stop when ``max{|g_i | i = 1, ..., n} <= tol``
where ``g_i`` is the i-th component of the gradient.

这是sklearn的源代码的注释,意思就是说,当某一轮,所有参数的梯度更新量中最大的梯度更新量都小于给定的阈值的时候,则认为模型已经收敛,此时模型训练自动停止。

另外如果 模型的收敛次数达到了max_iter的时候也会自动停止。

当正负样本相差悬殊的时候,模型的参数在大部分时候是收到来自于负样本的梯度贡献从而进行更新的,而正样本的贡献比较低,


SKlearn回归 sklearn回归方法输出损失_SKlearn回归_07


我们可以看到,当逻辑回归的参数进行更新的时候,使用bgd 的方法是根据所有样本的损失来一起更新的,当然mini-batch和sgb也是一样的,这里仔细体会体会。