本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com
本文讲解一个逻辑回归的实例
先是梳理建模的思路,按照算法思路,自行编写代码使用梯度下降法求解
最后,给出调用sklearn算法包进行求解的方法
问 题
已采集150组 乳腺癌数据:包含四个特征和乳腺癌类别
现在需要我们可以通过数据,
训练一个逻辑回归,用于预测乳腺癌是良性还是恶性
具体数据如下:
特征:平均平滑度、平均紧凑度、平均凹面、平均凹点,类别:0-恶性、1-良性
说明:以上数据即以sklearn中的breast_cancer的数据
本节梳理用逻辑回归进行建模的思路
建模思路
整体建模思路如下
1、确定模型
假设X和Y符合逻辑回归模型,则有
2、模型求解
用梯度下降法求解损失函数中的W,如下:
先初始化一个w,
然后不断按负梯度方向 调整
最好能将数据归一化,这里为简化,我们对数据不作归一化
3、将解回代模型
将上述求得的W回代模型表达式即可得到最终的模型
本节通过自写代码求解和调包求解两种方法,实现逻辑回归模型求解
自行编写代码求解
现使用梯度下降法求解逻辑回归的损失函数
python代码如下:
# -*- 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类别的就越多,
这说明模型对样本已有较好的区分度
备注:逻辑回归一般用AUC或KS作为模型评估指标,这里为简化,暂不作展开
End