逻辑回归一般用于估计某种事物的可能性(“可能性”而非数学上的“概率”),不可以直接当作概率值来用。逻辑回归可以用于预测系统或产品的故障的可能性,还可用于市场营销应用程序,例如预测客户购买产品或中止订购的倾向等。在经济学中它可以用来预测一个人选择进入劳动力市场的可能性,而商业应用则可以用来预测房主拖欠抵押贷款的可能性。还可以根据逻辑回归模型,预测在不同的自变量情况下,发生某种情况的概率。
逻辑回归是一种分类模型而非回归模型,在介绍逻辑回归前先来了解几个相关定义。
(1)让步比:
,代表阳性事件的概率,它指的是要预测的事件的可能性,例如:病人有某种疾病的可能性、某人买彩票中了的可能性等。
(2)让步比的对数形式:
。logit函数输入值的取值范围在0到1之间,转换或计算的结果值为整个实数范围,可以用它来表示特征值和对数概率之间的线性关系:
此处, p ( y =1| x )是某个特定样本属于 x 类给定特征标签为1的条件概率。
(3)sigmoid函数:
,它是logit函数的逆形式。sigmoid函数的形状如图3-2所示。
图3-2 sigmoid函数的形状
在建立逻辑回归模型时,想要最大化 L 的可能性,先要假设数据集中的样本都是相互独立的个体。公式如下:
在实践中,最大化该方程的自然对数,也被称为对数似然函数:
用梯度下降方法最小化代价函数 J :
为更好地理解这个代价函数,计算一个样本训练实例的代价如下:
J ( ϕ ( z ), y ; w )=- y log( ϕ ( z ))-(1- y )log(1- ϕ ( z ))
从方程中可以看到,如果 y =0,第一项为0,如果 y =1,第二项为0:
下面代码实现绘制一张图,用于说明 ϕ ( z )不同样本实例分类的代价:
import numpy as np from matplotlib import pyplot as plt def cost_1(z): return - np.log(sigmoid(z)) def cost_0(z): return - np.log(1 - sigmoid(z)) z = np.arange(-10,10,0.1) phi_z = sigmoid(z) c1 = [cost_1(x)for x in z] plt.plot(phi_z,c1,label='J(w)if y=1') c0 = [cost_0(x)for x in z] plt.plot(phi_z,c0,linestyle='--',label='J(w)if y=0') plt.ylim(0.0,5.1) plt.xlim([0,1]) plt.xlabel('$\phi$(z)') plt.ylabel('J(w)') plt.legend(loc='best') plt.tight_layout() plt.show()
运行程序,效果如图3-3所示。
图3-3 不同样本实例分类的代价
由结果可得出结论:如果分类为1,则概率越小表示分类错误程度越高;如果分类为0,则概率越大表示分类错误程度越高。
【例3-1】 用sklearn训练逻辑回归模型。
from sklearn.linear_model import LogisticRegression lr=LogisticRegression(C=100.0,random_state=1) lr.fit(X_train_std,y_train) plot_decision_regions(X_combined_std,y_combined, classifier=lr,test_idx=range(105,150)) plt.xlabel('花瓣长度[标准化]') plt.ylabel('花瓣宽度[标准化]') plt.legend(loc='左上角') plt.tight_layout() plt.show()
运行程序,效果如图3-4所示。
图3-4 sklearn训练逻辑回归模型效果
什么是过拟合?什么是欠拟合?过拟合是指模型在训练数据上表现良好,但无法概括未见过的新数据或测试数据;欠拟合是指模型不足以捕捉训练数据中的复杂模式,因此对未见过的数据表现不良。图3-5可以很好地阐明过拟合与欠拟合的情况。
图3-5 过拟合与欠拟合
正则化又是什么?正则化是处理共线性(特征之间的高相关性),消除数据中的噪声,并最终能避免过拟合的非常有效的方法。正则化的逻辑是引入额外偏置来惩罚极端的权重。
最常见的正则化是L2正则化,具体如下:
其中, λ 为正则化参数。
逻辑回归的代价函数可以通过增加一个简单的正则项来调整,这将在模型训练的过程中缩小权重:
可通过绘制两个权重系数的L2正则化路径实现可视化,代码如下:
weights,params=[],[] for c in np.arange(-5,5): lr = LogisticRegression(C=10. * * c,random_state=1) lr.fit(X_train_std,y_train) weights.append(lr.coef_[1]) params.append(10. * * c) weights = np.array(weights) plt.plot(params,weights[:,0], label='花瓣长度') plt.plot(params,weights[:,1],linestyle='--', label='花瓣宽度') plt.ylabel('权重系数') plt.xlabel('C') plt.legend(loc='左上角') plt.xscale('log') plt.show()
运行程序,效果如图3-6所示。
图3-6 两个权重系数的L2正则化
如图3-6所示,减小逆正则化参数C可以增大正则化的强度,权重系数会变小。