如何从自动编码器的编码层中提取特征?

数据挖掘 Python 喀拉斯 特征提取 自动编码器
2021-09-30 04:43:26

我对自动编码器进行了一些研究,并且我了解到它们也可以用于特征提取(请参阅本网站上的这个问题作为示例)。那里的大多数示例似乎都集中在应用于图像数据的自动编码器上,但我想将它们应用于更通用的数据集。

因此,我使用kerasPython 中的框架实现了一个自动编码器。为简单起见,为了测试我的程序,我已经针对Iris Data Set对其进行了测试,告诉它将我的原始数据从 4 个特征压缩到 2 个,以查看它的行为。

编码器似乎在压缩数据方面发挥了作用(编码器层的输出确实只显示了两列)。然而,这两列的值并没有出现在原始数据集中,这让我觉得自动编码器在后台做一些事情,选择/组合特征以获得压缩表示。

这是完整的工作示例:

from pandas import read_csv
from numpy.random import seed
from sklearn.model_selection import train_test_split
from keras.layers import Input, Dense
from keras.models import Model

# Get input data and separate features from labels
df = read_csv("iris.data")
Y = df.iloc[:,4]
X = df.iloc[:, : 4]

# Split data set in train and test data
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.5, random_state=seed(1234))

# Input information
col_num = X.shape[1]
input_dim = Input(shape=(col_num,))

# Encoding information
encoding_dim = 2
encoded = Dense(encoding_dim, activation='relu')(input_dim)
# Decoding information
decoded = Dense(col_num, activation='sigmoid')(encoded)
# Autoencoder information (encoder + decoder)
autoencoder = Model(input=input_dim, output=decoded)

# Train the autoencoder
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
autoencoder.fit(X_train, X_train, nb_epoch=50, batch_size=100, shuffle=True, validation_data=(X_test, X_test))

# Encoder information for feature extraction
encoder = Model(input=input_dim, output=encoded)
encoded_input = Input(shape=(encoding_dim,))
encoded_output = encoder.predict(X_test)

# Show the encoded values
print(encoded_output[:5])

这是此示例的输出:

[[ 0.28065908  6.151131  ]
 [ 0.8104178   5.042427  ]
 [-0.          6.4602194 ]
 [ 3.0278277   2.7351477 ]
 [ 0.06134868  5.064625  ]]

基本上,我的想法是使用自动编码器从原始数据集中提取最相关的特征。然而,到目前为止,我只设法让自动编码器压缩数据,但并没有真正了解最重要的功能是什么。

因此,我的问题是:有什么方法可以了解自动编码器正在考虑哪些特征来压缩数据,以及它们究竟是如何用于获得 2 列压缩表示的?

1个回答

您正在使用密集的神经网络层进行编码。该层对输入层进行线性组合 + 对输入进行指定的非线性操作。

需要注意的是,自动编码器可用于特征提取而不是特征选择它将获取原始空间中表示的信息并将其转换到另一个空间。发生压缩是因为此特定任务的输入表示中存在一些冗余,转换消除了该冗余。原始特征丢失了,您在新空间中拥有特征。

编码器正在使用哪些输入特征?答案是所有的。它们究竟是如何使用的?答案是您可以检查神经网络为密集层转换的输入分配的权重,以给您一些想法。您可能可以根据分配的权重建立一些直觉(例如:输出特征 1 是通过对输入特征 2 和 3 赋予高权重来构建的。因此编码器将特征 2 和 3 组合成单个特征)。但是涉及非线性(ReLu),因此没有简单的输入线性组合。

如果您的目标是定性地了解如何组合特征,您可以使用更简单的方法,例如主成分分析。PCA 方法输出中给出的因子载荷告诉您输入特征是如何组合的。如果目标是为准确度找到最有效的特征转换,则基于神经网络的编码器很有用。但是您在某种程度上失去了特征提取/转换的可解释性。