LoginSignup
0
0

More than 1 year has passed since last update.

Splunkとkerasを用いた不正アクセス予測検知の仕組み(ディープラーニング構築編)

Last updated at Posted at 2021-09-15

やりたいこと

アクセスログをもとに機械学習で不正アクセスを予測する仕組み作る。
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()

スクリーンショット 2021-09-11 2.01.53.png

機械学習構築

目的変数(Y),説明変数(X)を設定する。

Y = np.array(dataset['clf'])
X = np.array(dataset.iloc[:,:28])

形状を確認する。

print(Y.shape)
print(X.shape)

スクリーンショット 2021-09-11 2.13.58.png

# データの分割
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)

スクリーンショット 2021-09-11 2.14.29.png

機械学習モデルの設定と構築を行う。

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

スクリーンショット 2021-09-11 2.15.02.png

学習開始

モデルを用いて、機械学習開始。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))

スクリーンショット 2021-09-11 2.15.49.png

完了後、グラフで表示して確認。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()

スクリーンショット 2021-09-11 2.16.12.png

構築したモデルを使い予測を行う。

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

スクリーンショット 2021-09-11 2.17.18.png

以上。

参考

Scutum技術ブログ
異常検出アルゴリズム Isolation Forest

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0