KerasとTensorFlowを使用して従業員の定着を予測するディープラーニングモデルを構築する方法

作成者はhttps://www.brightfunds.org/organizations/girls-who-code[Girls Who Code]を選択して、https://do.co/w4do-cta [Donationsのための書き込み]プログラムの一環として寄付を受け取りました.

前書き

Kerasは、Pythonで記述されたニューラルネットワークAPIです。 TensorFlow、https://www.microsoft.com/en-us/cognitive-toolkit/[CNTK]、またはhttp://deeplearning.net/の上で実行されます。 software / theano / [Theano]。 これは、これらのディープラーニングフレームワークの高レベルの抽象化であるため、実験を迅速かつ容易にします。 Kerasはモジュール式です。つまり、開発者はモジュールを追加することでモデルをすばやく拡張できるため、実装はシームレスです。

TensorFlowは、機械学習用のオープンソースソフトウェアライブラリです。 配列を含む計算で効率的に動作します。したがって、このチュートリアルで作成するモデルに最適です。 さらに、TensorFlowでは、CPUまたはGPUでコードを実行できます。これは、大規模なデータセットを操作している場合に特に便利な機能です。

このチュートリアルでは、従業員が退職する確率を予測するディープラーニングモデルを構築します。 最高の従業員を維持することは、ほとんどの組織にとって重要な要素です。 モデルを構築するには、https://www.kaggle.com/liujiaqi/hr-comma-sepcsv#HR_comma_sep.csv [Kaggleで利用可能なこのデータセット]を使用します。これには、会社の従業員の満足度を測定する機能があります。 このモデルを作成するには、Keras sequentialレイヤーを使用して、モデルのさまざまなレイヤーを作成します。

前提条件

このチュートリアルを始める前に、次のものが必要です。

  • マシン上のhttps://www.digitalocean.com/community/tutorials/how-to-install-anaconda-on-ubuntu-18-04-quickstart[Anaconda開発環境]。

  • Jupyter Notebookインストール。 Anacondaは、インストール時にJupyter Notebookをインストールします。 Jupyter Notebookをナビゲートして使用する方法のガイドについては、このチュートリアルに従うこともできます。

  • https://www.digitalocean.com/community/tutorials/an-introduction-to-machine-learning [機械学習]に精通している。

ステップ1-データの前処理

ディープラーニングモデルが受け入れられる方法でデータを準備するには、_データの前処理_が必要です。 データに_categorical変数_がある場合、アルゴリズムは数値のみを受け入れるため、それらを数値に変換する必要があります。 カテゴリ変数は、名前で表される量的データを表します。 このステップでは、データ操作Pythonライブラリである `+ pandas +`を使用してデータセットを読み込みます。

データの前処理を開始する前に、環境をアクティブ化し、必要なパッケージがすべてマシンにインストールされていることを確認します。 「+ conda 」を使用して「 keras 」および「 tensorflow 」をインストールすると、これらのパッケージに必要な依存関係のインストールを処理し、「 keras 」および「 tensorflow +」との互換性を確保できるため有利です。 このように、Anaconda Pythonディストリビューションを使用することは、データサイエンス関連のプロジェクトに適しています。

前提条件のチュートリアルで作成した環境に移動します。

conda activate

次のコマンドを実行して、「+ keras 」と「 tensorflow +」をインストールします。

conda install tensorflow keras

さあ、Jupyter Notebookを開いて始めましょう。 Jupyter Notebookを開くには、ターミナルで次のコマンドを入力します。

jupyter notebook

Jupyter Notebookにアクセスした後、* anaconda3 ファイルをクリックし、画面上部の New をクリックして、 Python 3 *を選択して新しいノートブックをロードします。

次に、プロジェクトに必要なモジュールをインポートし、データセットをノートブックセルにロードします。 データを操作するための `+ pandas `モジュールと、データを ` numpy `配列に変換するための ` numpy +`をロードします。 また、文字列形式のすべての列を数値に変換して、コンピューターで処理できるようにします。

