案例代码实现

一、代码说明

本案例针对信用卡欺诈检测二分类问题,完整实现逻辑回归的数据生成→预处理→模型训练→评估→阈值调整→决策边界可视化流程。

数据生成:模拟1000条交易数据,其中欺诈样本占20%(类不平衡),特征包括交易金额、时间、是否异地、5分钟内交易次数。

预处理:标准化特征(避免尺度差异影响模型)。

模型训练:使用逻辑回归,通过class_weight处理类不平衡。

评估:计算精确率、召回率、F1-score,绘制ROC/PR曲线。

阈值调整:对比默认阈值(0.5)与高精确率阈值(0.7)的性能。

决策边界可视化:选取2个关键特征(交易金额、时间),绘制逻辑回归的决策边界(p=0.5)。

二、完整代码

# 导入必要库(小白需记住这些常用库)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (classification_report, roc_curve, auc,precision_recall_curve, confusion_matrix)# 设置随机种子(保证结果可重复)
np.random.seed(42)def generate_credit_card_data(n_samples=1000, fraud_ratio=0.2):"""生成信用卡交易模拟数据(小白重点理解特征分布差异)参数:n_samples: 总样本量fraud_ratio: 欺诈样本比例(类不平衡)返回:df: 包含特征和标签的DataFrame"""# 计算正常/欺诈样本量n_fraud = int(n_samples * fraud_ratio)n_normal = n_samples - n_fraud# ---------------------- 1. 生成正常交易数据(0类) ----------------------normal_data = {'金额': np.random.normal(loc=1000, scale=200, size=n_normal),  # 正常金额:均值1000,标准差200'时间': np.random.randint(low=10, high=21, size=n_normal),       # 正常时间:10-20点(白天)'是否异地': np.random.binomial(n=1, p=0.1, size=n_normal),        # 正常异地:10%概率'5分钟内交易次数': np.random.poisson(lam=1, size=n_normal)         # 正常次数:均值1次}normal_df = pd.DataFrame(normal_data)normal_df['标签'] = 0  # 0=正常# ---------------------- 2. 生成欺诈交易数据(1类) ----------------------fraud_data = {'金额': np.random.normal(loc=5000, scale=1000, size=n_fraud), # 欺诈金额:均值5000,标准差1000(更大)'时间': np.random.randint(low=0, high=6, size=n_fraud),        # 欺诈时间:0-5点(凌晨)'是否异地': np.random.binomial(n=1, p=0.8, size=n_fraud),        # 欺诈异地:80%概率(更高)'5分钟内交易次数': np.random.poisson(lam=3, size=n_fraud)         # 欺诈次数:均值3次(更频繁)}fraud_df = pd.DataFrame(fraud_data)fraud_df['标签'] = 1  # 1=欺诈# ---------------------- 3. 合并数据并打乱顺序 ----------------------df = pd.concat([normal_df, fraud_df], ignore_index=True)df = df.sample(frac=1, random_state=42).reset_index(drop=True)  # 打乱顺序return dfdef plot_roc_pr_curve(y_true, y_prob):"""绘制ROC曲线和PR曲线(评估模型性能的关键图)"""# ROC曲线fpr, tpr, _ = roc_curve(y_true, y_prob)roc_auc = auc(fpr, tpr)# PR曲线precision, recall, _ = precision_recall_curve(y_true, y_prob)# 绘图fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))# ROC曲线ax1.plot(fpr, tpr, color='blue', label=f'ROC曲线 (AUC={roc_auc:.2f})')ax1.plot([0, 1], [0, 1], color='gray', linestyle='--', label='随机猜测')ax1.set_xlabel('假阳性率(FPR)')ax1.set_ylabel('真阳性率(TPR)')ax1.set_title('ROC曲线(评估整体区分能力)')ax1.legend()# PR曲线ax2.plot(recall, precision, color='green', label='PR曲线')ax2.set_xlabel('召回率(Recall)')ax2.set_ylabel('精确率(Precision)')ax2.set_title('PR曲线(评估类不平衡下的性能)')ax2.legend()plt.tight_layout()plt.show()def plot_decision_boundary(model, X, y, scaler, feature1='金额', feature2='时间'):"""绘制逻辑回归的决策边界(小白重点理解:线性模型如何划分类别)参数:model: 训练好的逻辑回归模型X: 特征数据(DataFrame)y: 标签数据scaler: 训练集的标准化器(用于网格数据标准化)feature1: 横轴特征feature2: 纵轴特征"""# 选取两个特征,固定其他特征为均值(或模式)# 其他特征:是否异地(取0,本地)、5分钟内交易次数(取1,正常次数)fixed_features = {'是否异地': 0,'5分钟内交易次数': 1}# 生成网格点(覆盖两个特征的取值范围)x1 = np.linspace(X[feature1].min(), X[feature1].max(), 100)x2 = np.linspace(X[feature2].min(), X[feature2].max(), 100)X1, X2 = np.meshgrid(x1, x2)# 构造网格点的特征数据(包含固定特征,保持与原数据列顺序一致)grid_data = pd.DataFrame({feature1: X1.ravel(),feature2: X2.ravel(),**fixed_features})# 调整列顺序与原数据一致(避免标准化时特征顺序错误)grid_data = grid_data[X.columns]# 标准化网格点特征(使用训练集的标准化器)grid_data_scaled = scaler.transform(grid_data)# 预测网格点的概率(p=0.5是决策边界)y_prob_grid = model.predict_proba(grid_data_scaled)[:, 1]y_prob_grid = y_prob_grid.reshape(X1.shape)# 绘制决策边界(p=0.5的等高线)plt.figure(figsize=(10, 6))contour = plt.contourf(X1, X2, y_prob_grid, levels=[0, 0.5, 1], cmap='RdBu', alpha=0.3)plt.colorbar(contour, label='欺诈概率')# 绘制样本点(正常=蓝色,欺诈=红色)sns.scatterplot(x=X[feature1], y=X[feature2], hue=y, palette={0: 'blue', 1: 'red'}, alpha=0.7, edgecolor='black')# 添加标签和标题plt.xlabel(feature1)plt.ylabel(feature2)plt.title(f'逻辑回归决策边界({feature1} vs {feature2})')plt.legend(title='标签', labels=['正常', '欺诈'])plt.show()# ---------------------- 主程序:逻辑回归完整流程 ----------------------
if __name__ == '__main__':# 1. 生成模拟数据(小白可调整n_samples和fraud_ratio)df = generate_credit_card_data(n_samples=1000, fraud_ratio=0.2)print("数据形状:", df.shape)print("标签分布:\n", df['标签'].value_counts(normalize=True))  # 查看类不平衡情况(正常80%,欺诈20%)# 2. 划分特征(X)和标签(y)X = df.drop('标签', axis=1)y = df['标签']# 3. 拆分训练集和测试集(70%训练,30%测试)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)print("训练集形状:", X_train.shape)print("测试集形状:", X_test.shape)# 4. 特征标准化(避免尺度差异影响模型,必须fit在训练集上)scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 5. 训练逻辑回归模型(处理类不平衡:class_weight='balanced')model = LogisticRegression(class_weight='balanced', random_state=42)model.fit(X_train_scaled, y_train)# 输出模型参数(小白可解释特征重要性)print("\n模型权重(w):", model.coef_[0])print("模型偏置(b):", model.intercept_[0])print("特征重要性(绝对值越大,对欺诈的贡献越大):")for feature, weight in zip(X.columns, model.coef_[0]):print(f"  {feature}: {weight:.2f}")# 6. 预测测试集(概率和类别)y_prob = model.predict_proba(X_test_scaled)[:, 1]  # 欺诈概率y_pred = model.predict(X_test_scaled)  # 默认阈值0.5的预测类别# 7. 评估模型性能(默认阈值0.5)print("\n---------------------- 默认阈值(0.5)评估 ----------------------")print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))print(classification_report(y_test, y_pred))# 绘制ROC/PR曲线(评估整体性能)plot_roc_pr_curve(y_test, y_prob)# 8. 调整阈值(比如提高到0.7,追求高精确率,避免误判正常交易)threshold = 0.7y_pred_high_precision = (y_prob >= threshold).astype(int)print(f"\n---------------------- 阈值={threshold}评估 ----------------------")print("混淆矩阵:\n", confusion_matrix(y_test, y_pred_high_precision))print(classification_report(y_test, y_pred_high_precision))# 9. 绘制决策边界(选取“金额”和“时间”两个关键特征,传入标准化器)plot_decision_boundary(model, X_test, y_test, scaler, feature1='金额', feature2='时间')

