行業案例 | 數據分析在銀行業應用之欺詐檢測

2022-04-07     CDA數據分析師

原標題:行業案例 | 數據分析在銀行業應用之欺詐檢測

CDA數據分析師 出品

作者:Elena Kosourova

編譯:Mika

在本文中我們將通過探索一個很常見的用例——欺詐檢測,從而了解數據分析在銀行業是如何運用的。

背景介紹

銀行業 是最早應用數據科學技術的領域之一,收集了大量結構化數據。

那麼,數據分析是如何應用於銀行業的呢?

如今,數據已經成為銀行業最寶貴的資產,不僅可以幫助銀行吸引更多的客戶,提高現有客戶的忠誠度,做出更有效的數據驅動的決策,還可以增強業務能力,提高運營效率,改善現有的服務,加強安全性,並通過所有這些行動獲得更多的收入等等。

因此,當下大部分數據相關工作需求來自銀行業,這並不令人驚訝。

數據分析使銀行業能夠成功地執行眾多任務,包括:

  • 投資風險分析
  • 客戶終身價值預測
  • 客戶細分
  • 客戶流失率預測
  • 個性化營銷
  • 客戶情緒分析
  • 虛擬助理和聊天機器人 ……

下面,我們將仔細看看銀行業中最常見的數據分析用例之一。

數據分析在銀行業應用案例:欺詐檢測

除了銀行業,欺詐活動還存在於許多領域。在政府、保險、公共部門、銷售和醫療保健等領域,這都是一個具有挑戰性的問題。也就是說,任何處理大量在線交易的企業都會面臨欺詐風險。

金融犯罪的形式多種多樣,包括欺詐性信用卡交易、偽造銀行支票、逃稅、網絡攻擊、客戶帳戶盜竊、合成身份、詐騙等。

其主要分析技術可分為兩組:

  • 統計學: 統計參數計算、回歸、機率分布、數據匹配
  • 人工智慧(AI): 數據挖掘、機器學習、深度學習

機器學習是欺詐檢測的重要支柱,其工具包提供了兩種方法:

  • 監督方法 :K-近鄰、邏輯回歸、支持向量機、決策樹、隨機森林、時間序列分析、神經網絡等。

目前還沒有通用的機器學習算法用於欺詐檢測。相反,對於現實世界的數據科學用例,通常會測試幾種技術或其組合,計算模型的預測準確性,並選擇最佳方法。

欺詐檢測系統的主要挑戰是迅速適應不斷變化的欺詐模式和欺詐者的策略,並及時發現新的和日益複雜的方案。欺詐案件總是占少數,並且很好地隱藏在真實的交易中。

下面來探討一下使用Python進行信用卡欺詐檢測。

我們將用到 creditcard_data 數據集。

Credit Card Fraud Detection | Kaggle數據集:

https://www.kaggle.com/mlg-ulb/creditcardfraud

該數據集是Kaggle信用卡欺詐檢測數據集的一個修改樣本。原始數據代表了2013年9月兩天內歐洲持卡人擁有信用卡的交易情況。

讓我們讀入數據並快速瀏覽一下。

importpandas aspd

creditcard_data = pd.read_csv( 'creditcard_data.csv', index_col= 0)

print(creditcard_data.info)

print( '\n')

pd.options.display.max_columns = len(creditcard_data)

print(creditcard_data.head( 3))

< class'pandas.core.frame.DataFrame'>

Int64Index: 5050entries, 0to5049

Data columns (total 30columns):

# Column Non- NullCount Dtype

--- ------ -------------- -----

0V1 5050non- nullfloat64

1V2 5050non- nullfloat64

2V3 5050non- nullfloat64

3V4 5050non- nullfloat64

4V5 5050non- nullfloat64

5V6 5050non- nullfloat64

6V7 5050non- nullfloat64

7V8 5050non- nullfloat64

8V9 5050non- nullfloat64

9V10 5050non- nullfloat64

10V11 5050non- nullfloat64

11V12 5050non- nullfloat64

12V13 5050non- nullfloat64

13V14 5050non- nullfloat64

14V15 5050non- nullfloat64

15V16 5050non- nullfloat64

16V17 5050non- nullfloat64

17V18 5050non- nullfloat64

18V19 5050non- nullfloat64

19V20 5050non- nullfloat64

20V21 5050non- nullfloat64

21V22 5050non- nullfloat64

22V23 5050non- nullfloat64

23V24 5050non- nullfloat64

24V25 5050non- nullfloat64

25V26 5050non- nullfloat64