次のコードをノートブックのセルに挿入し、[実行]をクリックします。

import pandas as pd
import numpy as np
df = pd.read_csv("https://raw.githubusercontent.com/mwitiderrick/kerasDO/master/HR_comma_sep.csv")

+ numpy`と + pandas`をインポートしました。 次に、 `+ pandas +`を使用して、モデルのデータセットをロードしました。

`+ head()`を使用して、作業中のデータセットを垣間見ることができます。 これは、データフレームの最初の5つのレコードを表示できる「 pandas +」の便利な関数です。 ノートブックのセルに次のコードを追加して実行します。

df.head()

image:https://assets.digitalocean.com/articles/deeplearningkeras/step1a.png [Altデータセットの頭をチェック]

次に、カテゴリ列を数値に変換します。 これを行うには、それらを_ダミー変数_に変換します。 ダミー変数は、通常、カテゴリー機能の有無を示す1と0です。 このような状況では、最初のダミーを削除することで、_dummy変数trap_を回避することもできます。

次のノートブックセルにこのコードを挿入して実行します。

feats = ['department','salary']
df_final = pd.get_dummies(df,columns=feats,drop_first=True)

`+ feats = ['department'、 'salary'] `は、ダミー変数を作成する2つの列を定義します。 ` pd.get_dummies(df、columns = feats、drop_first = True)`は、従業員維持モデルに必要な数値変数を生成します。 定義する ` feats +`をカテゴリ変数から数値変数に変換することでこれを行います。

image:https://assets.digitalocean.com/articles/deeplearningkeras/step1b.png [ステップ1]

データセットを読み込んで、給与と部門の列をディープラーニングモデル「+ keras +」が受け入れられる形式に変換しました。 次の手順では、データセットをトレーニングセットとテストセットに分割します。

ステップ2-トレーニングとテストのデータセットを分離する

https://scikit-learn.org/ [+ scikit-learn +]を使用して、データセットをトレーニングセットとテストセットに分割します。 これは、従業員データの一部を使用してモデルをトレーニングし、一部を使用してパフォーマンスをテストできるようにするために必要です。 この方法でデータセットを分割することは、ディープラーニングモデルを構築する際の一般的な方法です。

トレーニングプロセス中に構築したモデルがテストデータにアクセスできないように、データセットにこの分割を実装することが重要です。 これにより、モデルはトレーニングデータからのみ学習し、テストデータでそのパフォーマンスをテストできます。 トレーニングプロセス中にモデルをテストデータにさらした場合、予想される結果が記憶されます。 その結果、見たことのないデータの正確な予測ができなくなります。

まず、 `+ scikit-learn `パッケージから ` train_test_split +`モジュールをインポートします。 これは、分割機能を提供するモジュールです。 次のノートブックセルにこのコードを挿入して、実行します:

from sklearn.model_selection import train_test_split

「+ train_test_split 」モジュールをインポートしたら、データセットの「 left 」列を使用して、従業員が退職するかどうかを予測します。 したがって、ディープラーニングモデルがこの列に接触しないことが重要です。 次をセルに挿入して、「 left +」列をドロップします。

X = df_final.drop(['left'],axis=1).values
y = df_final['left'].values

ディープラーニングモデルは、データを配列として取得することを想定しています。 したがって、http://www.numpy.org/ [+ numpy +]を使用して、データを `+ .values `属性を持つ ` numpy +`配列に変換します。

これで、データセットをテストおよびトレーニングセットに変換する準備ができました。 データの70%をトレーニングに、30%をテストに使用します。 トレーニングプロセスにはほとんどのデータを使用する必要があるため、トレーニング率はテスト率よりも高くなっています。 必要に応じて、トレーニングセットで80%、テストセットで20%の比率で実験することもできます。

次のコードを次のセルに追加し、実行して、トレーニングデータとテストデータを指定した比率に分割します。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

