过采样处理
一、数据读取与初步观察
首先,使用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.timeprint("{} 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] = 1y_predict_proba[y_predict_proba[[1]] <= i] = 0recall = metrics.recall_score(os_y_train, y_predict_proba[1])recalls.append(recall)print("{} Recall metric in the testing dataset: {:.3f}".format(i, recall))
通过调整阈值,可以在精确率和召回率之间进行权衡,根据实际业务需求选择最合适的阈值,以达到更好的欺诈检测效果。
八、总结
本文通过对信用卡交易数据集的处理,详细展示了从数据预处理、样本不均衡处理、模型调优到阈值调整的完整流程。在实际应用中,还可以尝试其他机器学习算法(如随机森林、支持向量机等),或者结合集成学习方法进一步提升模型的性能。同时,随着数据的不断更新和业务场景的变化,持续优化模型也是保障信用卡欺诈检测准确性的关键。希望本文的实践经验能够为从事金融风控领域的读者提供有益的参考。