26V27 5050non- nullfloat64

27V28 5050non- nullfloat64

28Amount 5050non- nullfloat64

29Class5050non- nullint64

dtypes: float64( 29), int64( 1)

memory usage: 1.2MB

V1 V2 V3 V4 V5 V6 V7 \

01.725265-1.337256-1.012687-0.361656-1.431611-1.098681-0.842274

10.683254-1.6818750.533349-0.326064-1.4556030.101832-0.520590

21.067973-0.6566671.0297380.253899-1.1727150.073232-0.745771

V8 V9 V10 V11 V12 V13 V14 \

0-0.026594-0.0324090.2151131.618952-0.654046-1.442665-1.546538

10.114036-0.6017600.4440111.5215700.499202-0.127849-0.237253

20.2498031.383057-0.483771-0.7827800.005242-1.273288-0.269260

V15 V16 V17 V18 V19 V20 V21 \

0-0.2300081.7855391.4197930.0716660.2330310.2759110.414524

1-0.7523510.6671900.724785-1.7366150.7020880.6381860.116898

20.091287-0.3479730.495328-0.9259490.099138-0.083859-0.189315

V22 V23 V24 V25 V26 V27 V28 \

00.7934340.0288870.419421-0.367529-0.155634-0.0157680.010790

1-0.304605-0.1255470.2448480.069163-0.460712-0.0170680.063542

2-0.4267430.0795390.1296920.0027780.970498-0.0350560.017313

Amount Class

0189.000

1315.170

259.980

數據集包含以下變量:

  • 數值編碼的變量V1到V28是從PCA變換中獲得的主分量。由於保密問題,未提供有關原始功能的背景信息。
  • Amount變量表示交易金額。
  • Class變量顯示交易是否為欺詐(1)或非欺詐(0)。

幸運的是,就其性質而言,欺詐事件在任何交易列表中都是極少數。然而,當數據集中包含的不同類別或多或少存在時,機器學習算法通常效果最好。否則,就沒有什麼數據可供借鑑,這個問題被稱為類別不均。

接著計算欺詐交易占數據集中交易總數的百分比:

round(creditcard_data[ 'Class'].value_counts* 100/ len(creditcard_data)).convert_dtypes

099

11

Name: Class, dtype: Int64

並創建一個圖表,將欺詐與非欺詐的數據點可視化。

importmatplotlib.pyplot asplt

importnumpy asnp

defprep_data(df):

X = df.iloc[:, 1: 28]

X = np.array(X).astype(float)

y = df.iloc[:, 29]

y = np.array(y).astype(float)

returnX, y

defplot_data(X, y):

plt.scatter(X[y== 0, 0], X[y== 0, 1], label= 'Class #0', alpha= 0.5, linewidth= 0.15)

plt.scatter(X[y== 1, 0], X[y== 1, 1], label= 'Class #1', alpha= 0.5, linewidth= 0.15, c= 'r')

plt.legend

returnplt.show

X, y = prep_data(creditcard_data)

plot_data(X, y)

可以確認的是,欺詐性交易的比例非常低,當中存在一個類別不平衡問題的案例。

為了解決這個問題,我們可以使用合成少數人超抽樣技術(SMOTE)來重新平衡數據。與隨機超額取樣不同,SMOTE稍微複雜一些,因為它不只是創建觀察值的精確副本。

相反,它使用欺詐案件的最近鄰居的特徵來創建新的、合成的樣本,這些樣本與少數人類別中的現有觀察值相當相似,讓我們把SMOTE應用於該信用卡數據。

fromimblearn.over_sampling importSMOTE

method = SMOTE

X_resampled, y_resampled = method.fit_resample(X, y)

plot_data(X_resampled, y_resampled)

正如所看到的,使用SMOTE突然提供了更多的少數類別的觀察結果。為了更好地看到這種方法的結果,這裡將把其與原始數據進行比較。

defcompare_plot(X, y, X_resampled, y_resampled, method):

f, (ax1, ax2) = plt.subplots( 1, 2)

c0 = ax1.scatter(X[y== 0, 0], X[y== 0, 1], label= 'Class #0',alpha= 0.5)

c1 = ax1.scatter(X[y== 1, 0], X[y== 1, 1], label= 'Class #1',alpha= 0.5, c= 'r')

ax1.set_title( 'Original set')

ax2.scatter(X_resampled[y_resampled== 0, 0], X_resampled[y_resampled== 0, 1], label= 'Class #0', alpha= .5)

