一、數據讀取與初步觀察
首先,使用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))
通過調整閾值,可以在精確率和召回率之間進行權衡,根據實際業務需求選擇最合適的閾值,以達到更好的欺詐檢測效果。
八、總結
本文通過對信用卡交易數據集的處理,詳細展示了從數據預處理、樣本不均衡處理、模型調優到閾值調整的完整流程。在實際應用中,還可以嘗試其他機器學習算法(如隨機森林、支持向量機等),或者結合集成學習方法進一步提升模型的性能。同時,隨著數據的不斷更新和業務場景的變化,持續優化模型也是保障信用卡欺詐檢測準確性的關鍵。希望本文的實踐經驗能夠為從事金融風控領域的讀者提供有益的參考。