三、代码使用说明

1.环境准备

需要安装以下库(小白可通过pipinstall库名安装):numpy pandas matplotlib seaborn scikit-learn

2.运行代码

直接运行脚本,会依次执行:

生成模拟数据(1000条,20%欺诈);

划分训练集/测试集(7:3);

标准化特征;

训练逻辑回归模型(处理类不平衡);

输出模型参数(特征重要性);

评估默认阈值(0.5)的性能(混淆矩阵、分类报告);

绘制ROC/PR曲线;

评估高阈值(0.7)的性能;

绘制“金额vs时间”的决策边界。

3.结果解读

特征重要性:比如“金额”的权重为正(约1.5),说明金额越大,欺诈概率越高;“时间”的权重为负(约-0.8),说明时间越早(凌晨),欺诈概率越高(符合模拟逻辑)。

ROC曲线:AUC约0.95,说明模型区分正常和欺诈的能力很强。

PR曲线:精确率随召回率下降而上升,说明类不平衡下,模型对欺诈样本的识别能力较好。

决策边界:图中蓝色区域是正常交易(概率<0.5),红色区域是欺诈交易(概率>0.5)。可以看到,金额大、时间早的样本更可能被划分为欺诈(符合模拟数据的规律)。

4.小白可调整的参数

数据生成:generate_credit_card_data中的n_samples(总样本量)、fraud_ratio(欺诈比例);

