NLP学习开始-02逻辑回归

逻辑回归

  • 什么是逻辑回归
  • 逻辑回归的应用场景
  • 逻辑回归几个重要概念
    • Sigmoid 函数
    • 损失函数
  • 构建逻辑回归模型的步骤
  • 举个例子
  • 参数解释
  • 模型优化

什么是逻辑回归

逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计学习方法,尽管名字中带有"回归",但它实际上是一种用于二分类或多分类问题的算法。

逻辑回归通过使用逻辑函数(也称为 Sigmoid 函数)将线性回归的输出映射到 0 和 1 之间,从而预测某个事件发生的概率。

逻辑回归的应用场景

信用评分:预测贷款申请人的违约风险。
医疗诊断:根据病人的症状预测疾病的可能性。
市场营销:预测用户是否会点击广告或购买产品
垃圾邮件检测(是垃圾邮件/不是垃圾邮件)
疾病预测(患病/不患病)
客户流失预测(流失/不流失)

逻辑回归几个重要概念

Sigmoid 函数

σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
一个简单的图形表示,sigmoid函数将输出映射到了0和1之间,从而预测某个事件发生的概率
在这里插入图片描述

损失函数

是机器学习中用于量化模型预测结果与真实标签之间差异的数学工具。其核心目标是为模型优化提供一个可计算的目标,通过最小化损失函数,模型能逐步调整参数以逼近真实数据分布
逻辑回归常用的损失函数是对数损失,又叫交叉熵损失函数,来衡量模型预测的效果。

对于每个样本,它的损失可以表示为:
L(θ)=−[yilog⁡(y^i)+(1−yi)log⁡(1−y^i)]L(\theta) = -[y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i) ] L(θ)=[yilog(y^i)+(1yi)log(1y^i)]
对整个训练集的损失是对所有样本损失的平均:
L(θ)=−1N∑i=1N[yilog⁡(y^i)+(1−yi)log⁡(1−y^i)]L(\theta) = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i) \right] L(θ)=N1i=1N[yilog(y^i)+(1yi)log(1y^i)]
其中 N 是训练样本的数量,yi​ 是真实标签,y^​i​ 是预测概率值
下面是一个简单的图形,p是预测的概率,图表直观地展示了当真实标签固定时,损失如何随着预测概率的变化而变化
在这里插入图片描述

横轴(Predicted Probability, p):表示模型预测的概率为正类(通常标记为1)的概率值,范围从0到1。
纵轴(Loss):表示对应的损失值,反映了预测概率与真实标签之间的差异程度。
曲线:
红色曲线(y=1):当真实标签为1时,损失随预测概率的变化。当预测概率接近0时,损失非常大,因为模型严重错误地预测了负类。当预测概率接近1时,损失接近0,因为模型正确预测了正类。
蓝色曲线(y=0):当真实标签为0时,损失随预测概率的变化。当预测概率接近1时,损失非常大,因为模型严重错误地预测了正类。当预测概率接近0时,损失接近0,因为模型正确预测了负类。
虚线(p=0.5):表示预测概率为0.5的位置,此时模型对正负类的预测不确定。

构建逻辑回归模型的步骤

1.数据EDA
2.特征工程
3.模型构建与训练
4.模型评估与调优
5.模型解释与部署

举个例子

课题:Binary Classification with a Bank Dataset

#逻辑回归
import numpy as np 
import pandas as pd
from sklearn.linear_model import LogisticRegression# 数据
test = pd.read_csv("../data/BankDataset/test.csv") # 验证集
train = pd.read_csv("../data/BankDataset/train.csv") # 训练集
# 合并测试集和训练集
test['type'] = 'test'
train['type'] = 'train'
all_data = pd.concat([test,train])
all_columns = all_data.columns.tolist()

数据EDA