ax2.scatter(X_resampled[y_resampled== 1, 0], X_resampled[y_resampled== 1, 1], label= 'Class #1', alpha= .5,c= 'r')

ax2.set_title(method)

plt.figlegend((c0, c1), ( 'Class #0', 'Class #1'), loc= 'lower center', ncol= 2, labelspacing= 0.)

plt.tight_layout(pad= 3)

returnplt.show

print( f'Original set:\n'

f' {pd.value_counts(pd.Series(y))}\n\n'

f'SMOTE:\n'

f' {pd.value_counts(pd.Series(y_resampled))}\n' )

compare_plot(X, y, X_resampled, y_resampled, method= 'SMOTE')

Originalset:

0 .05000

1 .050

dtype: int64

SMOTE:

0 .05000

1 .05000

dtype: int64

因此,SMOTE方法已經完全平衡了數據,少數群體現在與多數群體的規模相等。

例如,此類規則可能涉及不尋常的交易地點或可疑的頻繁交易。其想法是基於常見的統計數據定義閾值,通常是基於觀察值的平均值,並在功能上使用這些閾值來檢測欺詐。

print(creditcard_data.groupby( 'Class').mean.round( 3) [['V1', 'V3']])

V1V3

Class

0 0 .0350 .037

1 -4.985-7.294

在特殊情況下,可以應用以下條件:V1<-3和V3<-5。然後,為了評估這種方法的性能,我們將把標記的欺詐案例與實際案例進行比較:

creditcard_data[ 'flag_as_fraud'] = np.where(np.logical_and(creditcard_data[ 'V1']<-3, creditcard_data[ 'V3']<-5), 1, 0)

print(pd.crosstab(creditcard_data[ 'Class'], creditcard_data[ 'flag_as_fraud'], rownames=[ 'Actual Fraud'], colnames=[ 'Flagged Fraud']))

FlaggedFraud 01

Actual Fraud

0498416

12822

fromsklearn.model_selection importtrain_test_split

fromsklearn.linear_model importLogisticRegression

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.3, random_state= 0)

lr = LogisticRegression

lr.fit(X_train, y_train)

predictions = lr.predict(X_test)

print(pd.crosstab(y_test, predictions, rownames=[ 'Actual Fraud'], colnames=[ 'Flagged Fraud']))

FlaggedFraud0 .01 .0

ActualFraud

0 .01504 1

1 .01 9

需要注意的是,在混淆矩陣中要查看的觀測值較少,因為我們只使用測試集來計算模型結果,即僅占整個數據集的30%。

結果是發現了更高比例的欺詐案件:90%(9/10),而之前的結果是44%(22/50),得到的誤報也比以前少了很多,這是一個進步。

現在讓我們回到前面討論的類不平衡問題,並探索是否可以通過將邏輯回歸模型與SMOTE重採樣方法相結合來進一步提高預測結果。為了高效、一次性地完成這項工作,我們需要定義一個管道,並在數據上運行:

from imblearn.pipeline import Pipeline

# Defining which resampling method and which ML model to use in the pipeline

resampling = SMOTE

lr = LogisticRegression

pipeline = Pipeline([('SMOTE', resampling), ('Logistic Regression', lr)])

pipeline.fit(X_train, y_train)

predictions = pipeline.predict(X_test)

print(pd.crosstab(y_test, predictions, rownames=['Actual Fraud'], colnames=['Flagged Fraud']))

FlaggedFraud0 .01 .0

ActualFraud

0 .01496 9

1 .01 9

可以看到,在案例中,SMOTE並沒有帶來任何改進:仍然捕獲了90%的欺詐事件,而且假陽性數量略高。

這裡的解釋是,重新取樣不一定在所有情況下都能帶來更好的結果。當欺詐案件在數據中非常分散時,其最近的不一定也是欺詐案件,所以使用SMOTE會引入偏見問題。

為了提高邏輯回歸模型的準確性,我們可以調整一些算法參數,也可以考慮採用K-fold交叉驗證法,而不是直接將數據集分成兩部分。

最後,還可以嘗試一些其他的機器學習算法(如決策樹或隨機森林),看看它們是否能給出更好的結果。

參考連結:

https://www.datacamp.com/blog/data-science-in-banking

好,以上就是今天的分享。如果大家還有數據分析方面相關的疑問,就在評論區留言。

更多精彩案例敬請關注4月7日直播,現在掃碼免費預約~

直播預告

預約直播

點這裡關注我,記得標星哦~

CDA課程諮詢

文章來源: https://twgreatdaily.com/7530b214e097a4691d6e5f311d56be1a.html