Вопросы относительно простой реализации автоэнкодера - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть следующий простой автоэнкодер, который я создал для использования в качестве уменьшения размерности данных. Вход data содержит 10K выборок значений integer, где класс равен либо 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)

У меня два вопроса:

  1. Подходит ли выбор loss='mse' для этой проблемы?
  2. Как рассчитать процентное соотношение скорректированных прогнозных значений между mse_per_sample и y_test в последней строке error = pd.DataFrame({'error': mse_per_sample, 'true_label': y_test})

Спасибо

1 Ответ

2 голосов
/ 21 февраля 2020

Я начну со второго вопроса и использую его для объяснения первого. Авто-кодировщик пытается взять тензор входных значений, уменьшить их размерность и затем снова аппроксимировать вход с информацией, которую он оставил. Поскольку он пытается приблизиться к количественной цели, а не к качественной метке, ему необходимо регрессировать этих значений.

Следствием этого является то, что мы не можем просто сгруппировать вещи в «правильное» и «неправильное» ведро, а скорее мы видим, насколько наши значения совпадают с целевыми значениями. Если бы у нас были «правильные» и «неправильные», мы бы не узнали, насколько мы близки к исправлению - для 22 target 21.963 было бы так же неправильно, как и 1.236. Кроме того, ваши регрессионные значения очень редко попадают прямо в нос правильного значения, поэтому вы не можете точно оценить производительность модели.

Так что, если нет простых правильных и неправильных, как мы можем измерить производительность модели? Мы смотрим на расстояние между прогнозируемыми и фактическими значениями и используем его для расчета погрешности измерения. Принятие среднего числа ошибок дает нам нашу первую метри c - Средняя абсолютная ошибка (MAE). Это измерение L1, но оно часто бывает нестабильным, поэтому мы хотим более плавное измерение. Возводя в квадрат значение, мы получаем Среднее квадратичное отклонение (MSE), которое ведет себя более предсказуемо и является стандартной функцией потери регрессии. (Достойное упоминание Среднее квадратичное значение ошибки журнала (MSLE или MSLogE), которое возводит в квадрат лог ошибки.)

MSE является вашим go -то, но требует гауссовского распределения. MSLogE такой же, но лучше обрабатывает большие целевые значения, а MAE может обрабатывать полугауссовы распределения. Тем не менее, если вы стандартизируете или нормализуете свой ввод, вы в любом случае должны иметь гауссовское распределение.

Если вам необходимо иметь статистику "точность" c, определите приемлемый уровень ошибки и создайте маска фильтра в вашем Dataframe для значений выше и ниже этого порога. Затем нужно просто рассчитать количество значений ниже порогового значения по общему количеству значений.

...