print(all_columns)
"""
id → ID(标识符/唯一编号)
age → 年龄
job → 职业
marital → 婚姻状况
education → 教育程度
default → 是否有违约记录(通常指信贷违约,如“是否拖欠债务”)
balance → 账户余额
housing → 是否有住房贷款(或“住房贷款状态”)
loan → 是否有个人贷款(或“贷款状态”)
contact → 联系方式(或“沟通渠道”,如电话、邮件等)
day → 日期(日)(当月中的第几天)
month → 月份
duration → 通话时长(单位:秒,常见于电话营销场景)
campaign → 营销活动次数(客户被联系的次数)
pdays → 上次联系间隔天数(距离上次联系的间隔天数,999表示未联系过)
previous → 之前营销活动次数(客户在本次活动前参与的营销次数)
poutcome → 之前营销结果(如“成功”“失败”“未响应”等)
y → 目标变量(通常为二分类标签,如“是否购买产品”“是否响应营销”)
"""#查看列类型
print("train",all_data.dtypes)
# 缺失值查看
missing_report = pd.DataFrame({'Missing_Count': all_data[all_columns].isnull().sum(),'Missing_Ratio': (all_data[all_columns].isnull().sum() / len(all_data[all_columns])).round(4),'Valid_Count': all_data[all_columns].count(),'Valid_Ratio': (all_data[all_columns].count() / len(all_data[all_columns])).round(4)
})
print(missing_report)# 获取文本列和数值列
numeric_cols = all_data.select_dtypes(include=['number']).columns.tolist()
non_numeric_cols = all_data.select_dtypes(exclude=['number']).columns.tolist()
# 查看文本特征列的值
for col in non_numeric_cols:print(col)print(all_data[col].unique())

在这里插入图片描述
对于一些有顺序性的特征进行有序编码

# 对于一些有顺序性的特征进行有序编码
poutcome_map = {'failure':0,'unknown':1,'other':2,'success':3,None:1} #使用顺序编码,从失败~成功
default_map={'no':0,'yes':1,None:-1} # 
housing_map={'no':0,'yes':1,None:-1} #
loan_map={'no':0,'yes':1,None:-1} #
education_map = {'primary': 1,'secondary': 2,'tertiary': 3,'unknown': 0
}
order_columns=['poutcome','default','housing','loan','education']
all_data["poutcome_encode"]=all_data['poutcome'].map(poutcome_map)
all_data["default_encode"]=all_data['default'].map(default_map)
all_data["housing_encode"]=all_data['housing'].map(housing_map)
all_data["loan_encode"]=all_data['loan'].map(loan_map)
all_data["education_encode"]=all_data['education'].map(education_map)
#删除转换的列
all_data.drop(order_columns,axis=1, inplace=True)

对没有顺序性的列进行独热编码

# 对月份进行标签编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
all_data['month_encoded'] = le.fit_transform(all_data['month'])
# 对职业进行独热编码编码
job_dummies = pd.get_dummies(all_data['job'], prefix='job')
job_dummies = job_dummies.astype(int)  # 转换为0/1
# 对婚姻状况进行独热编码
marital_dummies = pd.get_dummies(all_data['marital'], prefix='marital')
marital_dummies = marital_dummies.astype(int)  # 转换为0/1
# 对联系方式进行独热编码
contact_dummies = pd.get_dummies(all_data['contact'], prefix='contact')
contact_dummies = marital_dummies.astype(int)  # 转换为0/1

构建新的数据集

# 合并为新的数据集
finall_data=pd.concat([all_data,job_dummies,marital_dummies,contact_dummies],axis=1)
encode_col=['job','marital','contact','month']
finall_data.drop(encode_col,axis=1, inplace=True)
new_train = finall_data[finall_data['type']=='train'].copy()
new_test = finall_data[finall_data['type']=='test'].copy()
new_train.drop(['type'],axis=1, inplace=True)
new_test.drop(['type'],axis=1, inplace=True)
Y_train = new_train['y']
new_train.drop(['y','id'],axis=1, inplace=True)
new_test.drop(['y','id'],axis=1, inplace=True)

构建模型

# 创建模型
from sklearn.linear_model import LogisticRegression
# 创建模型(可调整参数)
model = LogisticRegression(penalty='l2',  # 正则化类型(L1/L2)C=1.0,         # 正则化强度(越小正则化越强)solver='lbfgs', # 优化算法('lbfgs', 'liblinear', 'saga')max_iter=1000,  # 最大迭代次数random_state=42
)
#训练模型
model.fit(new_train,Y_train)

使用模型

y_pred = model.predict(new_test)
submission_df = pd.DataFrame(data={'id': test['id'], 'y': y_pred})
submission_df.to_csv('output.csv', index=False)

参数解释

penalty(正则化类型)
作用:指定正则化类型,用于防止过拟合。
可选值: ‘l2’(默认):L2 正则化(权重衰减),对大权重施加惩罚,使参数更平滑。 ‘l1’:L1 正则化,倾向于产生稀疏解(部分参数为零,适用于特征选择)。 ‘elasticnet’:L1 和 L2 的组合(需额外设置 l1_ratio 参数)。 None:无正则化(不推荐,易过拟合)。
调整建议: 如果特征较多,尝试 ‘l1’ 进行特征选择。 默认 ‘l2’ 通常表现稳定