模型训练:LogisticRegression中的C(正则化强度,越小正则化越强)、solver(优化器,比如'lbfgs'是默认,适合小数据);

阈值调整:threshold(比如0.6、0.8,观察精确率和召回率的变化);

决策边界:plot_decision_boundary中的feature1和feature2(比如换成“是否异地”和“5分钟内交易次数”,观察不同特征的边界)。

四、关键结论

逻辑回归适合线性可分的分类问题(比如本案例中,欺诈样本的特征明显更极端);

类不平衡处理:使用class_weight='balanced'可以让模型更重视少数类(欺诈);

阈值调整:根据任务需求选择阈值(比如欺诈检测需要高精确率,可提高阈值);

可解释性:模型权重可以直接解释特征对类别的贡献(小白能听懂的“为什么这个交易是欺诈”)。

通过这个案例,小白可以掌握逻辑回归的完整流程,理解每个步骤的作用,以及如何根据任务需求调整模型参数。

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

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

相关文章

CDH yarn 重启后RM两个备

yarn rmadmin -transitionToActive --forcemanual rm1 cd /opt/cloudera/parcels/CDH/lib/zookeeper/bin/ ./zkCli.sh -server IT-CDH-Node01:2181 查看是否存在残留的ActiveBreadCrumb节点 ls /yarn-leader-election/yarnRM #若输出只有[ActiveBreadCrumb]&#xff08;正常应…

HTML5音频技术及Web Audio API深入解析

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;音频处理在IT行业中的多媒体、游戏开发、在线教育和音乐制作等应用领域中至关重要。本文详细探讨了HTML5中的 <audio> 标签和Web Audio API等技术&#xff0c;涉及音频的嵌入、播放、控制以及优化。特别…

每日面试题13:垃圾回收器什么时候STW?

STW是什么&#xff1f;——深入理解JVM垃圾回收中的"Stop-The-World"在Java程序运行过程中&#xff0c;JVM会通过垃圾回收&#xff08;GC&#xff09;自动管理内存&#xff0c;释放不再使用的对象以腾出空间。但你是否遇到过程序突然卡顿的情况&#xff1f;这可能与G…

【系统全面】常用SQL语句大全

一、基本查询语句 查询所有数据&#xff1a; SELECT * FROM 表名;查询特定列&#xff1a; SELECT 列名1, 列名2 FROM 表名;条件查询&#xff1a; SELECT * FROM 表名 WHERE 条件;模糊查询&#xff1a; SELECT * FROM 表名 WHERE 列名 LIKE 模式%;排序查询&#xff1a; SELECT *…

Spring之SSM整合流程详解(Spring+SpringMVC+MyBatis)

Spring之SSM整合流程详解-SpringSpringMVCMyBatis一、SSM整合的核心思路二、环境准备与依赖配置2.1 开发环境2.2 Maven依赖&#xff08;pom.xml&#xff09;三、整合配置文件&#xff08;核心步骤&#xff09;3.1 数据库配置&#xff08;db.properties&#xff09;3.2 Spring核…

C++STL系列之set和map系列

前言 set和map都是关联式容器&#xff0c;stl中树形结构的有四种&#xff0c;set&#xff0c;map&#xff0c;multiset,multimap.本次主要是讲他们的模拟实现和用法。 一、set、map、multiset、multimap set set的中文意思是集合&#xff0c;集合就说明不允许重复的元素 1……

Linux 磁盘挂载,查看uuid

lsblk -o NAME,FSTYPE,LABEL,UUID,MOUNTPOINT,SIZEsudo ntfsfix /dev/nvme1n1p1sudo mount -o remount,rw /dev/nvme1n1p1 /media/yake/Datasudo ntfsfix /dev/sda2sudo mount -o remount,rw /dev/sda2 /media/yake/MyData

【AJAX】XMLHttpRequest、Promise 与 axios的关系

目录 一、AJAX原理 —— XMLHttpRequest 1.1 使用XMLHttpRequest 二、 XMLHttpRequest - 查询参数 &#xff08;就是往服务器后面拼接要查询的字符串&#xff09; 三、 地区查询 四、 XMLHttpRequest - 数据提交 五、 认识Promise 5.1 为什么 JavaScript 需要异步&#…

C++中的stack和queue

