我创建了以下简单的自动编码器,用于数据的降维。输入data
包含integer
值的10K个样本,其中类为0
或1
:
import numpy as np
import pandas as pd
from keras import Model, Input
from keras.layers import Dense
from sklearn.model_selection import train_test_split
def construct_network(X_train):
input_dim = X_train.shape[1]
neurons = 64
input_layer = Input(shape=(input_dim,))
encoded1 = Dense(neurons, activation='relu')(input_layer)
encoded = Dense(int(neurons / 2), activation='relu')(encoded1)
decoded1 = Dense(neurons, activation='relu')(encoded)
output_layer = Dense(input_dim, activation='linear')(decoded1)
autoencoder = Model(inputs=input_layer, outputs=output_layer)
return autoencoder
data, labels = read_data('/Users/A/datasets/data.csv')
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2)
autoencoder = construct_network(X_train)
autoencoder.compile(optimizer='adam', loss='mse', metrics=['acc'])
history = autoencoder.fit(X_train, X_train,
epochs=100,
batch_size=64,
validation_split=0.2,
use_multiprocessing=True)
y_pred = autoencoder.predict(X_test, use_multiprocessing=True)
mse_per_sample = np.mean(np.power(X_test - y_pred, 2), axis=1)
error = pd.DataFrame({'error': mse_per_sample, 'true_label': y_test})
print(error)
我有两个问题:
- 选择
loss='mse'
是否适合此问题 - 如何计算最后一行
error = pd.DataFrame({'error': mse_per_sample, 'true_label': y_test})
中mse_per_sample
和y_test
之间的校正预测值的百分比
谢谢
我将从第二个问题开始,并用它来解释第一个问题。自动编码器试图获取输入值的张量,降低它们的维度,然后用剩下的信息再次近似输入。由于它试图接近定量目标而不是定性标签,因此需要回归这些值。
这意味着,我们不能简单地将事物分为"正确"one_answers"不正确"两类,而是要看到我们的价值观与目标价值观的匹配程度。如果我们只有"对"one_answers"错",我们就不会知道我们离纠正有多近——对于22
目标来说,21.963
和1.236
一样错误。此外,你的回归值很少会正好落在正确值的鼻子上,所以你没有很好地捕捉到模型的性能。
那么,如果没有简单的对错,我们该如何衡量模型的性能呢?我们查看预测值和实际值之间的距离,并使用它来计算测量的误差。取误差的平均值可以得到我们的第一个度量-平均绝对误差(MAE(。这是一个L1的测量值,但它经常很不稳定,所以我们想要一个更平滑的测量值。通过对该值进行平方,我们得到均方误差(MSE(,其表现更具可预测性,是标准回归损失函数。(值得注意的是均方对数误差(MSLE或MSLogE(的维数,它对误差的对数进行平方。(
MSE是你的首选,但需要高斯分布。MSLogE是相同的,但更好地处理大目标值,而MAE可以处理半高斯分布。也就是说,如果你正在标准化或规范化你的输入,你通常应该有一个高斯分布。
如果您必须有一个"准确性"统计数据,请确定您可接受的错误级别,并在数据框中为高于和低于该阈值的值创建一个过滤掩码。然后就是简单地计算阈值以下的值的数量超过值的总数。