image:https://assets.digitalocean.com/articles/deeplearningkeras/step2.png [ステップ2]

これで、データをKerasが期待する型( `+ numpy `配列)に変換し、データがトレーニングとテストのセットに分割されました。 このデータは、チュートリアルの後半で「 keras +」モデルに渡します。 事前にデータを変換する必要があります。これは次のステップで完了します。

ステップ3-データの変換

ディープラーニングモデルを構築する場合、計算をより効率的にするために、データセットを_スケール_することをお勧めします。 このステップでは、 `+ StandardScaler `を使用してデータをスケーリングします。これにより、データセット値の平均がゼロになり、単位変数が確保されます。 これにより、データセットが正規分布に変換されます。 ` scikit-learn `と ` StandardScaler +`を使用して、同じ範囲内に機能をスケーリングします。 これにより、平均値が0、標準偏差が1になるように値が変換されます。 異なる測定値を持つフィーチャを比較するため、この手順は重要です。そのため、通常は機械学習で必要です。

トレーニングセットとテストセットをスケーリングするには、次のコードをノートブックセルに追加して実行します。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

ここでは、 `+ StandardScaler `をインポートして、そのインスタンスを呼び出すことから始めます。 次に、 ` fit_transform +`メソッドを使用して、トレーニングセットとテストセットをスケーリングします。

すべてのデータセットフィーチャを同じ範囲内にスケーリングしました。 次のステップで、人工ニューラルネットワークの構築を開始できます。

ステップ4-人工ニューラルネットワークの構築

ここで、 `+ keras `を使用して深層学習モデルを構築します。 これを行うには、デフォルトでバックエンドとして「 tensorflow 」を使用する「 keras 」をインポートします。 次に、「 keras 」から「 Sequential 」モジュールをインポートして、_人工ニューラルネットワーク_を初期化します。 _人工ニューラルネットワーク_は、人間の脳の働きからインスピレーションを得て構築された計算モデルです。 ` Dense +`モジュールもインポートします。これにより、ディープラーニングモデルにレイヤーが追加されます。

深層学習モデルを構築する場合、通常、3つのレイヤータイプを指定します。

  • _input layer_は、データセットのフィーチャを渡すレイヤーです。 この層で発生する計算はありません。 非表示レイヤーにフィーチャを渡すのに役立ちます。

  • _hiddenレイヤー_は通常、入力レイヤーと出力レイヤーの間のレイヤーです。複数のレイヤーが存在する場合もあります。 これらのレイヤーは計算を実行し、情報を出力レイヤーに渡します。

  • 「出力層」は、モデルをトレーニングした後に結果を提供するニューラルネットワークの層を表します。 出力変数を生成します。

+ Keras ++ Sequential +、および `+ Dense +`モジュールをインポートするには、ノートブックセルで次のコードを実行します。

import keras
from keras.models import Sequential
from keras.layers import Dense

レイヤーの線形スタックを初期化するには、「+ Sequential +」を使用します。 これは_分類の問題_なので、分類変数を作成します。 分類の問題とは、データにラベルを付けて、ラベル付けされたデータに基づいていくつかの予測を行いたいタスクです。 このコードをノートブックに追加して、分類変数を作成します。

classifier = Sequential()

`+ Sequential +`を使用して分類子を初期化しました。

これで、ネットワークへのレイヤーの追加を開始できます。 次のセルでこのコードを実行します。

classifier.add(Dense(9, kernel_initializer = "uniform",activation = "relu", input_dim=18))

