やりたいこと
アクセスログをもとに機械学習で不正アクセスを予測する仕組み作る。
1.Splunkを使い、access.logをCSVに変換
2.CSVファイルをもとにJupyterLab上で教師データを作る
3.ディープラーニングを用いて、予測精度を確かめる ⇦今回の内容

環境
・JupyterLab 2.1.4 @ AWS Cloud9
・Python 3
・Splunk Enterprise 8.1 @ AWS EC2
別ノートで作業するので初期設定を行う。
初期設定
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Keras
from tensorflow import keras
from tensorflow.keras.layers import Dense, Activation
# データの分割
from sklearn.model_selection import train_test_split
# MSE
from sklearn.metrics import mean_squared_error
# JupyterNotebook上でグラフを表示する設定
%matplotlib inline
# DataFrameで全ての列を表示する設定
pd.options.display.max_columns = None
データ取り込み
前回作成した特徴量データの確認
dataset = pd.read_csv('dataset.csv')
dataset.head()
機械学習構築
目的変数(Y),説明変数(X)を設定する。
Y = np.array(dataset['clf'])
X = np.array(dataset.iloc[:,:28])
形状を確認する。
print(Y.shape)
print(X.shape)
# データの分割
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.3, random_state=0)
それぞれの形状を確認
print("Y_train=", Y_train.shape, ", X_train=", X_train.shape)
print("Y_valid=", Y_valid.shape, ", X_valid=", X_valid.shape)
print("Y_test=", Y_test.shape, ", X_test=", X_test.shape)
機械学習モデルの設定と構築を行う。
model = keras.Sequential()
model.add(Dense(8, activation='relu', input_shape=(28,)))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer = "rmsprop", loss='binary_crossentropy', metrics=['accuracy'])
学習前に、モデルの構造を確認する。
※EC2のスペックに応じて変更
model.summary()
学習開始
モデルを用いて、機械学習開始。epochs=200もいらなかった。
%%time
log = model.fit(X_train, Y_train, epochs=200, batch_size=128, verbose=True,
callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0, patience=100,
verbose=1)],
validation_data=(X_valid, Y_valid))
完了後、グラフで表示して確認。200回もいらなかったかも。
plt.plot(log.history['loss'], label='loss')
plt.plot(log.history['val_loss'], label='val_loss')
plt.legend(frameon=False) # 凡例の表示
plt.xlabel("epochs")
plt.ylabel("crossentropy")
plt.show()
構築したモデルを使い予測を行う。
Y_pred = model.predict(X_test)
Y_pred_cls = (Y_pred > 0.5).astype("int32")
形状を目的変数に合わせる。
Y_pred_ = Y_pred_cls.reshape(-1)
モデルの評価
モデルの評価を行う。スコアは良好。
from sklearn.metrics import classification_report
print(classification_report(Y_test, Y_pred_))
以上。