<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【深度學(xué)習(xí)】基于深度學(xué)習(xí)Autoencoder的信用卡欺詐異常檢測(cè),效果非常牛逼

          共 8629字,需瀏覽 18分鐘

           ·

          2022-06-13 01:06

          大家好,我是小伍哥,今天接著搞異常檢測(cè)。異常檢測(cè)斷斷續(xù)續(xù)寫了好幾篇的,合集請(qǐng)看:異常檢測(cè)算法匯總

          深度學(xué)習(xí)用于異常檢測(cè),效果還是相當(dāng)牛逼的。信用卡欺詐數(shù)據(jù)集,在孤立森林上能做到26%的top1000準(zhǔn)確率,但是在Autoencoder算法上,最高做到了33.6%,但是這個(gè)數(shù)據(jù)很不穩(wěn)定,有時(shí)候只有25%左右,但是至少這個(gè)模型潛力巨大,需要更多的試驗(yàn),找到更穩(wěn)定的網(wǎng)絡(luò)結(jié)構(gòu)。

          自編碼器(AutoEncoder, AE)是一類在半監(jiān)督學(xué)習(xí)和非監(jiān)督學(xué)習(xí)中使用的人工神經(jīng)網(wǎng)絡(luò),其功能是通過(guò)將輸入信息作為學(xué)習(xí)目標(biāo),對(duì)輸入信息進(jìn)行表征學(xué)習(xí)(representation learning),自編碼器包含編碼器(encoder)解碼器(decoder)兩部分  。

          AutoEncoder是深度學(xué)習(xí)的一個(gè)重要內(nèi)容,并且非常有意思,神經(jīng)網(wǎng)絡(luò)通過(guò)大量數(shù)據(jù)集,進(jìn)行end-to-end的訓(xùn)練,不斷提高其準(zhǔn)確率,而AutoEncoder通過(guò)設(shè)計(jì)encode和decode過(guò)程使輸入和輸出越來(lái)越接近,是一種無(wú)監(jiān)督學(xué)習(xí)過(guò)程,可以被應(yīng)用于降維(dimensionality reduction)和異常值檢測(cè)(anomaly detection),包含卷積層構(gòu)筑的自編碼器可被應(yīng)用于計(jì)算機(jī)視覺(jué)問(wèn)題,包括圖像降噪(image denoising)  、神經(jīng)風(fēng)格遷移(neural style transfer)等  ,本文主要講解如何利用AutoEncoder進(jìn)行異常檢測(cè)試驗(yàn)。

          用AutoEncoder進(jìn)行降噪,可以看到通過(guò)卷積自編碼器,我們的降噪效果還是非常好的,最終生成的圖片看起來(lái)非常順滑,噪聲也幾乎看不到了。

          用AutoEncoder進(jìn)行降維。


          一、Autoencoder結(jié)構(gòu)簡(jiǎn)介

          Autoencoder本質(zhì)上它使用了一個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)產(chǎn)生一個(gè)高維輸入的低維表,Autoencoder與主成分分析PCA類似,但是Autoencoder在使用非線性激活函數(shù)時(shí)克服了PCA線性的限制。

          Autoencoder包含兩個(gè)主要的部分,encoder(編碼器)和 decoder(解碼器)。Encoder的作用是用來(lái)發(fā)現(xiàn)給定數(shù)據(jù)的壓縮表示,decoder是用來(lái)重建原始輸入。在訓(xùn)練時(shí),decoder 強(qiáng)迫 autoencoder 選擇最有信息量的特征,最終保存在壓縮表示中。最終壓縮后的表示就在中間的coder層當(dāng)中。

          以下圖為例,原始數(shù)據(jù)的維度是10,encoder和decoder分別有兩層,中間的coder共有3個(gè)節(jié)點(diǎn),也就是說(shuō)原始數(shù)據(jù)被降到了只有3維。Decoder根據(jù)降維后的數(shù)據(jù)再重建原始數(shù)據(jù),重新得到10維的輸出。從Input到Ouptut的這個(gè)過(guò)程中,autoencoder實(shí)際上也起到了降噪的作用。


          二、Autoencoder異常檢測(cè)流程

          異常檢測(cè)(anomaly detection)通常分為有監(jiān)督和無(wú)監(jiān)督兩種情形。在無(wú)監(jiān)督的情況下,我們沒(méi)有異常樣本用來(lái)學(xué)習(xí),而算法的基本上假設(shè)是異常點(diǎn)服從不同的分布。根據(jù)正常數(shù)據(jù)訓(xùn)練出來(lái)的Autoencoder,能夠?qū)⒄颖局亟ㄟ€原,但是卻無(wú)法將異于正常分布的數(shù)據(jù)點(diǎn)較好地還原,導(dǎo)致還原誤差較大。

          如果樣本的特征都是數(shù)值變量,我們可以用MSE或者M(jìn)AE作為還原誤差。例如上圖,如果輸入樣本為

          經(jīng)過(guò)Autoencoder重建的結(jié)果為

          還原誤差MSE為

          還原誤差MAE為


          三、模型算法過(guò)程

          數(shù)據(jù)還是使用信用卡的數(shù)據(jù),數(shù)據(jù)來(lái)自于kaggle上的一個(gè)信用卡欺詐檢測(cè)比賽,數(shù)據(jù)質(zhì)量高,正負(fù)樣本比例非常懸殊,很典型的異常檢測(cè)數(shù)據(jù)集,在這個(gè)數(shù)據(jù)集上來(lái)測(cè)試一下各種異常檢測(cè)手段的效果。當(dāng)然,可能換個(gè)數(shù)據(jù)集結(jié)果就會(huì)有很大不同,結(jié)果僅供參考。

          1、數(shù)據(jù)集介紹

          信用卡欺詐是指故意使用偽造、作廢的信用卡,冒用他人的信用卡騙取財(cái)物,或用本人信用卡進(jìn)行惡意透支的行為,信用卡欺詐形式分為3種:失卡冒用、假冒申請(qǐng)、偽造信用卡。欺詐案件中,有60%以上是偽造信用卡詐騙,其特點(diǎn)是團(tuán)伙性質(zhì),從盜取卡資料、制造假卡、販賣假卡,到用假卡作案,牟取暴利。而信用卡欺詐檢測(cè)是銀行減少損失的重要手段。

          該數(shù)據(jù)集包含歐洲持卡人于 2013 年 9 月通過(guò)信用卡進(jìn)行的交易信息。此數(shù)據(jù)集顯示的是兩天內(nèi)發(fā)生的交易,在 284807 筆交易中,存在 492 起欺詐,數(shù)據(jù)集高度不平衡,正類(欺詐)僅占所有交易的 0.172%。原數(shù)據(jù)集已做脫敏處理和PCA處理,匿名變量V1, V2, ...V28 是 PCA 獲得的主成分,唯一未經(jīng)過(guò) PCA 處理的變量是 Time 和 Amount。Time 是每筆交易與數(shù)據(jù)集中第一筆交易之間的間隔,單位為秒;Amount 是交易金額。Class 是分類變量,在發(fā)生欺詐時(shí)為1,否則為0。項(xiàng)目要求根據(jù)現(xiàn)有數(shù)據(jù)集建立分類模型,對(duì)信用卡欺詐行為進(jìn)行檢測(cè)。

          注:PCA - "Principal Component Analysis" - 主成分分析,用于提取數(shù)據(jù)集的"主成分"特征,即對(duì)數(shù)據(jù)集進(jìn)行降維處理。

          2、數(shù)據(jù)來(lái)源

          數(shù)據(jù)集 Credit Card Fraud Detection 由比利時(shí)布魯塞爾自由大學(xué)(ULB) - Worldline and the Machine Learning Group 提供。可從Kaggle上下載:https://www.kaggle.com/mlg-ulb/creditcardfraud

          不想自己下載數(shù)據(jù)的,后臺(tái)回復(fù)【信用卡欺詐】領(lǐng)取。

          3、模型搭建

          需要的包比較多,我們先加載下

          # 加載所需要的包import warningswarnings.filterwarnings("ignore")import os import pandas as pd import numpy as np import matplotlib.pyplot as plt#plt.style.use('seaborn')import tensorflow as tfimport seaborn as snsfrom sklearn.model_selection import train_test_splitfrom keras.models import Model, load_modelfrom keras.layers import Input, Dense,LeakyReLU,BatchNormalizationfrom keras.callbacks import ModelCheckpointfrom keras import regularizersfrom sklearn.preprocessing import StandardScalerfrom sklearn.metrics import roc_curve, auc, precision_recall_curve# 工作空間設(shè)置os.chdir('/Users/wuzhengxiang/Documents/DataSets/CreditCardFraudDetection')os.getcwd()

          數(shù)據(jù)讀取和簡(jiǎn)單的特征工程

          # 讀取數(shù)據(jù)d = pd.read_csv('creditcard.csv')
          # 查看樣本比例num_nonfraud = np.sum(d['Class'] == 0)num_fraud = np.sum(d['Class'] == 1)plt.bar(['Fraud', 'non-fraud'], [num_fraud, num_nonfraud], color='dodgerblue')plt.show()
          # 刪除時(shí)間列,對(duì)Amount進(jìn)行標(biāo)準(zhǔn)化data = d.drop(['Time'], axis=1)data['Amount'] = StandardScaler().fit_transform(data[['Amount']])X = data.drop(['Class'],axis=1)Y = data.Class

          模型搭建+模型訓(xùn)練

          # 設(shè)置Autoencoder的參數(shù)input_dim = X.shape[1]encoding_dim = 128num_epoch = 30batch_size = 256
          input_layer = Input(shape=(input_dim, ))
          encoder = Dense(encoding_dim, activation="tanh", activity_regularizer=regularizers.l1(10e-5) )(input_layer)encoder =BatchNormalization()(encoder)encoder=LeakyReLU(alpha=0.2)(encoder)
          encoder = Dense(int(encoding_dim/2), activation="relu" )(encoder)encoder =BatchNormalization()(encoder)encoder=LeakyReLU(alpha=0.1)(encoder)
          encoder = Dense(int(encoding_dim/4), activation="relu" )(encoder)encoder =BatchNormalization()(encoder)


          ### decoderdecoder = LeakyReLU(alpha=0.1)(encoder)decoder = Dense(int(encoding_dim/4), activation='tanh' )(decoder)decoder = BatchNormalization()(decoder)decoder = LeakyReLU(alpha=0.1)(decoder)

          decoder = Dense(int(encoding_dim/2), activation='tanh' )(decoder)decoder = BatchNormalization()(decoder)decoder = LeakyReLU(alpha=0.1)(decoder)
          decoder = Dense(input_dim, #activation='relu' )(decoder)
          autoencoder = Model(inputs = input_layer, outputs = decoder )autoencoder.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae','mse'] )
          # 模型保存為 XiaoWuGe_model.h5,并開(kāi)始訓(xùn)練模型checkpointer = ModelCheckpoint(filepath="XiaoWuGe_model.h5", verbose=0, save_best_only=True )history = autoencoder.fit(X, X, epochs=num_epoch, batch_size=batch_size, shuffle=True, #validation_data=(X_test, X_test), verbose=1, callbacks=[checkpointer] ).historyEpoch 1/30284807/284807 [==============================] - 39s 136us/step - loss: 0.6593 - mae: 0.3893 - mse: 0.4098Epoch 2/30Epoch 29/30284807/284807 [==============================] - 41s 144us/step - loss: 0.1048 - mae: 0.1188 - mse: 0.0558Epoch 30/30284807/284807 [==============================] - 39s 135us/step - loss: 0.0891 - mae: 0.1134 - mse: 0.0495


          模型結(jié)果可視化
          # 畫出損失函數(shù)曲線plt.figure(figsize=(14, 5))plt.subplot(121)plt.plot(history['loss'], c='dodgerblue', lw=3)plt.title('model loss')plt.ylabel('mse')plt.xlabel('epoch')plt.legend(['train'], loc='upper right')

          # 畫出損失函數(shù)曲線plt.figure(figsize=(14, 5))plt.subplot(121)plt.plot(history['mae'], c='dodgerblue', lw=3)plt.title('model mae')plt.ylabel('mae')plt.xlabel('epoch')plt.legend(['train'], loc='upper right')
          # 畫出損失函數(shù)曲線plt.figure(figsize=(14, 5))plt.subplot(121)plt.plot(history['mse'], c='dodgerblue', lw=3)plt.title('model mse')plt.ylabel('mse')plt.xlabel('epoch')plt.legend(['train'], loc='upper right')

          模型結(jié)果預(yù)測(cè)

          #利用訓(xùn)練好的autoencoder重建測(cè)試集pred_X  = autoencoder.predict(X)# 計(jì)算還原誤差MSE和MAEmse_X = np.mean(np.power(X-pred_X,2), axis=1)mae_X = np.mean(np.abs(X-pred_X),     axis=1)

          data['mse_X'] = mse_Xdata['mae_X'] = mae_X# TopN準(zhǔn)確率評(píng)估n = 1000df = data.sort_values(by='mae_X',ascending=False)df = df.head(n)rate = df[df['Class']==1].shape[0]/nprint('Top{}的準(zhǔn)確率為:{}'.format(n,rate))
          Top1000的準(zhǔn)確率為:0.336

          可以看到,我們的準(zhǔn)確率為0.336,比之前的孤立森林又有了很大的提高,但是我經(jīng)過(guò)了比較多的試驗(yàn),這是比較理想的結(jié)果。后期我會(huì)找個(gè)更加穩(wěn)定的結(jié)構(gòu)分享給大家,下面我可以可以看看,正樣本和負(fù)樣本的一個(gè)分布差異。

          # 提取負(fù)樣本,并且按照7:3切成訓(xùn)練集和測(cè)試集mask = (data['Class'] == 0)X_train, X_test = train_test_split(X, test_size=0.3,                                   random_state=520)
          # 提取所有正樣本,作為測(cè)試集的一部分X_fraud = X[~mask]

          # 利用訓(xùn)練好的autoencoder重建測(cè)試集pred_test = autoencoder.predict(X_test)pred_fraud = autoencoder.predict(X_fraud)

          # 計(jì)算還原誤差MSE和MAEmse_test = np.mean(np.power(X_test - pred_test, 2), axis=1)mse_fraud = np.mean(np.power(X_fraud - pred_fraud, 2), axis=1)mae_test = np.mean(np.abs(X_test - pred_test), axis=1)mae_fraud = np.mean(np.abs(X_fraud - pred_fraud), axis=1)mse_df = pd.DataFrame()mse_df['Class'] = [0] * len(mse_test) + [1] * len(mse_fraud)mse_df['MSE'] = np.hstack([mse_test, mse_fraud])mse_df['MAE'] = np.hstack([mae_test, mae_fraud])mse_df = mse_df.sample(frac=1).reset_index(drop=True)

          # 分別畫出測(cè)試集中正樣本和負(fù)樣本的還原誤差MAE和MSEmarkers = ['o', '^']markers = ['o', '^']colors = ['dodgerblue', 'red']labels = ['Non-fraud', 'Fraud']
          plt.figure(figsize=(14, 5))plt.subplot(121)for flag in [1, 0]: temp = mse_df[mse_df['Class'] == flag] plt.scatter(temp.index, temp['MAE'], alpha=0.7, marker=markers[flag], c=colors[flag], label=labels[flag])plt.title('Reconstruction MAE')plt.ylabel('Reconstruction MAE')plt.xlabel('Index')
          plt.subplot(122)for flag in [1, 0]: temp = mse_df[mse_df['Class'] == flag] plt.scatter(temp.index, temp['MSE'], alpha=0.7, marker=markers[flag], c=colors[flag], label=labels[flag])plt.legend(loc=[1, 0], fontsize=12)plt.title('Reconstruction MSE')plt.ylabel('Reconstruction MSE')plt.xlabel('Index')plt.show()

          可以看到,正負(fù)樣本的MAE和MSE有比較明顯的差異,證明這個(gè)算法有很好的異常檢測(cè)能力,當(dāng)然,有部分正常樣本還是很難通過(guò)異常檢測(cè)分開(kāi)。

          ···  END  ···

          往期精彩回顧




          瀏覽 63
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜躁日日躁狠狠躁av麻豆 | 1级毛片乱伦中文字幕 | 日本A∨再现 | 亚洲俺也 | 成人毛片女人AAA久久 |