分類器で `+ .add()+`関数を使用してレイヤーを追加し、いくつかのパラメーターを指定します。

  • 最初のパラメーターは、ネットワークに必要なノードの数です。 異なるノード間の接続は、ニューラルネットワークを形成するものです。 ノードの数を決定する戦略の1つは、入力層と出力層のノードの平均を取ることです。

  • 2番目のパラメーターは、「+ kernel_initializer。」です。ディープラーニングモデルに適合すると、重みはゼロではなくゼロに近い数値に初期化されます。 これを実現するには、均一分布イニシャライザーを使用します。 ` kernel_initializer +`は重みを初期化する関数です。

  • 3番目のパラメーターは、「+ activation 」関数です。 ディープラーニングモデルは、この機能を通じて学習します。 通常、線形および非線形のアクティベーション関数があります。 https://keras.io/activations/ [` relu +`]アクティベーション関数を使用します。これは、データを一般化できるためです。 線形関数は、直線を形成するため、このような問題には適していません。

  • 最後のパラメーターは `+ input_dim +`で、データセット内のフィーチャの数を表します。

次に、予測を提供する出力レイヤーを追加します。

classifier.add(Dense(1, kernel_initializer = "uniform",activation = "sigmoid"))

出力レイヤーは次のパラメーターを取ります。

  • 出力ノードの数。 従業員が退職した場合、1つの出力が得られます。 したがって、1つの出力ノードを指定します。

  • + kernel_initializer +`には、従業員が退職する確率を得るためにhttps://keras.io/activations/ [+ sigmoid `]アクティベーション関数を使用します。 3つ以上のカテゴリを扱う場合は、https://keras.io/activations/ [` softmax `]アクティベーション関数を使用します。これは、 ` sigmoid +`アクティベーション関数のバリアントです。

次に、_gradient descent_をニューラルネットワークに適用します。 これは、トレーニングプロセス中のエラーを減らすために働く_optimization_戦略です。 勾配降下法とは、ニューラルネットワークでランダムに割り当てられた重みを、コスト関数を減らすことによって調整する方法です。

勾配降下の目的は、エラーが少なくとも存在するポイントを取得することです。 これは、コスト関数がその最小値にある場所を見つけることによって行われます。これは、_local minimum_と呼ばれます。 勾配降下では、特定のポイントで勾配を見つけ、勾配が負か正かを判別して、コスト関数の最小値まで下降していることを判別します。 最適化戦略にはいくつかの種類がありますが、このチュートリアルでは「+ adam +」と呼ばれる一般的なものを使用します。

このコードをノートブックのセルに追加して実行します。

classifier.compile(optimizer= "adam",loss = "binary_crossentropy",metrics = ["accuracy"])

勾配降下の適用は、次のパラメーターを取る「+ compile +」関数を介して行われます。

  • `+ optimizer +`は勾配降下です。

  • 「+ loss 」は、勾配降下で使用する関数です。 これはバイナリ分類の問題なので、 ` binary_crossentropy`` + loss`関数を使用します。

  • 最後のパラメーターは、モデルの評価に使用する「+ metric +」です。 この場合、予測を行う際の精度に基づいて評価する必要があります。

分類器をデータセットに合わせる準備ができました。 Kerasはこれを `+ .fit()+`メソッドで可能にします。 これを行うには、次のコードをノートブックに挿入して実行し、モデルをデータセットに適合させます。

classifier.fit(X_train, y_train, batch_size = 10, epochs = 1)

image:https://assets.digitalocean.com/articles/deeplearningkeras/step4a.png [データセットのフィッティング]

`+ .fit()+`メソッドはいくつかのパラメータを取ります:

  • 最初のパラメーターは、機能を備えたトレーニングセットです。

  • 2番目のパラメーターは、予測を行う列です。

  • `+ batch_size +`は、各トレーニングラウンドでニューラルネットワークを通過するサンプルの数を表します。

  • `+ epochs +`は、データセットがニューラルネットワークを介して渡される回数を表します。 エポックが多いほど、モデルの実行にかかる時間が長くなり、より良い結果が得られます。

image:https://assets.digitalocean.com/articles/deeplearningkeras/step4b.png [ステップ4]

ディープラーニングモデルを作成し、コンパイルして、データセットに適合させました。 ディープラーニングモデルを使用していくつかの予測を行う準備ができました。 次のステップでは、モデルがまだ見ていないデータセットで予測を開始します。

ステップ5-テストセットで予測を実行する

