今回は、AlteyrxのNeural Network(NN)モデルをチューニングしてみたいと思います。
UCIのBike SharingデータでNNだけいまいち精度が出なかったので、そんなNNって精度出ないことないでしょ!ってことで、チューニングしてみたいと思います。
ちなみに、他のモデルとハイパーパラメーターのデフォルト値で比較したときに、以下の通りNeural Newtorkはいまいち結果が悪かったです。
チューニングで他のデフォルト値並みになるのでしょうか?せめてCorrelationで0.9近くまでは行きたいところです。
なお、Neural Networkモデルについては「Alteryxのニューラルネットワークツールを読み解く」を参考にしてください。
分析するデータについて
UCIのBike Sharingデータですが、以下のようなデータです。
- UC Irvine Mahine Lerning Repositoryから入手できるデータ
- Bike Sharing Dataset
- シェアバイクの利用者数のデータ
- 日付、天気、気温、などが予測変数。ターゲット変数は「Registered」(登録ユーザーのカウント)、「Casual」(非登録ユーザーのカウント)、「cnt」(RegisteredとCasualのカウントの合計)。今回のターゲット変数は「Registered」です。
- 日付ごとのデータと時間ごとのデータがありますが、今回は日付ごとのデータを使用します。
Neural Networkのハイパーパラメータについて
Neural Networkの場合、主にチューニングするハイパーパラメータは、以下の赤枠内のパラメータになります。
カスタムスケーリング/正規化
まず、「カスタムスケーリング/正規化」から調べましょう。デフォルトはオフですが、これは内部的に自動的にスケーリングされるから不要、とされています。
比較したときの結果は以下の通り。
今回のデータでは、このオプションは入れないほうがいいようです。なぜかめちゃくちゃ値が悪くなります・・・。
バッチマクロ化による効率的なチューニング
それでは、それぞれのパラメータについてチューニングしてみたいと思います。チューニングする際、いちいち手入力しているとめんどくさいので、バッチマクロ化して一気にパラメーターを変更できるようにしたいと思います。なお、「カスタムスケーリング/正規化」は、「使わない」という方向性で良いと結論づけたので、「しない」に固定します。
まず、パラメータを変更するバッチマクロを作ります。変更するパラメータとしては以下のとおりです。
- 非表示レイヤーのノード数(NumNodes)
- 重み減衰(WeightDelay)
- ゼロ付近の初期重みの+/-範囲(WeightRange)
- モデルで許容される加重の最大数(MaxWeight)
- モデル推定の最大反復回数(MaxIteration)
このマクロを以下のように組み込みます。
このテキスト入力ツールに変更したいパラメータを記載します。
非表示レイヤーのノード数(NumNodes)
それでは、まず非表示レイヤーのノード数を見ていきましょう。以下のように、ノード数以外の項目は固定にしておきます。
これにより、モデル比較ツールにて、以下のような結果が得られました。
この結果からは1が最も良さそうです。でも10も良いですね・・・。結果が規則性がないようでなにかしらあたりを付けるのが難しそうなので、とりあえず30まで1ずつ確認したいと思います。
手で入力している面倒なので、行生成ツールで以下のようなワークフローにしてみましょう。これにより30までの値をすべて簡単に調べることが可能です。
結果は以下のとおりです。
やはり規則性がないですね。なにげに、1が一番良いです。
重み減衰(WeightDecay)
この値は0~1の間で設定可能で、大きいとモデルのトレーニング中に可能な重みの調整が制限される、というものです。一般的には0.01~0.2とのことですが、デフォルトは、0.1となっています。
基本的には小さい値にしたほうが良さそうに思います。
一旦、0~1の間で0.1刻みで見てみましょう。
この値も法則性がなさそうです。小さい値の方が原理的には良さそうなので、0~0.3くらいまで0.01刻みで見てみましょう。
結果的には1が一番良い値でした。0.3までなら、0.1が良い値です。これも規則性がありません。
ゼロ付近の初期重みの+/-範囲(WeightRange)
このパラメータは、隠れ層の初期ランダム重みの範囲を制限するものです。
一般的にはこの値は0.5ということなのですが、入力される変数の値が大きい場合、より低い値に設定した方が良いモデルとのことです。値を0に設定すると、オートで設定されます。設定可能な値の範囲は、0~3です。ちなみに、デフォルト値はなぜか0.7です。
今回の場合、変数の値としては、大きくないので、大きめの値でも良いと考えられます。
WeightRangeを0から2.9まで見てみましょう。
これによると、結構規則性がないのですが、とりあえず一番良い値は1.6のようです。
モデルで許容される加重の最大数(MaxWeight)
このパラメータは、隠れ層に多数の予測変数とノードがある場合に重要になるという変数です。
「コード内には許容可能な最大値というものは存在しません。そのため、多くの予測変数と隠れ層のノードがある場合にモデルのトレーニングに時間がかかるケースがあります。加重の数を減らすと、処理速度がアップします。モデルから除外された重みは暗黙的に0になります。」とのことなので、減らすことで処理速度がアップする効果が望めます。
デフォルト値は1000なのですが、結論からいくと、今回のデータでは400未満ではエラーとなってしまいました。また、数を大きくしても結果は変わりませんでした。
ただし、Designer付属のサンプルデータでは、100などでも動いたので、中身のデータにもよるのかもしれません。
ノード数が多い状況では変更すると結果が変わるかもしれません。また、予測変数でも変わるようなのですが、今回は16フィールド。Designerのサンプルでも28フィールドでした。
モデル推定の最大反復回数(MaxIteration)
デフォルト値は100です。最大回数なので、変化がなくなったらそこで止まるということになるので、大きめに設定しても良いのかもしれません。ただし、この値が大きくなると実行に時間がかかるので要注意です。
100から1000まで試してみました。
意外と値の変化が少ないように思います。あまり触らなくても良い感じです。ただ、色々と触っていると大きくした方が良い結果が出る場合もありました。
ハイパーパラメータのチューニングについて
手動で調整するパラメータはハイパーパラメータと呼ばれていますが、この調整でよく使われるのがグリッドサーチです。今回、Neural Networkのハイパーパラメータをそれぞれのパラメータ一つだけ動かしてみましたが、出てくる結果にほとんど法則性がありませんでした。このようなケースでは総当たりなどの方法で決めることしかできません(いくつか方法はあるのですが、基本的には数をこなしてチューニングする形になります)。
実際、今回得られた良いパラメータだけでやってみましょう。
片方は、デフォルト値で、もう片方は、NumNodesが1、WeightDecayが1、WeightRangeが1.6とします。MaxWeightは1000、MaxIterationは100で固定します。
結果は以下の通り、最適化と思われたパラメータセットの方が、むしろ悪化してますね・・・。
初期値であまり値の変わらなかったMaxWeight、MaxIterationは触らず、その他のNumNodes、WeightDecay、WeightRangeだけ動かしてみましょう。
- NumNodes・・・1~15、1刻み(15パターン)
- WeightDecay・・・0.05~0.2、0.01刻み(15パターン)
- WeightRange・・・0.1~2、0.1刻み(19パターン)
これで、4275パターンとなります。
ワークフローとしては、以下のように作ってみました。
これ、実行するのに結構時間がかかるのですが(途中で何かあっても良いように、各モデルはマクロ内で保存するようにしています)、結果としてRMSEの低い順に並べてTop10を抽出しました。
モデル名にどのパラメータがどの値か、というのがわかるようになっていますが、改めて値を変更しているもののみわかるようにしてみましょう。
これくらいの値なら、他の予測モデルと遜色ない結果になったかと思います。結果として、NumNodesが1、WeightDecayが0.1、WeightRangeが0.3という形に落ち着きました。
まとめ
- Neural Networkモデルのハイパーパラメーターチューニングを行いました
- 実はこれ以外にも予測変数の決定という課題もありますが、ここではあえてハイパーパラメータのみにしぼっています
- 結果がランダムな動きをするので、パターンをこなすしか無さそうです(あるパラメータの結果がある値でよくても、他のパラメータセットに組み込むと結果が良くなりませんでした)
コメント