Python手撸逻辑回归(logistic regression)

与线性回归用于预测连续值不同,逻辑归回用于分类,原理与线性回归类似,定义损失函数,然后最小化损失,得到参数既模型,只不过损失的定义不同。

逻辑回归的假设如图1所示,可以理解为线性回归外面套了一层sigmoid函数g(z),sigmoid函数图像如图2所示,该函数有很好的数学性质,其导数= g(z)*(1- g(z)),导数计算量小,当z=0时,其函数值为0.5,z越大,函数值越接近于1,z越小,函数值越接近于0。

Python手撸逻辑回归(logistic regression)_第1张图片

图1 逻辑回归假设

Python手撸逻辑回归(logistic regression)_第2张图片

图 2 sigmoid函数图像

Logistic regression的损失函数定义如图3所示,采用交叉熵损失函数,如何理解交叉熵损失函数在之前的博文人工神经网络中有提到,如果仍使用线性回归时的损失函数,其函数图像如图5所示,是一个非凸函数,如果使用梯度下降的话可能会陷入局部最优。

Python手撸逻辑回归(logistic regression)_第3张图片

图3 损失函数定义

Python手撸逻辑回归(logistic regression)_第4张图片

图4 损失函数求梯度

Python手撸逻辑回归(logistic regression)_第5张图片

图5 非凸损失函数

         我们要做的就是最小化损失函数J,得到theta,J是个凸函数,常采用梯度下降的方式,求梯度的公式如图4所示。为了防止过拟合,需要加正则化项,图5和图6分别是带L2正则化的损失函数和梯度。

Python手撸逻辑回归(logistic regression)_第6张图片

图6 带正则项的损失函数

Python手撸逻辑回归(logistic regression)_第7张图片

图7 带正则项的损失函数求梯度

具体代码如下所示,In[27]画出了的决策边界,其中蓝色是使用scipy的minimize函数求得的参数,红色是使用自己写的批量梯度下降得到的参数。关于minimize函数的参数请参考官方文档https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html

Python手撸逻辑回归(logistic regression)_第8张图片

Python手撸逻辑回归(logistic regression)_第9张图片Python手撸逻辑回归(logistic regression)_第10张图片

Python手撸逻辑回归(logistic regression)_第11张图片

下边来看一下正则化对模型效果的影响,从最后的对比图可以看出,如果不加正则化会出现过拟合,如果正则化系数太大,会欠拟合。

Python手撸逻辑回归(logistic regression)_第12张图片

Python手撸逻辑回归(logistic regression)_第13张图片



你可能感兴趣的:(机器学习,python)