目录
接下来进入正文
一、逻辑回归介绍及应用
1.1 Sigmoid函数
S ( t ) = 1 1 + e − t S(t)=\frac{1}{1+e^{-t}} S(t)=1+e−t1
函数图像如下:
从函数图像可以看出对任意的
t
t
t,
S
S
S的取值范围都在
[
0
,
1
]
[0,1]
[0,1]之间,当
t
>
=
0
t>=0
t>=0时,
S
>
=
0.5
S>=0.5
S>=0.5,可分类为
1
1
1;当
t
<
0
t<0
t<0时,
S
<
0.5
S<0.5
S<0.5,可分类为
0
0
0。
1.2 逻辑回归介绍
我们都知道线性回归 y = k x + b y=kx+b y=kx+b ,在此基础上,通过Sigmoid函数 L L L 将 y y y 映射到 S = L ( k x + b ) S=L(kx+b) S=L(kx+b), 通过设定阈值 S ′ S' S′,对于 S > S ′ S>S' S>S′的可以分类为正样本,对于 S < S ′ S<S' S<S′的分类为负样本,即可实现样本的二分类。对于多分类问题,可以采用多次二分类的方法实现多分类。
1.3 逻辑回归应用
预测是否发生、发生的概率(流失、客户响应等预测):根据logistic回归模型,预测在不同的自变量情况下,发生某病或某种情况的概率有多大。
影响因素、危险因素分析(找出影响结果的主要因素): 主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,也即影响因素分析。包括从多个可疑影响因素中筛选出具有显著影响的因素变量,还包括仅考察某单一因素是否为影响某一事件发生与否的因素。
判别、分类:实际上跟预测有些类似,也是根据logistic模型,判断某人属于某病或属于某种情况的概率有多大,也就是看一下这个人有多大的可能性是属于某病。
1.4 逻辑回归模型的优劣势
优点 :易于理解和实现;计算代价不高,速度很快,存储资源低;
缺点:容易欠拟合,分类精度可能不高
二、算法实践
Step1:库函数导入
##基础函数库
import numpy as np
import matplotlib.pyplot as plt ##导入画图库
import seaborn as sns #基于matplotlib的图形可视化python包
from sklearn.linear_model import LogisticRegression ##导入逻辑回归模型函数
Step2:样本集构造和模型训练
## 构造2行6列的矩阵
x_features = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
y_label = np.array([0, 0, 0, 1, 1, 1])#6行的label
## 调用逻辑回归模型
lr_clf = LogisticRegression()
## 用逻辑回归模型拟合构造的数据集
lr_clf = lr_clf.fit(x_features, y_label) #其拟合方程为 y=w0+w1*x1+w2*x2
Step3:模型参数查看
## 查看其对应模型的w1和w2
print('the weight of Logistic Regression:',lr_clf.coef_)
## 查看其对应模型的w0
print('the intercept(w0) of Logistic Regression:',lr_clf.intercept_)
输出为:
Step4:数据和模型可视化
#可视化
#画样本点
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
#c=y_label表示以y_label分别展示不同的颜色,s表示散点的大小,marker='x'可更改标记的类型
plt.title('Dataset');
plt.xlabel('x_features');#x_轴标题
plt.ylabel('y_label');#y轴标题
#可视化决策边界
nx, ny = 200, 100;
x_min, x_max = plt.xlim()#获取x轴的最小和最大值
y_min, y_max = plt.ylim()
x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx),np.linspace(y_min, y_max, ny))#x轴分成200等份,y轴分成100等份,生成网格矩阵
z_proba = lr_clf.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])#ravel()扁平化,np.c_按行连接两个矩阵,predict_proba注意和predict的区别
z_proba = z_proba[:, 1].reshape(x_grid.shape)#行列转值
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')#z_proba为(x_grid,y_grid)的高度值,绘制轮廓线,[0.7]轮廓线的位置
#新增样本点
## new point 1
x_fearures_new1 = np.array([[0, -1]])#生成新样本点1
plt.scatter(x_fearures_new1[:,0],x_fearures_new1[:,1], s=50, cmap='viridis')#对新样本点1可视化
plt.annotate(s='New point 1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))
## new point 2
x_fearures_new2 = np.array([[1, 2]])
plt.scatter(x_fearures_new2[:,0],x_fearures_new2[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 2',xy=(1,2),xytext=(-1.5,2.5),color='red',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))
plt.show()
Step5:模型预测
## 在训练集和测试集上分别利用训练好的模型进行预测
y_label_new1_predict = lr_clf.predict(x_fearures_new1)
y_label_new2_predict = lr_clf.predict(x_fearures_new2)
## 由于逻辑回归模型是概率预测模型(前文介绍的 p = p(y=1|x,\theta)),所以我们可以利用 predict_proba 函数预测其概率
y_label_new1_predict_proba = lr_clf.predict_proba(x_fearures_new1)
y_label_new2_predict_proba = lr_clf.predict_proba(x_fearures_new2)
print 'The New point 1 predict Probability of each class:',y_label_new1_predict_proba
print 'The New point 2 predict Probability of each class:',y_label_new2_predict_proba
输出为:
可以发现训练好的回归模型将X_new1预测为了类别0(判别面左下侧),X_new2预测为了类别1(判别面右上侧)。其训练得到的逻辑回归模型的概率为0.5的判别面为上图中蓝色的线。
链接:
1、Logistic回归主要应用领域