You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras信用卡欺诈预测模型准确率异常问题求助

信用卡欺诈预测高准确率问题的排查与解决

兄弟,你这个情况太典型了——信用卡欺诈数据集本身就是极度不平衡的,正常样本占比几乎99%以上,欺诈样本可能连1%都不到。模型只要无脑把所有样本都预测成“正常”,准确率就能轻松冲到99%左右,这根本不是模型学会了识别欺诈,纯粹是钻了数据分布的空子而已。

给你一步步拆解问题和解决思路:

1. 先确认数据集的类别分布

先跑段代码看看两类样本的真实占比,你肯定会发现问题:

df = pd.read_csv('creditcard.csv')
# 查看两类样本数量
print(df['Class'].value_counts())
# 查看占比
print(df['Class'].value_counts(normalize=True))

不出意外的话,Class=0(正常交易)的占比会超过99%,Class=1(欺诈)的占比极低。这就是高准确率的真相——准确率在不平衡数据集里完全是个误导性指标。

2. 立刻换掉评估指标

别再盯着准确率看了,改用这些能反映模型真实性能的指标:

  • 精确率(Precision):模型预测为欺诈的样本里,真欺诈的比例(避免误判正常用户)
  • 召回率(Recall):所有真实欺诈样本中,被模型抓出来的比例(尽量不漏掉欺诈)
  • F1分数:精确率和召回率的调和平均,综合两者表现
  • AUC-ROC:衡量模型区分正负样本的能力
  • 混淆矩阵:直观看到真阳性、假阳性、真阴性、假阴性的数量

在Keras里可以这么加这些指标:

from keras import metrics

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=[metrics.Precision(name='precision'),
                       metrics.Recall(name='recall'),
                       metrics.AUC(name='auc')])

训练时看这些指标的变化,才是判断模型好坏的关键。

3. 处理不平衡数据集的核心方法

方法一:重采样平衡数据

  • 过采样:对少数类(欺诈样本)生成合成样本(比如用SMOTE算法),或者直接复制少数类样本,让两类数量接近
  • 欠采样:随机删除多数类(正常样本),减少其数量来平衡分布

举个SMOTE过采样的例子:

from imblearn.over_sampling import SMOTE

X = df.drop('Class', axis=1)
y = df['Class']
# 生成合成的欺诈样本
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
# 用重采样后的数据集训练模型

方法二:给损失函数加权重

在模型编译时,给少数类设置更高的损失权重,让模型更重视少数类的错误:

# 计算权重:多数类数量 / 少数类数量
class_weight = {0: 1, 1: len(df[df['Class']==0])/len(df[df['Class']==1])}

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=[metrics.Precision(name='precision'),
                       metrics.Recall(name='recall')])

# 训练时传入权重参数
model.fit(X_train, y_train, class_weight=class_weight, epochs=10, batch_size=32)

这样模型预测错欺诈样本时,会受到更大的惩罚,迫使它去学习少数类的特征。

方法三:换用适合不平衡数据的模型

比如XGBoost、LightGBM这类自带不平衡数据处理参数的模型,或者用异常检测思路(把欺诈当成异常点),比如Isolation Forest算法。

4. 检查数据预处理是否到位

最后别忘了确认你的数据预处理有没有做对:

  • 信用卡数据集里的Time和Amount特征尺度和其他PCA处理后的特征差异极大,必须做标准化/归一化
  • 有没有正确分离特征和标签,训练集有没有打乱(避免训练集全是正常样本)

举个标准化的例子:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['Time'] = scaler.fit_transform(df['Time'].values.reshape(-1,1))
df['Amount'] = scaler.fit_transform(df['Amount'].values.reshape(-1,1))

总之,别再被高准确率迷惑了,不平衡数据集里准确率是最没用的指标之一,赶紧换成上面的评估指标,再结合数据平衡方法,才能训练出真正能识别欺诈的模型。

内容的提问来源于stack exchange,提问作者Robin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:37:37