天天看點

機器學習:用自編碼器進行降維示例

作者:不靠譜的貓

#頭條創作挑戰賽#

想象一下,在你的機器學習資料集中有超過數千個輸入特征,當我們進行機器學習模型訓練時,我們希望能把資料集壓縮為更少的特征。我們可以用一種叫做自編碼器的神經網絡來做到這一點。

本文将簡要介紹一下自動編碼器,并用簡單示例進行說明其使用方法。

自編碼器到底是什麼?

自編碼器是神經網絡的一個分支,它基本上是将輸入變量的資訊壓縮到一個小的次元空間中,然後重新建立輸入資料集以再次訓練它。

自編碼器由3個主要部分組成

  • 編碼器(Encoder)
  • 編碼(Code)
  • 解碼器(Decoder)

Encode:編碼器是一個前饋、全連接配接的神經網絡,它将輸入壓縮為潛在空間表示,并将輸入圖像編碼為降維圖像,并生成代碼。代碼的大小越小,壓縮越高。

機器學習:用自編碼器進行降維示例

自編碼器的表示

Code:網絡的這一部分包含饋入解碼器的輸入的簡化表示。

Decoder:解碼器也是一種前饋神經網絡,類似于編碼器,但表示是編碼器的鏡像。解碼器從代碼中将輸入重建回原始次元。

注意:輸入和輸出的次元必須相同。

首先,輸入通過編碼器(這是一個全連接配接的人工神經網絡)産生代碼。具有類似 ANN 結構的解碼器僅使用代碼生成輸出,目标是得到與輸入相同的輸出。注意,解碼器架構是編碼器的鏡像。這不是必需的,但通常是這樣。唯一的要求是輸入和輸出的次元需要相同。

超參數

  • 編碼大小:中間層中的節點數。越小,壓縮越大。
  • 層數:自動編碼器可以按照我們喜歡的深度。在上圖中,我們在編碼器和解碼器中都有兩層,不考慮輸入和輸出。
  • 每層的節點數:我們正在研究的自編碼器架構被稱為堆疊式自編碼器,因為層是一個接一個堆疊的。每一層的節點數随着編碼器的每一後續層而減少,并在解碼器中增加。此外,就層結構而言,解碼器對編碼器是對稱的。如上所述,這不是必需的,我們可以完全控制這些參數。
  • 損失函數:我們使用均方誤差(mse)或二進制交叉熵。如果輸入值在[0,1]範圍内,那麼我們通常使用交叉熵,否則,我們使用均方誤差。

Python示例

讓我們看看如何使用自編碼器進行降維。讓我們以一個擁有12個特征和8664行的資料集為例。現在我們的目标是将資料集壓縮為6個特征。

機器學習:用自編碼器進行降維示例

包含 12 個特征的原始資料集

讓我們縮放資料,使所有資料點都位于相同的範圍内

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)
X_train_df = pd.DataFrame(df_scaled, columns=df.columns)
X_train_df           
機器學習:用自編碼器進行降維示例

縮放後的資料集

讓我們建構一個自編碼器,Python代碼如下

import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
# 12, 11, 10, 9, 8, 7, 6, 7, 8, 9, 10, 11, 12
# encoder
encoder_input = Input(shape=(n_features), name='encoder_input')
encoder_layer1 = Dense(11, activation='relu', name='encoder_layer1')(encoder_input)
encoder_layer2 = Dense(10, activation='relu', name='encoder_layer2')(encoder_layer1)
encoder_layer3 = Dense(9, activation='relu', name='encoder_layer3')(encoder_layer2)
encoder_layer4 = Dense(8, activation='relu', name='encoder_layer4')(encoder_layer3)
encoder_layer5 = Dense(7, activation='relu', name='encoder_layer5')(encoder_layer4)
latent_space = Dense(6, activation='relu', name='latent_space')(encoder_layer5)
#decoder
decoder_layer1 = Dense(7, activation='relu', name='decoder_layer1')(latent_space)
decoder_layer2 = Dense(8, activation='relu', name='decoder_layer2')(decoder_layer1)
decoder_layer3 = Dense(9, activation='relu', name='decoder_layer3')(decoder_layer2)
decoder_layer4 = Dense(10, activation='relu', name='decoder_layer4')(decoder_layer3)
decoder_layer5 = Dense(11, activation='relu', name='decoder_layer5')(decoder_layer4)
output = Dense(n_features, activation='sigmoid', name='Output')(decoder_layer5)
autoencoder = Model(encoder_input, output, name='Autoencoder')
autoencoder.compile(optimizer='adam',
                    loss=tf.keras.losses.mean_squared_error)
autoencoder.summary()           
機器學習:用自編碼器進行降維示例
history = autoencoder.fit(X_train_df, 
                          X_train_df,
                          epochs=100,
                          steps_per_epoch=10,
                          verbose=0)
# only the encoder part
encoder = Model(inputs=encoder_input, outputs=latent_space)
encoder.compile(optimizer='adam',
                        loss=tf.keras.losses.mean_squared_error)
X_train_encode = encoder.predict(X_train_df)
encoded_train = pd.DataFrame(X_train_encode,
                             columns=[f"X{x}" for x in range(1, X_train_encode.shape[1]+1)])           
機器學習:用自編碼器進行降維示例

具有 6 個特征的資料集

我們可以看到編碼器的輸出,它将我們的資料集壓縮為6個特征。

機器學習:用自編碼器進行降維示例

紅色陰影部分顯示原始資料與重建資料之間的誤差。

繼續閱讀