逻辑回归 算法推导与基于Python的实现详解

简介: 逻辑回归(Logistic Regression)是一种用于分类问题的统计学习方法。它基于线性回归的原理,通过将线性函数的输出值映射到[0,1]区间上的概率值,从而进行分类。逻辑回归的输入是一组特征变量,它通过计算每个特征与对应系数的乘积,加上截距项得到线性函数,然后将该函数的输出值经过sigmoid函数的映射,得到概率值。

1 逻辑回归概述



13071a2abb102c2f6bcfad9ca1eff755.png

逻辑回归(Logistic Regression)是一种用于分类问题的统计学习方法。它基于线性回归的原理,通过将线性函数的输出值映射到[0,1]区间上的概率值,从而进行分类。


逻辑回归的输入是一组特征变量,它通过计算每个特征与对应系数的乘积,加上截距项得到线性函数,然后将该函数的输出值经过sigmoid函数的映射,得到概率值。


逻辑回归常用于二分类问题,即将样本分为两类,如判断一封邮件是否为垃圾邮件。逻辑回归还可以扩展到多分类问题,如将样本分为三类或更多类别。


逻辑回归具有简单、高效、易于理解等优点,在实际应用中被广泛使用,如金融风控、医学诊断、推荐系统等领域。


2 逻辑回归公式推导与求解

2.1 公式推导

image.png

逻辑回归的公式大家可能很熟悉,但并不知道推导过程,事实上这一推导过程也十分简单。


给定输入特征 x \mathbf{x}x,逻辑回归模型的输出 y yy 可以表示为:

image.png


image.png


其中,σ ( z ) \sigma(z)σ(z) 表示 sigmoid 函数,定义为:σ ( z ) = 1 / ( 1 + e − z ) \sigma(z) = 1 / (1 + e^{-z})σ(z)=1/(1+e −z )。这一函数在之后的深度学习中也会经常用到。


至于什么使用sigmoid函数,原因也很简单,很多教材都把这个重要的思考环节忽略了,博主在此进行补充。

我们希望找到一个函数的值域在[0,1]的函数,但是这种函数并不容易找到,线性回归使用的公式y = θ x y=\theta xy=θx的值域是(-∞,+∞)。因此,我们引入了odds(几率)的概念。

image.png


odds的取值为(0,+∞),而对于log函数,其定义域刚好为(0,+∞),值域为(-∞,+∞)。因此,我们便可以构造一个函数

image.png

对P进行求解,即得到了逻辑回归的基本形式

image.png1

也就是我们所常说的sigmoid函数。


2.2公式求解

为了方便推导,我们假设训练数据集包含 m mm 个样本,每个样本有 n nn 个特征,即 X ∈ R m × n \mathbf{X} \in \mathbb{R}^{m\times n}X∈R

m×n

,标签为 y ∈ { 0 , 1 } m y \in \{0, 1\}^my∈{0,1}

m

。为了构建模型,我们需要使用训练数据集求解模型参数 w \mathbf{w}w。


我们使用最大似然估计来求解模型参数。最大似然估计的目标是找到一组模型参数 w \mathbf{w}w,使得训练数据集出现的概率最大。设训练数据集中的第 i ii 个样本的输入特征为 x i \mathbf{x}_ix

i ,输出为 y i y_iy i ,其概率表示为:


image.pngimage.png

image.png

训练数据集的概率可以表示为:


image.png


对数似然函数为:

image.png


我们的目标是最大化对数似然函数 L ( w ) L(\mathbf{w})L(w)。使用梯度上升算法来求解最优参数 w \mathbf{w}w。对 L ( w ) L(\mathbf{w})L(w) 求导,得到:

image.png

使用梯度上升算法,每次更新 w \mathbf{w}w 的值为:

image.png

其中,α \alphaα 是学习率。


3 基于Python的实现

3.1可接收参数

在Python中,使用Scikit-learn库中的LogisticRegression类可以创建逻辑回归模型。


下面是LogisticRegression类的主要参数和方法:


参数:


penalty: 惩罚项,可以是‘l1’、‘l2’、‘elasticnet’、‘none’中的一种,默认为‘l2’。

C: 正则化系数,用于控制模型的复杂度,C值越小,模型越简单,默认为1.0。

solver: 用于优化问题的算法,可以是‘newton-cg’、‘lbfgs’、‘liblinear’、‘sag’、‘saga’中的一种,默认为‘lbfgs’。

max_iter: 最大迭代次数,用于控制优化算法的迭代次数,默认为100

3.2 完整代码示例

我们使用sklearn自带的威斯康辛州乳腺癌数据集,进行模型的训练和预测。


首先导入sklearn等必要的包与数据:

import pandas as pd  
from sklearn.datasets import load_breast_cancer  
from sklearn.linear_model import LogisticRegression  
from sklearn.model_selection import train_test_split  
import matplotlib.pyplot as plt  
import matplotlib as mpl  
## 设置字符集,防止中文乱码  
mpl.rcParams['font.sans-serif'] = [u'simHei']  
mpl.rcParams['axes.unicode_minus'] = False  
# 加载数据集  
data = load_breast_cancer()  
# 转换为DataFrame  
df = pd.DataFrame(data.data, columns=data.feature_names)  
df['target'] = pd.Series(data.target)



此处skearn自带的数据已经是清洗后的版本,如果使用的是原始威斯康辛州乳腺癌数据集或者其他个人数据集,需要对数据进行查看、清洗与特征初筛。比如特征集可能包含患者的身份ID等无用信息,将此类信息直接删除即可。


同时可以使用常用的函数查看数据集状态,比如


# 检测非数据类型与缺失值  
print(df.info())
# 检查异常值  
print(df.describe())


4

这里官方的数据运行结果如下,可以看到已经不需要做什么修改了。其输出如下:




ee2245201108a922c28d73e216f60857.png



如果Type中出现object,通常意味着这一类的某一行存在非数值类型,此时可以使用


df['A'] = pd.to_numeric(df['A'], errors='coerce').astype(float)
1

这段函数可以将df的A列转为float类型,并将不能转换的数值变为空值。之后与其他缺失值共同使用dropna删除即可。

2. 模型建立与拟合


# 分割数据集  
X = df.drop('target', axis=1)  
y = df['target']  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)  
# 创建逻辑回归模型  
clf = LogisticRegression(max_iter=100)  
# 拟合模型  
clf.fit(X_train, y_train)


10

建立模型时,通常不用修改超参数,也可根据数据集的实际特点或拟合后的一些警告(比如函数最终没有收敛)进行超参数的调整。

3. 模型预测与绘图


# 预测  
y_pred = clf.predict(X_test)  
# 评估  
accuracy = clf.score(X_test, y_test)  
print("预测结果:", y_pred)  
print("准确率:", accuracy)  
plt.plot(range(len(X_test)), y_test, 'ro', markersize=4, zorder=3, label=u'真实值')  
plt.plot(range(len(X_test)), y_pred, 'go', markersize=10, zorder=2, label=u'预测值')  
plt.legend()  
plt.show()


从图片上可以看出,红色圈与绿色圈同时出现的点为预测正确的数据,二者单独出现的点位为预测错误的数据。此处对预测结果的判断,是基于概率大于0.5和小于0.5来分割的。如果我们想达到当大于0.8的概率为0才视为0时(降低漏诊概率),可以使用下面的方法。




143ff0ca7bd00cc30643ff0b502c0d88.png



自定义阈值

print(clf.predict_proba(X_test)[:,0]>0.8)
1

clf.predict_proba(X_test)用于输出不同类别的概率,其输出型输入下:


如果想要获取分类为0的可能性大于0.8的数据,提取粗该列的数值加以判断即可。






a1916a0c1507d11c7efff33222ec1662.png


目录
打赏
0
0
0
1
19
分享
相关文章
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
深度洞察内网监控电脑:基于Python的流量分析算法
在当今数字化环境中,内网监控电脑作为“守城卫士”,通过流量分析算法确保内网安全、稳定运行。基于Python的流量分析算法,利用`scapy`等工具捕获和解析数据包,提取关键信息,区分正常与异常流量。结合机器学习和可视化技术,进一步提升内网监控的精准性和效率,助力企业防范潜在威胁,保障业务顺畅。本文深入探讨了Python在内网监控中的应用,展示了其实战代码及未来发展方向。
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
36 12
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
36 9
|
13天前
|
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
33 10
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
54 17
解锁文档管理系统高效检索奥秘:Python 哈希表算法探究
在数字化时代,文档管理系统犹如知识宝库,支撑各行各业高效运转。哈希表作为核心数据结构,通过哈希函数将数据映射为固定长度的哈希值,实现快速查找与定位。本文聚焦哈希表在文档管理中的应用,以Python代码示例展示其高效检索特性,并探讨哈希冲突解决策略,助力构建智能化文档管理系统。
探究办公室电脑怎么共享文件的 Python 算法
在数字化办公环境中,高效文件共享是提升工作效率的关键。本文聚焦于使用Python实现办公室电脑文件共享的算法,涵盖需求分析、基础实现及优化拓展。通过socket编程和文件流操作,实现文件传输,并探讨多线程、权限管理和文件索引等优化措施,确保文件共享的安全性和便捷性,助力现代办公协同。
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
77 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等