予測を開始するには、作成したモデルのテストデータセットを使用します。 Kerasでは、 `+ .predict()+`関数を使用して予測を行うことができます。

次のノートブックセルに次のコードを挿入して、予測を開始します。

y_pred = classifier.predict(X_test)

トレーニングセットを使用して分類器を既にトレーニングしているため、このコードでは、トレーニングプロセスの学習を使用してテストセットの予測を行います。 これにより、従業員が退職する確率がわかります。 従業員が退職する可能性が高いことを示すために、50%以上の確率で作業します。

このしきい値を設定するには、ノートブックセルに次のコード行を入力します。

y_pred = (y_pred > 0.5)

predictメソッドを使用して予測を作成し、従業員が退職する可能性があるかどうかを判断するためのしきい値を設定しました。 モデルが予測に対してどの程度うまく機能しているかを評価するには、次に_混同行列_を使用します。

ステップ6-混同マトリックスの確認

このステップでは、_混同行列_を使用して、正しい予測と誤った予測の数を確認します。 混同マトリックスは、エラーマトリックスとも呼ばれ、分類器の真陽性(tp)、偽陽性(fp)、真陰性(tn)、偽陰性(fn)の数を報告する正方行列です。

  • * true positive *は、モデルが陽性クラスを正しく予測する結果です(感度または想起とも呼ばれます)。

  • * true negative *は、モデルがネガティブクラスを正しく予測する結果です。

  • * false positive *は、モデルが陽性クラスを誤って予測する結果です。

  • * false negative *は、モデルがネガティブクラスを誤って予測する結果です。

これを実現するには、 `+ scikit-learn +`が提供する混同マトリックスを使用します。

次のノートブックセルにこのコードを挿入して、 `+ scikit-learn +`混同マトリックスをインポートします。

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm

混同行列の出力は、ディープラーニングモデルが「3305 + 375」の正しい予測と「106 + 714」の誤った予測を行ったことを意味します。 精度は、「(3305 + 375)/ 4500」で計算できます。 データセットの観測の総数は4500です。 これにより、81.7%の精度が得られます。 モデルから少なくとも81%の正確な予測を達成できるため、これは非常に優れた精度率です。

Outputarray([,  ],
      [ ,  ]])

混同マトリックスを使用してモデルを評価しました。 次に、開発したモデルを使用して、単一の予測を作成します。

ステップ7-単一の予測を行う

このステップでは、モデルを持つ1人の従業員の詳細を考慮して、単一の予測を行います。 これを達成するには、一人の従業員が退職する確率を予測します。 この従業員の機能を `+ predict `メソッドに渡します。 前に行ったように、機能もスケーリングし、 ` numpy +`配列に変換します。

従業員の機能を渡すには、セルで次のコードを実行します。

new_pred = classifier.predict(sc.transform(np.array([[0.26,0.7 ,3., 238., 6., 0.,0.,0.,0., 0.,0.,0.,0.,0.,1.,0., 0.,1.]])))

これらの機能は、単一の従業員の機能を表します。 手順1のデータセットに示されているように、これらの機能は、満足度、最終評価、プロジェクト数などを表します。 ステップ3で行ったように、深層学習モデルが受け入れられるように機能を変換する必要があります。

次のコードで50%のしきい値を追加します。

new_pred = (new_pred > 0.5)
new_pred

このしきい値は、確率が50%を超えると従業員が退職することを示しています。

出力から、従業員が退職しないことがわかります。

Outputarray([[False]])

モデルに低いしきい値または高いしきい値を設定することもできます。 たとえば、しきい値を60%に設定できます。

new_pred = (new_pred > 0.6)
new_pred

この新しいしきい値は、従業員が退職しないことを引き続き示しています。

Outputarray([[False]])

このステップでは、1人の従業員の特徴を考慮して、1つの予測を行う方法を見てきました。 次のステップでは、モデルの精度の改善に取り組みます。

ステップ8-モデルの精度を向上させる

