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')


模型的使用可參考下一篇

Machine Learning-用自動編碼器來實作異常值偵測-使用python keras 執行模型(outlier detection with autoencoder using python keras run model)


留言

這個網誌中的熱門文章

Python-相關係數矩陣實作(python-correlation matrix )

ASP.NET-後端將值傳給javascript

ASP.NET-FileUpload上傳後自動觸發button click(FileUpload upload auto trigger button click)