Keras - 自动编码器精度停留在零
Keras - Autoencoder accuracy stuck on zero
我正在尝试使用自动编码器和 Keras 检测欺诈行为。我将以下代码编写为 Notebook:
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,我的测试损失低于我的训练损失。
任何见解都会得到应用
自动编码器的准确性没有什么意义,尤其是在欺诈检测算法上。我的意思是回归任务的准确性没有明确定义。例如,说 0.1 与 0.11 相同是否准确。对于 keras 算法,它不是。如果您想了解您的算法复制数据的效果如何,我建议您查看 MSE 或数据本身。许多自动编码器使用 MSE 作为它们的损失函数。
您应该监控的指标是良好示例的训练损失与欺诈示例的验证损失。在那里你可以很容易地看到你是否可以比欺诈的例子更接近你的真实例子,以及你的算法在实践中的表现如何。
我不会做出的另一个设计选择是自动编码器中的 relu。 ReLU 由于其在对抗 vanishing/exploding 梯度方面的简单性和有效性,因此适用于更深层次的模型。然而,这两个问题在自动编码器中都不是因素,数据丢失对自动编码器有伤害。我建议使用 tanh 作为中间激活函数。
我正在尝试使用自动编码器和 Keras 检测欺诈行为。我将以下代码编写为 Notebook:
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,我的测试损失低于我的训练损失。
任何见解都会得到应用
自动编码器的准确性没有什么意义,尤其是在欺诈检测算法上。我的意思是回归任务的准确性没有明确定义。例如,说 0.1 与 0.11 相同是否准确。对于 keras 算法,它不是。如果您想了解您的算法复制数据的效果如何,我建议您查看 MSE 或数据本身。许多自动编码器使用 MSE 作为它们的损失函数。
您应该监控的指标是良好示例的训练损失与欺诈示例的验证损失。在那里你可以很容易地看到你是否可以比欺诈的例子更接近你的真实例子,以及你的算法在实践中的表现如何。
我不会做出的另一个设计选择是自动编码器中的 relu。 ReLU 由于其在对抗 vanishing/exploding 梯度方面的简单性和有效性,因此适用于更深层次的模型。然而,这两个问题在自动编码器中都不是因素,数据丢失对自动编码器有伤害。我建议使用 tanh 作为中间激活函数。