モデルを何度もトレーニングすると、異なる結果が得られます。 各トレーニングの精度には大きなばらつきがあります。 この問題を解決するには、_K-fold cross-validation_を使用します。 通常、Kは10に設定されます。 この手法では、モデルは最初の9つのフォールドでトレーニングされ、最後のフォールドでテストされます。 この繰り返しは、すべてのフォールドが使用されるまで続きます。 各反復は独自の精度を提供します。 モデルの精度は、これらすべての精度の平均になります。

`+ keras `を使用すると、 ` KerasClassifier `ラッパーを介してK倍交差検証を実装できます。 このラッパーは、 ` scikit-learn `の相互検証によるものです。 まず、 ` cross_val_score `クロス検証関数と ` KerasClassifier +`をインポートします。 これを行うには、ノートブックセルに次のコードを挿入して実行します。

from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score

`+ KerasClassifier +`に渡す関数を作成するには、次のセルに次のコードを追加します。

def make_classifier():
   classifier = Sequential()
   classifier.add(Dense(9, kernel_initializer = "uniform", activation = "relu", input_dim=18))
   classifier.add(Dense(1, kernel_initializer = "uniform", activation = "sigmoid"))
   classifier.compile(optimizer= "adam",loss = "binary_crossentropy",metrics = ["accuracy"])
   return classifier

ここでは、 `+ KerasClassifier `に渡す関数を作成します。この関数は、分類子が予期する引数の1つです。 この関数は、以前に使用したニューラルネットワーク設計のラッパーです。 渡されるパラメーターも、チュートリアルの前半で使用したパラメーターに似ています。 関数では、最初に ` Sequential()`を使用して分類子を初期化し、次に ` Dense +`を使用して入力レイヤーと出力レイヤーを追加します。 最後に、分類子をコンパイルして返します。

作成した関数を `+ KerasClassifier +`に渡すには、次のコード行をノートブックに追加します。

classifier = KerasClassifier(build_fn = make_classifier, batch_size=10, nb_epoch=1)

`+ KerasClassifier +`は3つの引数を取ります:

  • + build_fn +:ニューラルネットワーク設計の関数

  • + batch_size +:各反復でネットワーク経由で渡されるサンプルの数

  • + nb_epoch +:ネットワークが実行するエポックの数

次に、Scikit-learn `+ cross_val_score`を使用して相互検証を適用します。 ノートブックのセルに次のコードを追加して実行します。

accuracies = cross_val_score(estimator = classifier,X = X_train,y = y_train,cv = 10,n_jobs = -1)

折り数を10に指定したため、この関数は10の精度を提供します。 したがって、それをaccuracies変数に割り当て、後でそれを使用して平均精度を計算します。 以下の引数を取ります。

  • + estimator +:定義したばかりの分類子

  • + X +:トレーニングセット機能

  • + y +:トレーニングセットで予測される値

  • + cv +:折り畳みの数

  • + n_jobs +:使用するCPUの数(-1を指定すると、使用可能なすべてのCPUが使用されます)

交差検定を適用したら、精度の平均と分散を計算できます。 これを実現するには、次のコードをノートブックに挿入します。

mean = accuracies.mean()
mean

出力では、平均が83%であることがわかります。

Output

精度の分散を計算するには、次のコードを次のノートブックセルに追加します。

variance = accuracies.var()
variance

分散が0.00109であることがわかります。 分散は非常に低いため、モデルのパフォーマンスが非常に高いことを意味します。

Output

K-Fold相互検証を使用して、モデルの精度を改善しました。 次のステップでは、オーバーフィットの問題に取り組みます。

ステップ9-過剰適合と戦うためのドロップアウト正則化の追加

予測モデルは、_オーバーフィッティング_として知られる問題を起こしやすいです。 これは、モデルがトレーニングセットの結果を記憶するシナリオであり、モデルが表示されていないデータを一般化することはできません。 通常、精度に非常に大きなばらつきがある場合、過剰適合を観察します。 モデルの過剰適合と戦うために、モデルにレイヤーを追加します。

