Optunaを使ってXGBoostのハイパーパラメータチューニングをやってみる

使っている取引会社はどこ?
仮想通貨用(2019年5月からAPI取引対応) → GMOコイン
Python API用(FX APIはここしかない) → OANDA ジャパン

PFNさんが発表したばかりのベイズ最適化フレームワーク「Optuna」を使ってXGBoostのハイパーパラメータチューニングを行う方法まとめ。同じデータセットを使って、GridSearchCVとOptunaの簡単な比較をしてみます。

こんばんは、新米データサイエンティスト(@algon_fx)です。今月からジムも再開して、しっかり走り込んでいます。やっぱり人間、定期的なエクササイズは絶対に必要ですね。

さて、日本で機械学習に携わっている方であれば、12月初旬のビッグニュースを耳にした方も多いと思います。そうです!PFNさんからハイパーパラメータ最適化ツール「Optuna」が公開されました!

https://optuna.org/

まだベータ版とのことですが、データ分析を生業として生きている新米としては気になってしょうがない訳です(笑)

ってことで本日の記事は速報版として、リリースされたばかりのOptunaを使ってXGBoostのハイパーパラメータチューニングを行ってみました。使ってみた感想として・・もう素晴らしいの一言です!シンプルかつ直感的に操作できる点が特に素晴らしい!

機械学習の初心者の方向けの記事です。Optunaの使い方だけ見たいって方は、前半の解説は読み飛ばしてください。

ハイパーパラメータとは

そもそも機械学習でいうハイパーパラメータってなんなの?って話からです。世間では機械学習=人工知能的な文脈で扱われており、機械学習って大量のデータを勝手に機械が学習してくれるんでしょ?的な考えを持っている方も少なくないです。

これは大きな間違いです。

機械学習のほとんどの手法には「人間が決めなくてはいけない設定」があります。この設定がハイパーパラメータと呼ばれているのです。

ハイパーパラメータのイメージ

ハイパーパラメータによりアルゴリズムの挙動や手法の細かい動作などを設定することが可能です。機械学習手法に毎に設定しなくてはいけないハイパーパラメータ の項目数は異なります

シンプルな構造の手法であれば数個の設定で良いですし、最近流行りの深層学習やXGBoostともなるとハイパーパラメータの数はとても多いです。

ハイパーパラメータチューニングとは

ハイパーパラーメータに正解の値というのはありません。扱うデータセットの特性や、推測したいタスクなどにより細かく調整をしなくてはいけません。

この調整がハイパーパラメータチューニングと呼ばれるものです。機械学習の現場ではハイパーパラメータの値を試行錯誤を繰り返しながら調整します。

ハイパーパラメータの調整には様々な手法があります。ここではメジャーな2種類を紹介します。

グリッドサーチ
おそらく最もメジャーで使ったことがある方も多いと思います。グリッドサーチでは、検証をしたいハイパーパラメータの候補を用意して、それらの全ての組み合わせを試す方法です。例えば調整したいパラメータが2つ、それぞれ5個の候補があるとしたら、全ての組み合わせのモデルを構築するので合計25回のモデル訓練を行います。想像しやすいですが、計算コストが非常に高いです。大規模なデータかつ多数のパラメータの検証を行うのには適していません。

ベイズ最適化
上のグリッドサーチは全ての組み合わせを検証するので確実性はありますが使いづらい反面もあります。そこで、効率的に調整を行える手法としてベイズ最適化という選択肢があります。ベイズ最適化では、過去の試行結果から次に試す値を確率分布と関数に基づいて決めます。グリッドサーチは総当たりで検証するのに対し、ベイズ最適化はアルゴリズムにより最適すべきパラメータを探しながら調整を行なってくれるのです。

本記事の主題でもある「optuna」は、まさにベイズ最適化アルゴリズムの一種を利用したハイパーパラメータチューニングのフレームワークです!

そこで本記事ではグリッドサーチを手軽に行えるScikit-learnのGridSearchCVとOptunaを使って簡単な比較を行なってみます。

あらかじめ明記しますが、比較と言っても両手法の優劣をつけたい訳ではありません。両方ともメリット・デメリットがあります。比較と言っても、単純に同じデータと手法でチューニングをやってみようって話です。

本記事でやること

メインはOptunaの紹介ですが、簡単に扱うデータと推測するタスクを紹介します。

