Machine Learning-用自動編碼器來實作異常值偵測-使用python keras(outlier detection with autoencoder using python keras)
一般認為自動編碼器用來降維,減少資料複雜度。
其另一用途可被應用在半監督式學習的異常偵測上。
基本概念為
拿一群狗的圖片進去訓練模型 原圖>壓縮>復原
模型目標希望復原圖片跟原圖失真越小越好,
當你拿一群狗資料進行訓練,就可以得到一個對狗圖片有很強的壓縮解壓縮的模型。
今天當有異常資料近來,例如貓的照片進這模型再復原,照常理來說其失真程度較高,因此可以用mean-square error來當作異常分數。
以下附上簡單用python keras實作的訓練模型程式碼,範例指用了424的自動邊碼器模型,大家可自行增加units與layers來得到更佳的偵測模型。
import numpy as np from keras.models import Sequential from keras.layers import Dense import matplotlib.pyplot as plt import mysql.connector import pandas as pd from keras.models import Model from keras.layers import Dense, Input from sklearn import preprocessing from sklearn.metrics import mean_squared_error from sklearn.model_selection import StratifiedKFold from sklearn.cross_validation import train_test_split #讀取資料 看你的資料再資料庫還是csv cnx = mysql.connector.connect(user='xxx', password='xxx', host='xxx', database='xxx') cursor = cnx.cursor() query = ("SELECT id, q,p,t,angle FROM xxx where traindata='Y' ") cursor = cnx.cursor(buffered=True) cursor.execute(query) num_fields = len(cursor.description) field_names = [i[0] for i in cursor.description] result_set = cursor.fetchall() cursor.close() cnx.close() df=pd.DataFrame(result_set) df.columns=field_names data=df #正規化 切訓練集與測試集 data=data.values min_max_scaler = preprocessing.MinMaxScaler() data = min_max_scaler.fit_transform(data) data_train, data_test = train_test_split(data, test_size=0.20, random_state=42) #建424 autoencoder模型,用adam演算法,損失函式為MSE encoding_dim = 2 # this is our input placeholder input_img = Input(shape=(4,)) # encoder layers encoder_output = Dense(encoding_dim)(input_img) # decoder layers decoded = Dense(4, activation='tanh')(encoder_output) # construct the autoencoder model autoencoder = Model(input=input_img, output=decoded) # compile autoencoder autoencoder.compile(optimizer='adam', loss='mse') # training autoencoder.fit(data_train, data_train, nb_epoch=150, batch_size=6, shuffle=True, verbose=1) #看測試集MSE是否良好 data_pred = autoencoder.predict(data_test) test_mse=0 for x in range(len(data_test)): test_mse = test_mse+mean_squared_error(data_test[x], data_pred[x]) #儲存訓練完模型 autoencoder.save('xxx.h5')
模型的使用可參考下一篇
留言
張貼留言