ニューラルネットワークでは、_dropout regularization_は、ニューラルネットワークに `+ Dropout `レイヤーを追加することでオーバーフィットと戦う手法です。 各反復で非アクティブ化するニューロンの数を示す「 rate +」パラメーターがあります。 ネルロンを無効にするプロセスは通常ランダムです。 この場合、レートとして0.1を指定します。これは、トレーニングプロセス中にニューロンの1%が非アクティブになることを意味します。 ネットワーク設計は同じままです。

`+ Dropout +`レイヤーを追加するには、次のセルに次のコードを追加します。

from keras.layers import Dropout

classifier = Sequential()
classifier.add(Dense(9, kernel_initializer = "uniform", activation = "relu", input_dim=18))
classifier.add(Dropout(rate = 0.1))
classifier.add(Dense(1, kernel_initializer = "uniform", activation = "sigmoid"))
classifier.compile(optimizer= "adam",loss = "binary_crossentropy",metrics = ["accuracy"])

入力レイヤーと出力レイヤーの間に「+ Dropout 」レイヤーを追加しました。 ドロップアウト率を0.1に設定すると、トレーニングプロセス中に15個のニューロンが非アクティブになり、分類器がトレーニングセットに過剰適合しなくなります。 ` Dropout +`と出力レイヤーを追加した後、以前と同様に分類子をコンパイルしました。

このステップでは、 `+ Dropout +`レイヤーを使用して過剰適合と戦うように努力しました。 次に、モデルの作成中に使用したパラメーターを調整して、モデルのさらなる改善に取り組みます。

ステップ10-ハイパーパラメーターの調整

_Grid search_は、さまざまなモデルパラメーターを試して、最高の精度が得られるパラメーターを取得するために使用できる手法です。 この手法では、さまざまなパラメーターを試し、最良の結果が得られるパラメーターを返します。 グリッド検索を使用して、ディープラーニングモデルに最適なパラメーターを検索します。 これにより、モデルの精度が向上します。 `+ scikit-learn `は、この機能を有効にする ` GridSearchCV `関数を提供します。 ここで、 ` make_classifier +`関数を変更して、さまざまなパラメーターを試してみます。

このコードをノートブックに追加して、 `+ make_classifier +`関数を変更し、異なるオプティマイザー関数をテストできるようにします。

from sklearn.model_selection import GridSearchCV
def make_classifier(optimizer):
   classifier = Sequential()
   classifier.add(Dense(9, kernel_initializer = "uniform", activation = "relu", input_dim=18))
   classifier.add(Dense(1, kernel_initializer = "uniform", activation = "sigmoid"))
   classifier.compile(optimizer= optimizer,loss = "binary_crossentropy",metrics = ["accuracy"])
   return classifier

最初に、 `+ GridSearchCV `をインポートします。 次に、さまざまなオプティマイザを試すことができるように、 ` make_classifier +`関数に変更を加えました。 分類子を初期化し、入力レイヤーと出力レイヤーを追加してから、分類子をコンパイルしました。 最後に、使用できるように分類子を返しました。

手順4と同様に、次のコード行を挿入して分類子を定義します。

classifier = KerasClassifier(build_fn = make_classifier)

`+ build_fn `パラメーターを介した関数を想定している ` KerasClassifier `を使用して分類子を定義しました。 ` KerasClassifier `を呼び出し、先ほど作成した ` make_classifier +`関数を渡しました。

ここで、実験するいくつかのパラメーターの設定に進みます。 このコードをセルに入力して実行します:

params = {
   'batch_size':[20,35],
   'epochs':[2,3],
   'optimizer':['adam','rmsprop']
}

ここで、さまざまなバッチサイズ、エポック数、さまざまなタイプのオプティマイザー関数を追加しました。

