2017-08-07 57 views
1

我試圖使用自動編碼器和Keras檢測欺詐。我寫了下面的代碼作爲NotebookKeras - 自動編碼器準確性卡在零

import numpy as np # linear algebra 
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv) 
from sklearn.preprocessing import StandardScaler 
from keras.layers import Input, Dense 
from keras.models import Model 
import matplotlib.pyplot as plt 

data = pd.read_csv('../input/creditcard.csv') 
data['normAmount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1, 1)) 
data = data.drop(['Time','Amount'],axis=1) 

data = data[data.Class != 1] 
X = data.loc[:, data.columns != 'Class'] 

encodingDim = 7 
inputShape = X.shape[1] 
inputData = Input(shape=(inputShape,)) 

X = X.as_matrix() 

encoded = Dense(encodingDim, activation='relu')(inputData) 
decoded = Dense(inputShape, activation='sigmoid')(encoded) 
autoencoder = Model(inputData, decoded) 
encoder = Model(inputData, encoded) 
encodedInput = Input(shape=(encodingDim,)) 
decoderLayer = autoencoder.layers[-1] 
decoder = Model(encodedInput, decoderLayer(encodedInput)) 

autoencoder.summary() 

autoencoder.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) 
history = autoencoder.fit(X, X, 
       epochs=10, 
       batch_size=256, 
       validation_split=0.33) 

print(history.history.keys()) 
# summarize history for accuracy 
plt.plot(history.history['acc']) 
plt.plot(history.history['val_acc']) 
plt.title('model accuracy') 
plt.ylabel('accuracy') 
plt.xlabel('epoch') 
plt.legend(['train', 'test'], loc='upper left') 
plt.show() 
# summarize history for loss 
plt.plot(history.history['loss']) 
plt.plot(history.history['val_loss']) 
plt.title('model loss') 
plt.ylabel('loss') 
plt.xlabel('epoch') 
plt.legend(['train', 'test'], loc='upper left') 
plt.show() 

我可能失去了一些東西,我的準確度停留在0和我的測試損耗比我的火車更低的損耗。

任何有識之士將appericiated上自動編碼

+0

自動編碼器通常會做迴歸,在迴歸問題上使用準確性沒有意義。 –

回答

1

精度就沒有什麼意義,尤其是在欺詐檢測算法。我的意思是,迴歸任務的準確性沒有很好的定義。例如,準確地說,0.1與0.11相同。對於keras算法,它不是。如果你想看看你的算法如何複製數據,我會建議看看MSE或數據本身。許多自動編碼器使用MSE作爲其丟失功能。

您應該監控的指標是良好示例的培訓損失與欺詐示例的驗證損失。在那裏你可以很容易地看到,你是否能夠比欺詐者更適合你的真實例子,以及你的算法在實踐中表現得如何。

我不會做的另一個設計選擇是自動編碼器中的relu。由於其在消除/爆炸漸變方面的簡單性和有效性,ReLU可以在更深的模型中很好地工作。然而,這兩個問題都是autoencoder中的非因素,以及autoencoder中的數據損失。我建議使用tanh作爲你的中間激活函數。

+0

輝煌的答覆,謝謝你的知識。 –

相關問題