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
相关产品推荐
相关产品推荐

