第二课:逻辑回归与梯度下降
逻辑回归
【实例】逻辑回归实例讲解
作者 : 老饼 日期 : 2022-06-26 03:35:26 更新 : 2022-09-24 16:59:20
本站原创文章,转载请说明来自《老饼讲解-机器学习》ml.bbbdata.com


本文讲解一个逻辑回归的实例。

先是梳理建模的思路,按照算法思路,自行编写代码使用梯度下降法求解。

最后,给出调用sklearn算法包进行求解的方法。


   01. 问题   


  问 题  


已采集150组 乳腺癌数据:包含四个特征和乳腺癌类别。
现在需要我们可以通过数据,
 训练一个逻辑回归,用于预测乳腺癌是良性还是恶性。


   数 据   


具体数据如下:
 
特征:平均平滑度、平均紧凑度、平均凹面、平均凹点,类别:0-恶性、1-良性

即以sk-learn中的breast_cancer的数据




  02. 建模思路  


整体建模思路如下





  1、确定模型  


假设X和Y符合逻辑回归模型,则有


  2、模型求解  


用梯度下降法求解W:
   用梯度下降法求解损失函数中的W:先初始化一个w,然后不断按负梯度方向 调整。 
   (最好能将数据归一化,这里为简化,我们不作归一化)


   3、将解回代模型  


将W回代模型




   03. 代码实现   


    自行编写代码求解   


 

代码如下:

# -*- coding: utf-8 -*-
"""
梯度下降求解逻辑回归
"""
from sklearn.datasets import load_breast_cancer
import numpy as np
#----数据加载------
data = load_breast_cancer()
X    = data.data[:,4:8]
y    = data.target

#-----给x增加一列1---------
xt = np.insert(X, X.shape[1], 1, axis=1)

#-----梯度下降求解w---------------
np.random.seed(888)             # 设定随机种子,以确保每次程序结果一次
w = np.random.rand(xt.shape[1]) # 初始化
for i in range(10000):
    p = 1/(1+np.exp(-xt@w)) #计算p
    w = w - 0.01*(xt.T@(p-y)) # 往负梯度方向更新w
p = 1/(1+np.exp(-xt@w))  # 最终的预测结果
print("参数w:"+str(w))

运行后输出 :

参数w:[  7.16215375  14.98708501 -16.84689114 -73.92486786   3.38331608]



    调用sklearn求解   



实际中我们一般都会直接调包求解,这里给出调用 sklearn包的方法,代码如下:

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
import numpy as np
#----数据加载------
data = load_breast_cancer()
X    = data.data[:,4:8]
y    = data.target

np.random.seed(888)
#-----训练模型--------------------
clf = LogisticRegression(random_state=0)            
clf.fit(X,y) 
#------打印结果------------------------
print("模型参数:"+str(clf.coef_))
print("模型阈值:"+str(clf.intercept_))


运行结果:

模型参数:[[-0.53024026 -3.48636783 -6.89132654 -4.37965412]]
模型阈值:[1.80112869]




   模型结果   


使用自行求解代码的结果
w=[  7.16,14.98,-16.84,-73.92,3.38],
将w回代模型,我们可以得到模型:
 





  (五) 检验模型效果  

我们画出训练样本中,各个p值段的0,1标签分布:
 
 

可以看到,p值越高,属于1类别的就越多,模型对样本已有较好的区分度。







 End 






联系小饼