あなたのような小さなデータセットの場合、20〜35のバッチサイズが適切です。 大規模なデータセットの場合、より大きなバッチサイズで実験することが重要です。 エポックの数に低い数値を使用すると、短期間で結果を得ることができます。 ただし、サーバーの処理速度によっては、完了するまでに時間がかかる大きな数値を試すことができます。 このタイプのニューラルネットワークには、「+ keras 」の「 adam 」および「 rmsprop +」オプティマイザーが適しています。

ここで、定義したさまざまなパラメーターを使用して、 `+ GridSearchCV +`関数を使用して最適なパラメーターを検索します。 これを次のセルに入力して実行します。

grid_search = GridSearchCV(estimator=classifier,
                          param_grid=params,
                          scoring="accuracy",
                          cv=2)

グリッド検索機能では、次のパラメーターが必要です。

  • + estimator +:使用している分類子。

  • + param_grid +:テストするパラメーターのセット。

  • + scoring +:使用している指標。

  • + cv +:テストするフォールドの数。

次に、この `+ grid_search +`をトレーニングデータセットに適合させます。

grid_search = grid_search.fit(X_train,y_train)

出力は次のようになります。完了するまでしばらくお待ちください。

OutputEpoch 1/2
5249/5249 [==============================] - 1s 228us/step - loss: 0.5958 - acc: 0.7645
Epoch 2/2
5249/5249 [==============================] - 0s 82us/step - loss: 0.3962 - acc: 0.8510
Epoch 1/2
5250/5250 [==============================] - 1s 222us/step - loss: 0.5935 - acc: 0.7596
Epoch 2/2
5250/5250 [==============================] - 0s 85us/step - loss: 0.4080 - acc: 0.8029
Epoch 1/2
5249/5249 [==============================] - 1s 214us/step - loss: 0.5929 - acc: 0.7676
Epoch 2/2
5249/5249 [==============================] - 0s 82us/step - loss: 0.4261 - acc: 0.7864

次のコードをノートブックセルに追加して、 `+ best_params_ +`属性を使用してこの検索から最適なパラメーターを取得します。

best_param = grid_search.best_params_
best_accuracy = grid_search.best_score_

次のコードを使用して、モデルに最適なパラメーターを確認できるようになりました。

best_param

出力は、最適なバッチサイズが「20」であり、エポックの最適な数が「2」であり、「+ adam +」オプティマイザーがモデルに最適であることを示しています。

Output{'batch_size': 20, 'epochs': 2, 'optimizer': 'adam'}

モデルに最適な精度を確認できます。 「+最高精度の数値」は、グリッド検索の実行後に最高のパラメーターから取得した最高の精度を表します。

best_accuracy

出力は次のようになります。

Output

`+ GridSearch `を使用して、分類器に最適なパラメーターを見つけました。 最高の ` batch_size `は20であり、最高の ` optimizer `は ` adam +`オプティマイザーであり、最高のエポック数は2であることがわかりました。 また、85%として分類器の最高の精度を得ています。 従業員が最大85%の精度で滞在または退職するかどうかを予測できる従業員維持モデルを構築しました。

結論

このチュートリアルでは、https://keras.io [Keras]を使用して、従業員が退職する確率を予測する人工ニューラルネットワークを構築しました。 これを達成するために、 `+ scikit-learn `を使用して機械学習の以前の知識を組み合わせました。 モデルをさらに改善するには、「 keras +」とは異なるhttps://keras.io/activations/[activation functions]またはhttps://keras.io/optimizers/[optimizer functions]を試してください。 また、異なる数の折り畳みを試したり、異なるデータセットでモデルを構築することもできます。

機械学習分野のその他のチュートリアルやTensorFlowの使用については、https://www.digitalocean.com/community/tutorials/how-to-build-a-neural-network-to-recognize-handwritten-digitsを構築してみてください。 -with-tensorflow [手書き数字を認識するニューラルネットワーク]またはその他のDigitalOcean https://www.digitalocean.com/community/tags/machine-learning/tutorials [機械学習チュートリアル]。