过采样处理

一、数据读取与初步观察

首先,使用pandas库读取信用卡交易数据集:

复制代码
data = pd.read_csv(r"./creditcard.csv")
print(data.head())

通过head()方法查看数据集的前几行,初步了解数据的结构和内容。该数据集包含交易时间、交易金额、多个匿名特征以及交易是否为欺诈(Class,0 表示正常交易,1 表示欺诈交易)等信息。

二、数据标准化

由于数据集中的Amount列数值范围差异较大,为了提高模型的训练效果和收敛速度,需要对其进行标准化处理:

复制代码
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])
print(data.head())

StandardScaler会将数据标准化为均值为 0,标准差为 1 的分布,使得不同特征之间具有可比性。

三、数据清洗与特征选择

数据集中的Time列对于欺诈检测的实际意义不大,因此将其删除:

复制代码
data = data.drop(['Time'], axis=1)

同时,为了确保图表能够正确显示中文,设置matplotlib的字体:

复制代码
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False

四、样本不均衡问题分析

查看数据集中正负样本(正常交易与欺诈交易)的数量分布:

复制代码
lables_count = pd.value_counts(data['Class'])
print(lables_count)

# 绘制正负样本数量柱状图
plt.title("正负例样本数")
plt.xlabel("类别")
plt.ylabel("频数")
lables_count.plot(kind='bar')
plt.show()

结果显示,数据集中正常交易的数量远远多于欺诈交易,存在严重的样本不均衡问题。这种不均衡可能导致模型在训练过程中更倾向于学习正常交易的特征,从而对欺诈交易的识别能力不足。

五、数据划分与过采样处理

将数据集划分为训练集和测试集:

复制代码
X = data.drop(['Class'], axis=1)
y = data['Class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

为了解决样本不均衡问题,使用SMOTE( Synthetic Minority Over-sampling Technique)算法对训练集进行过采样:

复制代码
oversampler = SMOTE(random_state=0)
os_x_train, os_y_train = oversampler.fit_resample(X_train, y_train)

SMOTE算法通过合成少数类样本,增加了训练集中欺诈交易样本的数量,使得正负样本比例更加均衡,有助于提升模型对少数类样本的识别能力。

六、逻辑回归模型调优

6.1 超参数搜索

逻辑回归模型中的超参数C(正则化强度的倒数)对模型性能有着重要影响。为了找到最优的C值,采用交叉验证的方式进行搜索:

复制代码
scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]
for i in c_param_range:
    start_time = time.time()
    lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=2000)
    score = cross_val_score(lr, os_x_train, os_y_train, cv=8, scoring='recall')
    score_mean = sum(score) / len(score)
    scores.append(score_mean)
    end_time = time.time
    print("{} time speed :{:.2f}".format(end_time - start_time))
print("recall:}".format(score_mean))

best_c = c_param_range[np.argmax(scores)]
print("最优惩罚因子为:{}".format(best_c))

在上述代码中,遍历不同的C值,使用 8 折交叉验证评估模型在训练集上的召回率(recall),选择召回率最高的C值作为最优超参数。召回率在欺诈检测中尤为重要,它衡量了模型正确识别出欺诈交易的能力。

6.2 模型训练与评估

使用最优的超参数训练逻辑回归模型,并在训练集和测试集上进行评估:

复制代码
lr = LogisticRegression(C=best_c, penalty='l2', solver='lbfgs', max_iter=1000)
lr.fit(os_x_train, os_y_train)

train_predicted = lr.predict(os_x_train)
print(metrics.classification_report(os_y_train, train_predicted))

test_predicted = lr.predict(os_x_test_w)
print(metrics.classification_report(os_y_test_w, test_predicted))

test_predicted_big = lr.predict(x_test_w)
print(metrics.classification_report(y_test_w, test_predicted_big))

通过classification_report输出模型在训练集和测试集上的精确率、召回率、F1 值等评估指标,全面了解模型的性能表现。

七、阈值调整

逻辑回归模型默认以 0.5 作为分类阈值,但在样本不均衡的情况下,调整阈值可能会进一步提升模型性能。尝试不同的阈值,并计算对应的召回率:

复制代码
lr = LogisticRegression(C=best_c, penalty='l2')
lr.fit(os_x_train, os_y_train)

thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
recalls = []
for i in thresholds:
    y_predict_proba = lr.predict_proba(os_x_train)
    y_predict_proba = pd.DataFrame(y_predict_proba)
    y_predict_proba = y_predict_proba.drop([0], axis=1)
    y_predict_proba[y_predict_proba[[1]] > i] = 1
    y_predict_proba[y_predict_proba[[1]] <= i] = 0

    recall = metrics.recall_score(os_y_train, y_predict_proba[1])
    recalls.append(recall)
    print("{} Recall metric in the testing dataset: {:.3f}".format(i, recall))

通过调整阈值,可以在精确率和召回率之间进行权衡,根据实际业务需求选择最合适的阈值,以达到更好的欺诈检测效果。

八、总结

本文通过对信用卡交易数据集的处理,详细展示了从数据预处理、样本不均衡处理、模型调优到阈值调整的完整流程。在实际应用中,还可以尝试其他机器学习算法(如随机森林、支持向量机等),或者结合集成学习方法进一步提升模型的性能。同时,随着数据的不断更新和业务场景的变化,持续优化模型也是保障信用卡欺诈检测准确性的关键。希望本文的实践经验能够为从事金融风控领域的读者提供有益的参考。

相关推荐
xrgs_shz1 分钟前
签名去背景图像处理实例
图像处理·人工智能
点云SLAM31 分钟前
C++ 中二级指针的正确释放方法
开发语言·数据结构·c++·人工智能·算法
瑶光守护者36 分钟前
【学习笔记】深度学习:典型应用
人工智能·笔记·深度学习·学习·计算机视觉·语音识别
※DX3906※44 分钟前
小土堆pytorch--tensorboard的使用
人工智能·pytorch·python
xiangzhihong81 小时前
DeepSeek-Prover-V2,DeepSeek推出的开源数学推理大模型
人工智能·深度学习·机器学习
不爱吃于先生1 小时前
自监督学习(Self-supervised Learning)李宏毅
人工智能·学习·机器学习
Mu先生Ai世界1 小时前
探寻适用工具:AI+3D 平台与工具的关键能力及选型考量 (AI+3D 产品经理笔记 S2E03)
人工智能·游戏·3d·ai·aigc·产品经理·vr
liaokailin1 小时前
Spring AI 实战:第七章、Spring AI Advisor机制之记忆大师
人工智能·spring·oracle
deephub1 小时前
防止交叉验证中的数据泄露:提升模型在实际环境中的性能
人工智能·深度学习·机器学习·数据泄露·交叉验证
说私域2 小时前
基于开源AI大模型AI智能名片S2B2C商城小程序源码的私域流量稳定性构建研究
人工智能·小程序·开源·零售