C中的stack和queue 前言 这一节的内容对于stack和queue的使用介绍会比较少&#xff0c;主要是因为stack和queue的使用十分简单&#xff0c;而且他们的功能主要也是在做题的时候才会显现。这一栏目暂时不会写关于做题的内容&#xff0c;后续我会额外开一个做题日记的栏目的。 这…

Spring Bean生命周期七步曲:定义、实例化、初始化、使用、销毁

各位小猿&#xff0c;程序员小猿开发笔记&#xff0c;希望大家共同进步。 引言 1.整体流程图 2.各阶段分析 1️⃣定义阶段 1.1 定位资源 Spring 扫描 Component、Service、Controller 等注解的类或解析 XML/Java Config 中的 Bean 定义 1.2定义 BeanDefinition 解析类信息…

API安全监测工具:数字经济的免疫哨兵

&#x1f4a5; 企业的三重致命威胁 1. 漏洞潜伏的定时炸弹 某支付平台未检测出API的批量数据泄露漏洞&#xff0c;导致230万用户信息被盗&#xff0c;面临GDPR 1.8亿欧元罚单&#xff08;IBM X-Force 2024报告&#xff09;。传统扫描器对逻辑漏洞漏检率超40%&#xff08;OWASP基…

Matplotlib详细教程(基础介绍,参数调整,绘图教程)

目录 一、初识Matploblib 1.1 安装 Matplotlib 1.2、Matplotlib 的两种接口风格 1.3、Figure 和 Axes 的深度理解 1.4 设置画布大小 1.5 设置网格线 1.6 设置坐标轴 1.7 设置刻度和标签 1.8 添加图例和标题 1.9 设置中文显示 1.10 调整子图布局 二、常用绘图教程 2…

Redis高可用架构演进面试笔记

1. 主从复制架构 核心概念Redis单节点并发能力有限&#xff0c;通过主从集群实现读写分离提升性能&#xff1a; Master节点&#xff1a;负责写操作Slave节点&#xff1a;负责读操作&#xff0c;从主节点同步数据 主从同步流程 全量同步&#xff08;首次同步&#xff09;建立连接…

无人机保养指南

定期清洁无人机在使用后容易积累灰尘、沙砾等杂物&#xff0c;需及时清洁。使用软毛刷或压缩空气清除电机、螺旋桨和机身缝隙中的杂质。避免使用湿布直接擦拭电子元件&#xff0c;防止短路。电池维护锂电池是无人机的核心部件&#xff0c;需避免过度放电或充电。长期存放时应保…

vlm MiniCPM 学习部署实战

目录 开源地址&#xff1a; 模型repo下载&#xff1a; 单图片demo&#xff1a; 多图推理demo&#xff1a; 论文学习笔记&#xff1a; 部署完整教程&#xff1a; 微调教程&#xff1a; 部署&#xff0c;微调教程&#xff0c;视频实测 BitCPM4 技术报告 创意&#xff1…

92套毕业相册PPT模版

致青春某大学同学聚会PPT模版&#xff0c;那些年我们一起走过的岁月PPT模版&#xff0c;某学院某班同学联谊会PPT模版&#xff0c;匆匆那年PPT模版&#xff0c;青春的纪念册PPT模版&#xff0c;栀子花开PPT模版&#xff0c;毕业纪念册PPT模版。 92套毕业相册PPT模版&#xff1…

爬虫基础概念

网络爬虫概述 概念 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网络蜘蛛&#xff08;Web Spider&#xff09;或机器人&#xff08;Bot&#xff09;&#xff0c;是一种自动化程序&#xff0c;用于系统地浏览互联网并收集网页信息。它模拟人类浏览器行为&…

java8 stream流操作的flatMap

我们来详细解释一下 Java 8 Stream API 中的 flatMap 操作。理解 flatMap 的关键在于将其与 map 操作进行对比。​​核心概念&#xff1a;​​​​map 操作&#xff1a;​​作用&#xff1a;将一个流中的每个元素​​转换​​为另一个元素&#xff08;类型可以不同&#xff09;…

开源UI生态掘金:从Ant Design二次开发到行业专属组件的技术变现

开源UI生态掘金&#xff1a;从Ant Design二次开发到行业专属组件的技术变现内容摘要在开源UI生态中&#xff0c;Ant Design作为一款广受欢迎的UI框架&#xff0c;为开发者提供了强大的基础组件。然而&#xff0c;面对不同行业的特定需求&#xff0c;仅仅依靠现有的组件往往难以…

Object Sense (OSE):一款从编辑器脚本发展起来的编程语言

引言&#xff1a;从Vim编辑器走出的语言在编程语言的世界里&#xff0c;许多革命性的创新往往源于看似简单的工具。Object Sense&#xff08;简称OSE&#xff09;的诞生&#xff0c;便与一款经典文本编辑器——Vim息息相关。它的前身是Vim的脚本语言VimL&#xff08;Vimscript&…