Responder a: Autoencoder para anomalias

#29008
Jones Granatyr
Moderador

    Essa construção que fiz estaria correta para a detecção de anomalias com o autoencoder usando tensorflow/keras?

    ————————————————

    # Preparação para autoencoder

    tamanho = treino.shape[1]
    tamanho

    # Construção das camadas

    input = layers.Input(shape=(tamanho, ))

    encoder = layers.Dense(int(tamanho/2), activation=”relu”)(input)
    encoder = layers.Dense(int(tamanho/5), activation=”relu”)(encoder)
    encoder = layers.Dense(int(tamanho/9), activation=”relu”)(encoder)

    latent = layers.Dense(int(tamanho/12), activation=”relu”)(encoder)

    decoder = layers.Dense(int(tamanho/9), activation=”relu”)(latent)
    decoder = layers.Dense(int(tamanho/5), activation=”relu”)(decoder)
    decoder = layers.Dense(int(tamanho/2), activation=”relu”)(decoder)

    output = layers.Dense(int(tamanho), activation=”sigmoid”)(decoder)

     

    # Criação do modelo

    autoencoder = Model(input, output)
    autoencoder.compile(optimizer=”adam”, loss=”mse”)       ################# usar o MSE seria adequado?

     

    # Treinamento do modelo

    treinamento = autoencoder.fit(treino, treino, epochs=100, batch_size=256, verbose=False, validation_split=0.15)

     

    # Reconstrução da base

    reconstrucao = autoencoder.predict(treino)
    train_loss = tf.keras.losses.mse(reconstrucao, treino)
    plt.hist(train_loss, bins=50)

     

    # Determinação do threshold para identificação de anomalias

    threshold = np.mean(train_loss) + np.std(train_loss)
    threshold

     

    # Atribuição da perda MSE

    dados[“MSE”] = tf.keras.losses.mse(reconstrucao, treino)

     

    # Classificação do outlier

    dados[“Outlier”] = 0
    dados.loc[dados[“MSE”] > threshold, “Outlier”] = 1

    <hr />

     

    Obrigado !