尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

逻辑回归实战:信用卡欺诈检测中的类别不平衡与阈值调优

发布时间:2026/9/26 16:39:20

资讯中心
01
ARTICLE

逻辑回归实战:信用卡欺诈检测中的类别不平衡与阈值调优

逻辑回归实战:信用卡欺诈检测中的类别不平衡与阈值调优
简介一份使用逻辑回归算法完成信用卡欺诈检测的机器学习项目面向人工智能初学者和相关专业的高校学生尤其适合正在准备课程设计、期末大作业的人群。项目压缩包共收录3个文件Python源码、CSV信用卡交易数据集和Markdown说明文档整体大小约63.29MB其中源码包含数据读取、缺失值处理、特征标准化、模型训练及混淆矩阵评估等完整环节每行关键代码均有中文注释数据集提供真实欺诈标签样本文档则给出环境配置与运行说明。目前已吸引四百零八人学习下载代码结构清晰、可直接运行能输出准确率、召回率等核心指标。这套被导师认可的高分项目既可作为毕业设计或课程设计的现成方案也可作为学习逻辑回归在金融风控领域实战应用的参考范例。1. 逻辑回归做信用卡欺诈检测为什么这个项目值得你拆一遍做机器学习课程设计的人很多但真正能在答辩现场把“为什么选逻辑回归”讲清楚的不多。这个信用卡欺诈检测项目最打动我的地方在于它不是套一个现成模型跑个准确率就完事而是把数据预处理、类别不平衡处理、模型训练、评估指标这一整条链路都走通了代码里还带注释非常适合当做期末大作业或者毕业设计的底子。数据集用的是经典的 creditcard.csv包含约 28 万个样本特征是 PCA 降维后的数值型变量标签列 Class 中欺诈样本占比极低这正是逻辑回归最容易翻车的场景也是最能体现你水平的场景。如果你正愁课程设计没方向或者想看看带完整文档的机器学习项目长什么样这份资源值得下下来认真过一遍。2. 欺诈检测的数据底子先搞懂 creditcard.csv 里藏着什么2.1 数据字段与匿名化设计的门道creditcard.csv 是学术界和工业界做异常检测最常用的公开数据集之一。每一行代表一笔信用卡交易Time 字段是距离第一笔交易经过的秒数V1 到 V28 是经过 PCA 变换后的特征——原始特征被匿名化处理了这样做的目的是保护用户隐私但也意味着你无法从业务角度逐个解释这些特征的含义。最后两列是 Amount交易金额和 Class标签Class 为 1 表示这笔交易被确认为欺诈0 表示正常交易。这个数据集有一个非常关键的特点极度不平衡。欺诈交易通常只占总样本的 0.17% 左右也就是说 28 万笔交易里大约只有 492 笔是欺诈。如果你直接拿原始数据去训练一个逻辑回归模型模型会把所有样本都预测成正常类因为你只需要把准确率做到 99.8% 以上就“看起来很好”但这种模型在实际场景里毫无用处。我处理这类数据的第一步永远是先统计类别分布确认不平衡比例再决定后续的采样策略。数据读取和分布探查用 Pandas 就能完成项目里 Creditcard_fraud_detection.py 脚本也包含这部分逻辑。我自己习惯先跑一个快速统计确认数据规模、缺失值情况和类别分布再进入建模环节import pandas as pd # 读取数据 df pd.read_csv(creditcard.csv) # 查看前几行确认字段结构 print(df.head()) # 检查是否存在缺失值 print(df.isnull().sum().sum()) # 统计类别分布 print(df[Class].value_counts()) print(f欺诈样本占比: {df[Class].mean():.4f})这段代码做了三件事读入 CSV、确认没有空值干扰建模、算出欺诈样本占比。绝大多数情况下这个数据集是干净的不需要做缺失值填充重点精力应该放在类别不平衡处理上。如果Class的占比和你预期差很多先检查是不是数据文件没下完整。2.2 为什么要对 Amount 和 Time 做标准化原始数据里 V1 到 V28 已经是标准化后的特征基本不需要再处理。但 Amount 和 Time 没有经过同样的变换Amount 的取值范围可能从 0 到几千甚至上万Time 从 0 到 17 万秒左右如果直接把这些原始数值丢给逻辑回归梯度下降的收敛速度会变慢而且数值大的特征容易在损失函数里占据主导地位让模型偏向于依赖交易金额来做判断而不是综合所有特征。标准化的常见做法是用 StandardScaler把每个特征的均值归零、方差归 1。这里有一个很多新手容易忽略的细节一定要先切分训练集和测试集再在训练集上 fit 标准化器最后用同一个标准化器去 transform 测试集。如果先对全量数据做标准化再切分测试集的信息会泄露到训练过程中导致评估结果虚高答辩时被老师一问就露馅。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 切分特征和标签 X df.drop(Class, axis1) y df[Class] # 切分训练集和测试集保持类别比例 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 对数值特征做标准化 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)stratifyy这个参数非常关键它保证训练集和测试集里的欺诈样本占比和原始数据一致。如果不加这个参数随机切分时有可能把测试集里的欺诈样本分得特别少甚至为零导致你根本没法评估模型对欺诈样本的识别能力。random_state42是为了让结果可复现交作业时别人重跑你的代码能得到一模一样的数字这一点在课程设计评审里是加分项。3. 类别不平衡问题逻辑回归在这里最容易“假阳性”翻车3.1 为什么准确率在欺诈检测里是无效指标如果直接用原始不平衡数据训练逻辑回归你会得到一个准确率 99.8% 的模型然后误以为自己做得很好。但真正该看的指标是召回率——在所有真实欺诈交易里模型成功抓出了多少。试想一下如果 492 笔欺诈只被识别出 10 笔召回率只有 2%那剩下的 482 笔欺诈仍然会给银行造成巨大损失99% 的准确率没有意义。适合不平衡分类的评估指标是混淆矩阵、精确率、召回率和 F1 分数。精确率衡量模型预测为欺诈的样本中有多少是真的欺诈召回率衡量真实欺诈中有多少被找出来了。这两个指标天然存在此消彼长的关系F1 分数是它们的调和平均能帮你在两者之间找一个平衡点。项目文档里推荐重点看召回率和 F1因为欺诈检测宁可多报一些可疑交易让人工审核也不能漏掉真实欺诈。3.2 三种常用处理策略下采样、上采样与 class_weight处理不平衡数据有三个主流方向。下采样是从多数类里随机抽取一部分样本让多数类和少数类数量接近这样做训练速度快但会丢弃大量数据模型可能学不到足够的正常交易模式。上采样是用 SMOTE 之类的算法合成新的少数类样本保留全部数据但合成样本可能引入噪声训练时间也更长。还有一个更简单的方法是把逻辑回归的class_weight参数设为balanced让 sklearn 根据类别频率自动调整惩罚权重代价小的类别权重高代价高的类别权重低相当于给少数类“加钱”让优化器更重视它们。我一般先跑一个class_weightbalanced的基线模型看看召回率能到多少再决定要不要做更复杂的采样。项目代码里也提供了类似的思路——先用基线模型建立评估基准再通过调整阈值来优化最终效果。下面是带 class_weight 的逻辑回归训练代码from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, classification_report # 训练带类别权重的逻辑回归 model LogisticRegression(class_weightbalanced, max_iter1000, random_state42) model.fit(X_train_scaled, y_train) # 预测并输出评估指标 y_pred model.predict(X_test_scaled) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))class_weightbalanced是处理这类问题投入产出比最高的单行代码。max_iter在逻辑回归里表示最大迭代次数默认值是 100但在标准化后的数据集上有时需要适当调大否则会报“ConvergenceWarning”警告看到这个警告不要慌把max_iter调到 1000 基本就好了。random_state同样是固定随机种子保证模型初始化的一致性。3.3 模型阈值调整别被默认的 0.5 绑住手脚逻辑回归输出的其实是概率值sklearn 的predict方法默认把概率大于等于 0.5 的样本判为正类。但在欺诈检测场景里0.5 这个阈值往往不是最优的因为欺诈样本太少模型的预测概率普遍偏低默认阈值会漏掉很多真实欺诈。这时候应该看predict_proba输出的概率值然后手动调整阈值。import numpy as np # 获取预测概率第二列是正类欺诈的概率 y_proba model.predict_proba(X_test_scaled)[:, 1] # 手动设置阈值比如 0.3 threshold 0.3 y_pred_custom (y_proba threshold).astype(int) # 输出新的混淆矩阵 print(confusion_matrix(y_test, y_pred_custom)) print(classification_report(y_test, y_pred_custom))把阈值从 0.5 降到 0.3 后模型会把更多概率稍高的样本判为欺诈召回率通常明显上升代价是精确率略微下降。在欺诈检测这个场景里这个代价是值得的——多报几笔正常交易让银行风控人员核查一下远好过漏掉一笔真欺诈。调阈值不是拍脑袋定的你可以挨个试 0.1 到 0.5 之间的几个值对比召回率和精确率的组合然后按业务偏好选出最终阈值。4. 代码执行全流程从读数据到出评估报告4.1 项目文件结构与运行顺序压缩包里的核心文件有三个creditcard.csv 是数据集Creditcard_fraud_detection.py 是主脚本README.md 是说明文档。如果你想做成一份可以答辩的课程设计建议按“读数据 → 探索分布 → 标准化 → 切分数据集 → 训练模型 → 评估指标 → 阈值调优 → 可视化混淆矩阵”这个顺序来组织代码项目主脚本基本也是按这个思路写的。运行环境需要 Python 3.6 以上依赖库包括 Pandas、NumPy、scikit-learn做可视化的话还需要 Matplotlib。如果是在 Jupyter Notebook 里跑建议把每个环节拆成独立 cell如果直接运行.py脚本确保目录下有creditcard.csv文件脚本会用相对路径读取数据。我习惯在项目根目录下执行脚本避免路径出错。4.2 完整训练脚本的逐段拆解下面是一段可以在课程设计中直接使用的完整流程代码从读取数据到输出评估报告一行一行都能讲清楚import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, classification_report # 1. 加载数据 df pd.read_csv(creditcard.csv) # 2. 特征与标签分离 X df.drop(columns[Class]) y df[Class] # 3. 切分数据集保持类别比例 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 4. 标准化特征 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 5. 训练逻辑回归模型 model LogisticRegression(class_weightbalanced, max_iter1000, random_state42) model.fit(X_train_scaled, y_train) # 6. 预测与评估 y_pred model.predict(X_test_scaled) print(classification_report(y_test, y_pred)) print(混淆矩阵:) print(confusion_matrix(y_test, y_pred))这段代码的逻辑非常清晰先做数据准备再做特征工程然后建模评估。train_test_split里的test_size0.3表示用 30% 的数据做测试你可以改成 0.2 或 0.25但要注意测试集太小会导致评估结果波动太大又会让训练数据不足。标准化要把fit和transform分开这个前面强调过答辩时这里是很常见的提问点——如果老师问你训练集和测试集为什么要分别处理答案就是“防止测试集信息泄漏”。4.3 训练时间与硬件要求creditcard.csv 有 28 万行数据、31 个特征规模在机器学习里属于中小型。逻辑回归本身是线性模型计算开销很低普通笔记本 CPU 训练时间通常在几秒到十几秒之间完全不需要 GPU。如果你的电脑跑出几分钟甚至更久大概率是max_iter设得过大或者循环里重复训练了多次模型排查一下代码结构就行。5. 避坑指南逻辑回归做欺诈检测的五个常见翻车点5.1 训练集和测试集共用了同一个标准化器现象训练出来的模型看评估指标非常漂亮但在答辩现场用新数据测试时效果明显下滑。原因先对全量数据做标准化再切分标准化器已经“见过”测试集的信息产生了数据泄漏。解决严格按“先切分、后 fit_transform 训练集、再用同一个 scaler 只 transform 测试集”的顺序执行这属于流程性错误也是最容易被答辩老师抓到的硬伤。5.2 只报 accuracy 不报召回率现象很多人写完代码只输出一个accuracy_score看到 99% 就觉得大功告成。原因没意识到类别不平衡场景下准确率没有参考价值把模型训练成了“全预测为正常”。解决至少要输出混淆矩阵和classification_report重点关注 recall 和 f1-score并在文档里解释为什么准确率不适用。5.3 报 ConvergenceWarning 却不处理现象脚本运行过程中出现ConvergenceWarning: Maximum number of iterations reached但模型还是输出了结果于是直接忽略。原因默认max_iter100不够逻辑回归的优化过程没有收敛。解决把max_iter调大到 1000同时确认特征已经标准化。这个警告在答辩时很显眼不要让它在你的运行日志里出现。5.4 忘了设置随机种子导致结果不可复现现象每次重新运行脚本训练出的模型评估指标都不一样记录实验结果时数值总是对不上。原因训练集切分和模型初始化都有随机性没固定随机种子。解决在train_test_split和LogisticRegression里都加上random_state42让整套流程可复现写实验报告时数据是稳定的。5.5 测试集切分不做分层采样现象多跑几次切分偶尔发现测试集里欺诈样本的数量为 0 或者特别少评估结果忽高忽低。原因默认切分是随机抽的在不平衡数据里少数类样本可能全被分到训练集或全被分到测试集。解决train_test_split中加stratifyy确保切分后训练集和测试集的类别比例与原始数据一致。这是处理不平衡数据的基本常识项目代码里也照这个做法写的。6. 把结果做好看混淆矩阵可视化与答辩口径课程设计答辩时一张清晰的可视化图表比十行文字描述更有说服力。项目里用了 Matplotlib 做可视化我建议至少画两个图一个是混淆矩阵热力图一个是欺诈样本比例分布图。混淆矩阵能直观展示模型漏报和误报的数量分布图能说明数据不平衡问题的严重程度也解释了你为什么不做“全预测为正常”的无脑模型。混淆矩阵可视化的代码很短但很出效果import matplotlib.pyplot as plt import seaborn as sns # 构建混淆矩阵并可视化 cm confusion_matrix(y_test, y_pred) plt.figure(figsize(6, 5)) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabels[Normal, Fraud], yticklabels[Normal, Fraud]) plt.xlabel(Predicted) plt.ylabel(Actual) plt.title(Confusion Matrix - Logistic Regression) plt.show()annotTrue会在每个格子里显示具体数字fmtd表示按整数格式显示。如果你不想引入 seaborn用plt.imshow(cm)也能做但 seaborn 的热力图在答辩投影上更清晰。左下角的数值是“实际欺诈但被预测为正常”的数量也就是漏报数右下角是“实际欺诈且被预测为欺诈”的数量也就是成功抓出的欺诈笔数。讲结果时先说漏报数再说召回率接着解释为了降低漏报把阈值调低了一些但会带来多少误报成本——这个过程能让老师看到你不是只会敲代码而是真在思考业务价值。阈值调优那边还有一个可以加的验证方法画出不同阈值下的召回率和精确率曲线直观展示二者此消彼长的关系。做法是遍历 0.1 到 0.9 的所有阈值计算每个阈值下的两个指标然后绘图。这段代码不长但对“阈值为什么不能拍脑袋定”这个问题是很好的可视化证明。我当时做期末大作业的时候就是靠这张曲线图把阈值选择讲清楚的老师听完没有再追问。从那以后我每次写不平衡分类的项目都会强制走一遍“先看分布、再定基线、最后调阈值”的流程评估指标也永远先看召回率。这份项目无论是做毕设底子还是期末大作业都够你交出一份让导师认可的答案希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。