はじめに
暗号化された通信か、暗号化されてない通信か、ポート番号などの情報を使わずに通信の特徴量だけを使って、ニューラルネットワークで識別できるか試してみました。結果としては99%以上の精度で識別できました。
試してみた条件
ニューラルネットワーク:全結合の2層
フレームワーク:keras (tensorflow backend)
データセット:DARPA 1999 Week3 data set ( https://projects.cs.dal.ca/projectx/Download.html ) を一部変更して利用
コードとデータセット
githubに置きました。
https://github.com/kznx/traffic_classification/tree/master/ssh_or_not
説明
データセットの読み込み
データセットが arff というフォーマットなので、下記のように読み込み、numpyのarrayにします。
http://qiita.com/kznx/items/59c4b50f944c0d6079c1
正規化
kerasでは、データを正規化する必要があるようなので、scikit-learnのMinMaxScalerを使い、正規化します。
mms = MinMaxScaler()
x_norm = mms.fit_transform(train)
データの分離
訓練用データとテスト用データに分離します。scikit-learnのcross_validationを使います。
train_x, test_x, train_y, test_y = cross_validation.train_test_split(
x_norm, target, test_size=0.2
)
正解データのフォーマットを変更します
y_train = np_utils.to_categorical(train_y, 2)
y_test = np_utils.to_categorical(test_y, 2)
モデル定義、学習、評価
こちらの投稿を参考にモデル定義してみました。
http://qiita.com/rindai87/items/546991f5ecae0ef7cde3
# モデルの定義
model = Sequential()
# ネットワークの定義
model.add(Dense(input_dim=21, output_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(input_dim=20, output_dim=20))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(input_dim=20, output_dim=10))
model.add(Activation('relu'))
model.add(Dropout(0.2))
## OUTPUT SSH or NOTSSH
model.add(Dense(output_dim=2))
model.add(Activation('softmax'))
# ネットワークのコンパイル
model.compile(loss = 'categorical_crossentropy',
optimizer = 'sgd',
metrics = ['accuracy'])
# 学習処理
hist = model.fit(train_x, y_train, nb_epoch = 10, batch_size = 100, verbose=1)
# 学習結果の評価
score = model.evaluate(test_x, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
結果
99.7%という予想以上にいい精度でした。
Epoch 1/10
50606/50606 [==============================] - 1s - loss: 0.2669 - acc: 0.9484
Epoch 2/10
50606/50606 [==============================] - 1s - loss: 0.1090 - acc: 0.9832
Epoch 3/10
50606/50606 [==============================] - 1s - loss: 0.0733 - acc: 0.9869
Epoch 4/10
50606/50606 [==============================] - 1s - loss: 0.0597 - acc: 0.9892
Epoch 5/10
50606/50606 [==============================] - 1s - loss: 0.0495 - acc: 0.9913
Epoch 6/10
50606/50606 [==============================] - 1s - loss: 0.0458 - acc: 0.9923
Epoch 7/10
50606/50606 [==============================] - 1s - loss: 0.0427 - acc: 0.9925
Epoch 8/10
50606/50606 [==============================] - 1s - loss: 0.0400 - acc: 0.9935
Epoch 9/10
50606/50606 [==============================] - 1s - loss: 0.0374 - acc: 0.9938
Epoch 10/10
50606/50606 [==============================] - 1s - loss: 0.0357 - acc: 0.9942
12096/12652 [===========================>..] - ETA: 0sTest loss: 0.0282513894941
Test accuracy: 0.997707872273