扱うデータはOANDA FX APIから取得したドル円の10分足データです。終値、始値、高値、安値が含まれています。(参考:OANDA APIの基本技10選

このデータを簡単な前処理を行い、10分後のドル円レートが今の終値から上昇するか下降するかを推測するタスクを行います。上昇すれば「1」、下降したら「0」と言った具合の分類問題です。モデリングはXGBoostを使います。(参照:XGBoostでFX予測

下の図は日足ですが、これが10分足になったイメージです。今の相場データから10分後の相場を推測する訳です。ご覧いただいてお判り頂けると思いますが、このモデルを使っても100%利益は出ません。解りやすいように極端に簡素化しています。

詳しくは「FXトレードでロジスティック回帰を独自テクニカル指標として活用する方法」をご参照ください。前処理などを詳しく解説しています。

推測するターゲットや特徴量をしっかり作り込めば、実際のトレードでも役に立ちます。本記事はあくまで初心者向けの実装方法チュートリアルですので悪しからず。

では、やって見ましょう!

STEP1 データの前処理

まずはデータの簡単をやっちゃいましょう。ご自身の環境で実装してみたい方は下記のリンクからCSVファイルをダウンロードしてください。

【使うCSVファイル】
usd_10min_api.csv

必要なライブラリをインポートします。

主役のOptunaは後ほどインストールを行なってインポートします。またグリッドーサーチの実装はScikit-learnのGridSearchCVを使います。おそらく最も一般的な実装法です。

では、ドル円の10分足データを読み込みましょう。

OANDA APIから取得したデータです。

ターゲットラベルの作成やら、訓練/テストデータへの分割やらの細かい作業を一気にやってしまいます。

詳細はコードを見てください。とてもシンプルな処理です。単純に10分後の終値と現在の終値の差分を計算して、上がっていれば1、下がっていたら0をターゲットして追加したのみです。

STEP2 グリッドサーチでXGBoostを調整

まずはグリッドサーチでXGBoostのハイパーパラメータをチューニングしてみましょう。今回調整するハイパーパラメータは以下の通りです。

n_estimators:決定木の本数
max_depth:各決定木の最大層数
subsample:サブサンプルの抽出割合
min_child_weight:子ノードの最小重みの制限

XGBoostにはハイパーパラメータが多数存在します。本来であればもっと細かい調整をしなくてはいけませんが、今回は特に重要な4つをグリッドサーチで交差検証します。

まずは検証するハイパーパラメータの値を作成しましょう。

全部で9つのハイパーパラメータを検証します。Numpyのバージョンによっては警告が出ることがあります。動作は問題なく行いますので警告を非常にしちゃいましょう。

ではGridSearchCVで交差検証してみましょう。交差検証の回数は3回します。一般的なPCのスペックで1分くらい掛かりますので注意ください。

完了したので最も最適なハイパーパラメータの組み合わせを確認してみます。

グリッドサーチで交差検証を行なった結果、今回の候補の中で最もスコアが高いのは上記の組み合わせでした。では、テストデータを使って推測してみましょう。

まぁこんなもんですよね(笑)。そもそも特徴量とか10分前の終値や安値と非常にシンプルなものですし。では正解率を確認してみます。

ランダムに予測するのと大差ない感じです(笑)。より精度を上げるためには様々なハイパーパラメータの値を繰り返し交差検証を行なって、精度を改善していく必要があります。

では、いよいよ主役のoptunaで調整をしてみましょう!

STEP3 XGBoostをoptunaで調整

まずはoptunaのインストールからしましょう。pip経由で簡単にインストール可能です。ターミナルまたはコマンドプロンプトで下記を実行してください。

インストールが完了したらJupyterノートブックで下記を実行してoptunaをインポートしましょう。

続いてXGBoostのインスタンスを生成します。

では、Optunaを使ってみましょう。詳しい操作方法は公式ドキュメンをご参照ください。Optunaですが目的関数を作って最適化を行うようです。

上の目的関数ですがXGBoostの調整したハイパーパラメータの候補値を設定して、訓練データで学習を行なった後にテストデータで推測して正解率を戻しています。

Optunaですが現在は最小化しか行えません。正解率を最適化する場合は本来は「最大化」ですが、あえて(1-正解率)とすることでOptunaの最小化に対応させています。(これが本当に正しい使い方なのかすこし不安が・・詳しい方がいればご指摘ください

では、やってみましょう!上記の目的関数を使ってStudyオブジェクトで最適化を行います。 n_trials で検証回数を指定します。今回は100回の検証としました。一般的なPCで10分程度時間がかかるのでご注意ください。

最適化が完了しました!結果を出力してみましょう。

Optunaで最適化を行なった結果、ベストスコアは0.4786と出ています。これは前述した通り(1-正解率)のスコアですので、正解率に直すと0.5214です。

では、Optunaが導き出した最適なハイパーパラメータを使ってテストデータで推測してみましょう。

明らかにグリッドサーチの結果よりも改善しているのが確認できますね。では正解率を算出してみましょう。

グリッドサーチでは0.5015に対して、Optunaは0.5185と約1.7ポイント近く改善しているのが確認できます!

まとめ

今回は日本のAIシーンを牽引しているPreferred Networksさんが発表したハイパーパラメータ最適化フレームワーク「Optuna」を使ってXGBoostの調整を行なってみました。

実際に使ってみた感想としては直感的に動かせるので大ファンになりました!今までもベイズ最適化を使ったフレームワークはHyperOptなどいくつか出ていましたが、これからはOptunaを間違いなく使うと思います!

ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!

使っているFX会社はどこ?
仮想通貨用(2019年5月からAPI取引対応) → GMOコイン
Python API用(FX APIはここしかない) → OANDA ジャパン

FX 機械学習

Posted by algon