Почему я получаю некоторые функции в виде нулей при использовании автоэнкодера для извлечения признаков? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть фрейм данных с 67 функциями x 1031 сэмплом. Я хотел бы сократить количество функций до двух или трех важных. Я использую автоэнкодер для этой цели, и, к моему удивлению, какой бы размер кодирования я ни выбрал, я всегда получаю по крайней мере одну из предсказанных функций в виде набора нулей.

Моя цель - продемонстрировать преимущества автоэнкодера над PCA с пример.

Ожидаемый результат: полностью заполненная матрица вывода Текущий результат: матрица вывода с некоторыми столбцами, заполненными нулями

  1. Почему я получаю вывод с нулевыми векторами столбцов? Как мне исправить это, если это проблема?
  2. Как узнать, фиксирует ли мой автоэнкодер определенное количество отклонений во входных данных?
  3. Как повысить точность и уменьшить потери в автокодировщике?

Вот мой код. А вот ввод .

### Load dependencies
import pandas as pd
import numpy as np

### Dependencies for Autoencoder
from keras.layers import Input, Dense
from keras.models import Model

### =========================================================================== ###
### Load data from save point excel files named 'Data xx', update file path as needed
X = pd.read_excel('X.xlsx')

### =========================================================================== ###
### Split data into train and test sets for dimensionality reduction

msk = np.random.rand(len(X)) < 0.8
x_train = X[msk]# -------- Training sample of features for dimensionality reduction
x_test = X[~msk]# --------- Testing sample of features for dimensionality reduction

### =========================================================================== ###
encoding_dim = 3
NumFeatures = len(X.columns) #----- gives the number of total input features

InputDF = Input(shape=(NumFeatures,)) 
encoded = Dense(encoding_dim, activation='relu')(InputDF)
decoded = Dense(NumFeatures, activation='sigmoid')(encoded)

encoder = Model(InputDF, encoded)
autoencoder = Model(InputDF, decoded)
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error', metrics=['accuracy'])

autoencoder.fit(x_train, x_train,
                epochs=2000,
                batch_size=16,
                shuffle=True,
                validation_data=(x_test, x_test))

Compressed = pd.DataFrame(encoder.predict(X, verbose = 1))
Compressed.to_excel('Encoded.xlsx', sheet_name='Dimension '+str(encoding_dim))
...