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



####やりたいこと
アクセスログをもとに機械学習で不正アクセスを予測する仕組み作る。
[1.Splunkを使い、access.logをCSVに変換](https://qiita.com/Uryy/items/8e923038b41c60cb87a5)
[2.CSVファイルをもとにJupyterLab上で教師データを作る](https://qiita.com/Uryy/items/2066f1377b254e46b774)
[<font color="Red">3.ディープラーニングを用いて、予測精度を確かめる　　</font>](https://qiita.com/Uryy/items/104a4e01d386a72dd184)⇦今回の内容

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/7bafb827-ec61-55d3-5cde-5da8ba47b29e.png">

####環境
・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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/490e50c0-6b4f-3de8-ad8f-b6aac8448f68.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/e1dc8167-ea86-019b-8da3-50f039ddcb74.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/2caef939-986e-df01-b977-7f824ec643f2.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/b1d29d7a-1e6c-9070-85ea-8f4415052698.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/7f61d296-eeef-da3f-8b2f-11f10c625541.png)

完了後、グラフで表示して確認。２００回もいらなかったかも。

```
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/77796fa3-9b4c-e525-39fe-798d609a19a2.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/71f8e5df-2fa6-5c74-b158-7b199cf09a9d.png)


以上。
####参考
[Scutum技術ブログ](https://www.scutum.jp/information/waf_tech_blog/2021/01/waf-blog-077.html)
[異常検出アルゴリズム Isolation Forest](https://data-analysis-stats.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/%E7%95%B0%E5%B8%B8%E6%A4%9C%E5%87%BA%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-isolation-forest/)