== C(正则化强度)==
作用:控制正则化的强度,与模型复杂度负相关。
取值: 必须为正浮点数(如 C=0.1, C=1.0, C=10)。
越小:正则化越强,模型更简单(可能欠拟合)。
越大:正则化越弱,模型更复杂(可能过拟合)。
调整建议: 通过交叉验证(如 GridSearchCV)搜索最优值(例如 C=[0.01, 0.1, 1, 10])。 默认值 C=1.0 适合多数场景。
solver(优化算法)
作用:指定损失函数的优化算法,不同算法对参数的支持和效率不同。 可选值:
‘lbfgs’(默认):拟牛顿法,适合中小型数据集,支持 ‘l2’ 和 ‘none’。
‘liblinear’:坐标下降法,适合小型数据集,支持 ‘l1’ 和 ‘l2’。
‘saga’:随机梯度下降,适合大数据集,支持 ‘l1’、‘l2’ 和’elasticnet’。
‘newton-cg’:牛顿法,支持 ‘l2’ 和 ‘none’。
‘sag’:随机平均梯度下降,适合大数据集,仅支持 ‘l2’。
调整建议: 数据量小:‘liblinear’ 或 ‘lbfgs’。 数据量大:‘saga’ 或 ‘sag’。 需要 L1 正则化:选择 ‘liblinear’ 或 ‘saga’。
max_iter(最大迭代次数)
作用:控制优化算法的最大迭代次数,确保算法收敛。
默认值:100(可能不足,尤其是复杂数据)。
调整建议: 如果收敛警告(ConvergenceWarning),增加此值(如 max_iter=1000)。 对于大型模型或高维数据,可能需要更大值(如 5000)。
random_state(随机种子)
作用:控制随机数生成,确保结果可复现。
适用场景: 当 solver=‘lbfgs’、‘sag’ 或 ‘saga’ 时,影响权重初始化。在交叉验证或数据洗牌时固定随机性。
调整建议: 固定为整数(如 42)以保证结果一致性。

模型优化

努力码字中…
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92611.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维进阶】LAMPLNMP 最佳实践

LAMP/LNMP 最佳实践 LAMP/LNMP 组件 LAMP:LinuxApacheMysql/MariadbPHP/Python/Perl。 LNMP:LinuxNginxMysql/MariadbPHP/Python/Perl。 Linux:操作系统,提供程序运行基础。Apache/Nginx:Web 服务器,提供网…

深入解析 resolv.conf 文件:DNS 配置的核心

/etc/resolv.conf 文件是 Linux 和类 Unix 系统中 DNS 配置的核心组件。它决定了系统如何将域名解析为 IP 地址,这是网络通信的关键环节。本文将深入探讨 resolv.conf 文件的核心内容,重点讲解 nameserver 指令以及 options 配置中的 attempts 和 rotate…

【LeetCode】102 - 二叉树的层序遍历

题目描述 给你二叉树的根节点 root,返回其节点值的层序遍历(即逐层地,从左到右访问所有节点)。 解题思路 使用 BFS(广度优先搜索)的思想,维护当前层的所有节点,逐层处理:…

计算机网络1-5:计算机网络的性能指标

目录 常用性能指标 速率 带宽 吞吐量 时延 时延带宽积 ​往返时间 ​利用率 ​丢包率 常用性能指标 性能指标可以从不同的方面来度量计算机网络的性能 常用的计算机网络的性能指标有8个:速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率 速率 比特…

TDengine IDMP 文档介绍

TDengine IDMP (Industrial Data Management Platform) 是一款 AI 原生的物联网、工业数据管理平台。它通过经典的树状层次结构组织传感器、设备采集的数据,建立数据目录,对数据提供语境化、标准化的处理、并提供实时分析、可视化、事件管理与报警等功能…

使用 iFLOW-CLI GitHub Action 和 Qwen3-Coder 给 GitHub 仓库生成幻灯片风格的文档站点

阿里的心流 https://www.iflow.cn/ 团队最近开源了一款基于终端的 AI Agent 工具 iFLOW CLI, 目前可以免费使用到强大的 Qwen3-Coder、Kimi K2 等模型。又是一款类似 Anthropics Claude Code 的产品。 iFlow CLI 是一款直接在终端中运行的强大 AI 助手。它能够无缝分析代码仓库…

【2025最新】在 macOS 上构建 Flutter iOS 应用

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 目录软件要求操作系统开发工具文本编辑器或集成开发环境安装 Flutter SDK下载并安装 Flutter将 Flutter 添加到您的PATH配置 i…

MySQL 临时表详细说明

