У меня есть фрейм данных с 67 функциями x 1031 сэмплом. Я хотел бы сократить количество функций до двух или трех важных. Я использую автоэнкодер для этой цели, и, к моему удивлению, какой бы размер кодирования я ни выбрал, я всегда получаю по крайней мере одну из предсказанных функций в виде набора нулей.
Моя цель - продемонстрировать преимущества автоэнкодера над PCA с пример.
Ожидаемый результат: полностью заполненная матрица вывода Текущий результат: матрица вывода с некоторыми столбцами, заполненными нулями
- Почему я получаю вывод с нулевыми векторами столбцов? Как мне исправить это, если это проблема?
- Как узнать, фиксирует ли мой автоэнкодер определенное количество отклонений во входных данных?
- Как повысить точность и уменьшить потери в автокодировщике?
Вот мой код. А вот ввод .
### 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))