Logistic regression是非常基础、传统和使用广泛的二分类方法。算法本身的优势略去不表,本文受Andrew NG的启发,旨在NN mindset的指导下,用梯度下降法实现逻辑回归求解。
1. 先来回顾下logistic regression的公式:
2.1 对单个样本(i),用loss function度量预测值(Yhat) 与真实值(y)的偏差
2.2 对整体,用平均的loss function代表该数据集的cost function
3.损失函数最小,求回归系数w。这步也就是J(w,b)对w求导,令导数为,求w。此时,据说无法求解析解(各位大神可以自行尝试并好心告知~),迭代法就出场了。
第3步常见的方法有:
1.梯度下降(以及优化的随机梯度下降和mini batch梯度下降,这个以后另写一篇说明)
2.牛顿迭代
3.拟牛顿迭代算法(BFGS算法和L-BFGS算法)
为什么说是NN mindset的梯度下降法呢,看下图:
forward计算,backward导数求解,再迭代更新,此为精华
梯度求解的伪代码如下:
初始化回归系数
重复以下步骤直至停止条件{
算 dw, db
用 alpha和gradient更新回归系数w,b
}
此处是最简单的梯度下降,需要遍历整个数据集,更新一轮w,b,当样本量和特征数很大时,这无疑是费时的。
随机梯度下降(stochastic gradient descent)对此进行了优化,用一个样本点来更新一轮w,b,但是会出现 cost function忽大忽小的随机情况。再改进,就比如mini batch,用一小批样本更新一轮,比随机更稳健一些。
这里还涉及到一个迭代停止条件,可以从几方面考虑,如cost function降低幅度,迭代次数。当然,alpha的大小也决定了损失函数降低的幅度。
另外一点需要注意的是,用alpha * dw更新每个w时,对不同量纲的x采用相同的alpha,可能会造成收敛速度较慢或cost function无法达到全局最优。
以下就是具体的python实现~
本文用python自带的iris数据集测试
参数初始化,同时保留几个列表,存储每次迭代的结果
主程序开始啦!
6万多次停止了。效果如下:
本着严谨审慎的态度,用python自带的包算了下逻辑回归参数,如下:
这里python包用的是statsmodels.api里的GLM(families.Binomial),跟梯度方法相差不多(这里alpha和迭代次数还是调了会儿的,可以试试标准化x有什么差别)。
另,如果用LogisticModel包,因为自带正则项惩罚,参数结果会不太一样。
这是后话。回看这个梯度迭代法实现起来并不难,但一开始说要写,宝宝内心是抗拒的啊泥胃,这句话送给自己:everything will be fine 加油!

领取专属 10元无门槛券
私享最新 技术干货