【tensorflow】ニューラルネットワークで分類問題を解く方法が分かる【Kaggle Course – Intro to Deep Learning 6】Binary Classification

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

中でも、この記事では以下の講座について解説します。

Intro to Deep Learning
6.Binary Classification

全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

Binary Classification(分類問題)

Introduction(イントロダクション)

これまでの講座では、ニューラルネットワークで回帰問題を解く方法を学んできましたが、今回は分類問題を解く方法について学んでいきます。

回帰問題分類問題も、ニューラルネットワークの構造はほとんど同じですが、違っているのは、使用する損失関数と、最終層の出力です。

Binary Classification(二項分類)

二項分類とは分類問題の一番シンプルなかたちで、出力を2つに分類するものです。

お客さんが商品を購入するかどうか、ある人が男性か女性か、試験に合格するかどうかなど、「Yes」「No」などの2つのラベルで分類できる問題が二項分類です

Accuracy and Cross-Entropy(正解率と交差エントロピー)

正解率(Accuracy)は、以下の数式で表される、分類問題の精度を測るための指標です。

正解率 = 正解数 / 全予測数

しかし、正解率は離散的な値となるため、微分ができず、損失関数には使用できません。

そのため、損失関数として交差エントロピーを使用します。

回帰問題の損失関数としてMAE(平均絶対誤差)を用いたように、分類問題の損失関数として使用されるのが交差エントロピーです。

どちらも、予測とデータの距離を最小化します。

 

Making Probabilities with the Sigmoid Function(シグモイド関数で確率を生成する)

交差エントロピー関数には入力として、0から1までの確率が必要です。

これを生み出すために、活性化関数としてシグモイド関数を使います。

 

シグモイド関数を使うと、上記のように実数を0から1までの値に変換してくれます。

Example – Binary Classification(二項分類の具体例)

具体例として、Ionosphereのデータセットを使用します。

Ionosphereのデータセットは、34個(V1からV34)の信号から、電解層に特定の物質がある(good)かない(bad)かを判断(Class)します。

V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V26 V27 V28 V29 V30 V31 V32 V33 V34 Class
1 1 0 0.99539 -0.05889 0.85243 0.02306 0.83398 -0.37708 1.00000 0.03760 -0.51171 0.41078 -0.46168 0.21266 -0.34090 0.42267 -0.54487 0.18641 -0.45300 good
2 1 0 1.00000 -0.18829 0.93035 -0.36156 -0.10868 -0.93597 1.00000 -0.04549 -0.26569 -0.20468 -0.18401 -0.19040 -0.11593 -0.16626 -0.06288 -0.13738 -0.02447 bad
3 1 0 1.00000 -0.03365 1.00000 0.00485 1.00000 -0.12062 0.88965 0.01198 -0.40220 0.58984 -0.22145 0.43100 -0.17365 0.60436 -0.24180 0.56045 -0.38238 good
4 1 0 1.00000 -0.45161 1.00000 1.00000 0.71216 -1.00000 0.00000 0.00000 0.90695 0.51613 1.00000 1.00000 -0.20099 0.25682 1.00000 -0.32382 1.00000 bad
5 1 0 1.00000 -0.02401 0.94140 0.06531 0.92106 -0.23255 0.77152 -0.16399 -0.65158 0.13290 -0.53206 0.02431 -0.62197 -0.05707 -0.59573 -0.04608 -0.65697 good

回帰問題との違いとして、最終層にシグモイド関数を設置して、モデルが確率を生成するようにしています。

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(4, activation='relu', input_shape=[33]),
    layers.Dense(4, activation='relu'),    
    layers.Dense(1, activation='sigmoid'),
])

compileメソッドで、最適化アルゴリズムにadamを、損失関数に交差エントロピーを、モデルの性能を測る評価関数としてmetricsに正解率を指定します。

それぞれにbinaryが付いているのは、今回扱うのが二項分類だからです。

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['binary_accuracy'],
)

オーバーフィットを抑止するためにも、早期停止も実装しておきます。

early_stopping = keras.callbacks.EarlyStopping(
    patience=10,
    min_delta=0.001,
    restore_best_weights=True,
)

history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=512,
    epochs=1000,
    callbacks=[early_stopping],
    verbose=0, # hide the output because we have so many epochs
)

学習曲線と、検証データで得られた損失と正解率を確認します。

history_df = pd.DataFrame(history.history)
# Start the plot at epoch 5
history_df.loc[5:, ['loss', 'val_loss']].plot()
history_df.loc[5:, ['binary_accuracy', 'val_binary_accuracy']].plot()

print(("Best Validation Loss: {:0.4f}" +\
      "\nBest Validation Accuracy: {:0.4f}")\
      .format(history_df['val_loss'].min(), 
              history_df['val_binary_accuracy'].max()))
Best Validation Loss: 0.3354
Best Validation Accuracy: 0.8952

損失の比較

正解率の比較

早期停止のおかげでオーバーフィットやアンダーフィットは免れているようですね。

Your Turn(練習問題)

Kaggle Courseでは、学んできたことを実践するための練習問題が用意されています。読んだり見たりするだけでなく、実際に手を動かすことは大切ですので、ぜひチャレンジしてみて下さい。

今回はKaggle Courseで二項分類について学びました。これでIntro to Deep LearningのCourseは最後となりましたので、Kaggleから修了証がもらえました。

以上、最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました