1、原理
既然逻辑回归模型是分类模型,为什么名字里会含有“回归”二字呢?这是因为其算法原理同样涉及线性回归模型中的线性回归方程。
上面这个方程是用于预测连续变量的,其取值范围为(-∞,+∞),而逻辑回归模型是用于预测类别的,例如,用逻辑回归模型预测某物品是属于A类还是B类,在本质上预测的是该物品属于A类或B类的概率,而概率的取值范围是0~1,因此不能直接用线性回归方程来预测概率,那么如何把一个取值范围是(-∞,+∞)的回归方程变为取值范围是(0,1)的内容呢?
这就需要用到下图所示的Sigmoid函数,它可将取值范围为(-∞,+∞)的数转换到(0,1)之间。例如,假设y=3,通过Sigmoid函数转换后,f(y)=1/(1+e-3)=0.95,就可以作为一个概率值使用了。
如果对Sigmoid函数还是感到有点困惑,可以参考如下图所示的推导过程。其中y就是之前提到的线性回归方程,其取值范围是(-∞,+∞),那么指数函数ey的取值范围便是(0,+∞),再做一次变换,[插图]的取值范围就变成(0,1),然后分子和分母同除以ey,就得到了Sigmoid函数。
总结来说,逻辑回归模型本质就是将线性回归模型通过Sigmoid函数进行了一个非线性转换,得到一个介于0~1之间的概率值,对于二分类问题(分类0和1)而言,其预测分类为1(或者说二分类中数值较大的分类)的概率可以用如下所示的公式计算。
逻辑回归模型的本质就是预测属于各个分类的概率,有了概率之后,就可以进行分类了。对于二分类问题来说,例如在预测客户是否会违约的模型中,如果预测违约的概率P为70%,则不违约的概率为30%,违约概率大于不违约概率,此时就可以认为该客户会违约。对于多分类问题来说,逻辑回归模型会预测属于各个分类的概率(各个概率之和为1),然后根据哪个概率最大,判定属于哪个分类。
2、代码实现
数据见下表。特征变量有2个——X1和X2;Y是目标变量,取值为0或1,代表2个不同的分类。以客户违约预测模型为例,可以把特征变量X1看成收入,X2看成历史违约次数,目标变量Y看成是否违约(0表示不违约,1表示违约)。
先构造数据,代码如下。
x = [[1,0],[5,1],[6,4],[4,2],[3,2]]
y = [0,1,1,0,0]
再将已有数据使用逻辑回归模型进行拟合,代码如下。
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(x,y)
训练完模型之后,即可用模型的predict()函数进行预测,代码如下。
model.predict([[2,2]])
array([0])
为什么上述代码中的predict()函数中要写两组中括号,而不是写成model.predict([2,2])呢?这是因为predict()函数默认接收一个多维数据,将其用于同时预测多个数据时大家会更容易理解,演示代码如下。
model.predict([[2,2],[4,4]])
array([0, 0])
3、深入理解
逻辑回归模型的本质是预测概率,而不是直接预测具体类别(如属于0还是1)。通过如下代码可以获取概率值。
y_pred_proba = model.predict_proba(x)
y_pred_proba
可以直接将y_pred_proba打印出来,它是一个NumPy格式的二维数组
array([[0.97344854, 0.02655146],
[0.39071972, 0.60928028],
[0.17991028, 0.82008972],
[0.63167893, 0.36832107],
[0.82424527, 0.17575473]])
本案例因为只有两个特征变量,所以逻辑回归计算概率的数学原理可以表示为如下所示的公式。现在需要计算截距项k0及系数k1和k2,使得预测的概率尽可能准确。注意在二分类模型(0和1两个分类)中,该P值默认预测的是分类为1(或者说二分类中数值较大的分类)的概率。
通过如下代码可以获取截距项k0及系数k1和k2,其中model为之前训练的模型名称,通过coef_属性可以获取特征变量前的系数ki,通过intercept_属性可以获取截距项k0。
获得系数和截距项后,可知预测分类为1的概率公式如下。