目录 MySQL 临时表详细说明 1. 定义 2. 核心特性 3. 创建与使用 4. 典型应用场景 5. 生命周期管理 6. 注意事项 7. 性能优化建议 MySQL 临时表详细说明 1. 定义 临时表是存储在内存或磁盘上的临时性数据表,仅在当前数据库会话中存在。会话结束时自动销毁&a…

深入解析 Apache APISIX 在微服务网关中的性能优化实践指南

深入解析 Apache APISIX 在微服务网关中的性能优化实践指南 文章类型:性能优化实践指南 技术领域:微服务架构 —— API 网关 文章结构:原理深度解析型 目标读者:有一定微服务与运维基础的后端开发工程师一、技术背景与应用场景 随…

【Spring Boot刷新上下文核心流程详解】

Spring Boot 刷新上下文核心流程详解 一、前言 在使用 Spring Boot 启动应用时,控制台会打印出一大串日志,其中最核心的启动动作之一就是 刷新上下文(refresh)。 refresh 方法不仅负责 Bean 的创建与初始化,还涉及监…

关于过滤器(Filter)的学习

过滤器(Filter)概述 过滤器是 Java Servlet 规范的一部分,用于在请求到达 Servlet 之前或响应返回客户端之前拦截请求和响应。它可以用于执行各种任务,如请求预处理、响应后处理、身份验证、日志记录等。 过滤器的作用 预处理请…

Spring AI 打造智能面试人实战

Spring AI人工智能面试机器人相关实例 以下是与Spring AI人工智能面试机器人相关的实用案例,涵盖技术实现、功能设计及常见问题解决方案,按应用场景分类呈现: 技术集成案例 调用Hugging Face模型库处理专业领域问题 通过Spring Security添加面试会话身份验证 结合WebSoc…

QT 程序发布时候调用自定义动态库

1、需要在pro文件中增加下面的内容:QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/lib\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/../lib\"其中lib为动态库的文件夹名称,可以根据自己喜好…

SpringBoot学习日记 Day6:解锁微服务与高效任务处理

一、开篇:从单体到微服务的思维转变刚开始接触微服务时,我总习惯把所有功能写在一个项目里。直到项目越来越臃肿,每次修改都要全量部署,才意识到微服务架构的价值。今天我们就来探索SpringBoot在微服务场景下的强大能力&#xff0…

机械学习--DBSCAN 算法(附实战案例)

DBSCAN 算法详解DBSCAN(Density-Based Spatial Clustering of Applications with Noise,带噪声的基于密度的空间聚类应用)是一种经典的密度聚类算法,由 Martin Ester 等人于 1996 年提出。与 K-means 等基于距离的聚类算法不同&am…

【昇腾】基于RK3588 arm架构Ubuntu22.04系统上适配Atlas 200I A2加速模块安装EP模式下的驱动固件包_20250808

一、背景 1.1 主要的硬件是:1.2 主要的软件是: RK3588跑操作系统Atlas 200I A2加速模块作为EP模式关键参数版本说明CPU架构aarch64OS版本Ubuntu 22.04.5 LTSkernel版本5.10.198 二、适配 准备固件run包文件:Ascend-hdk-310b-npu-firmware_7.…

如何在 VS Code 中进行 `cherry-pick`

cherry-pick 是 Git 的一个功能,允许你选择某个 commit 并将其应用到当前分支,而无需合并整个分支。在 VS Code 中,你可以通过 内置的 Git 功能 或 终端 来完成 cherry-pick。方法 1:使用 VS Code 的 Git 图形界面(GUI…

STM32CubeMX(十三)FatFs文件系统(SPI驱动W25Qxx)

目录 一、知识点 1. 什么是Fatfs文件系统? 2. Fatfs操作系统控制流程 二、实战操作 1.CubeMX配置 2. 配置串口以及SPI 3. 修改功能映射接口 4. 添加测试代码 5. 实验现象 在完成本章之前需要完成一些基础配置,详情查看下面的文章。 STM32CubeMX(二)新建工…

【前端后端部署】将前后端项目部署到云服务器

更多笔记在这里☞ 全栈之路: https://gitee.com/oldbe/notes 【跳转到】 觉得有用请点个 star ,非常感谢! 现在AI太强大,开发个人产品的门槛和成本太低了,只要你有好的想法都可以很快速的开发一款产品 1.…

vue如何监听localstorage

在Vue中监听localStorage的变化可以通过几种方式实现,但需要注意的是,localStorage本身不提供原生的事件监听机制,如DOM元素的MutationObserver。不过,你可以通过一些间接的方法来监听localStorage的变化。方法1:使用w…