お世話になっております。
現在PythonAPIより時系列予測の実施を行っております。
下記の様なコードで予測実施した場合、
全ての「すべてのバックテスト」が実施されない状態となります。
※これは処理時間の軽減のためと認識しております
----------
project.set_target(
target=config.targetColumn,
mode=AUTOPILOT_MODE.FULL_AUTO, # QUICKでは5件、FULL_AUTOでは9件程度の全バックテスト実施
partitioning_method=time_partition,
metric='RMSE',
max_wait=3600,
worker_count=-1
)
----------
上記を実施後、オートパイロットの完了を待ち、
models = project.get_models(with_metric=True)
で全てのモデルを取得し、バックテストが完了していないモデルに対して
下記のコードを実行しましたが、エラーが発生しました。model.request_training_predictions(DATA_SUBSET.ALL_BACKTESTS )
エラーは下記となります。
422 client error: {'message': 'allBacktests prediction set not valid if not all backtests have been computed'}
恐らく実施していないバックテストを実行してやる必要があると思われますが、その方法が分からなく困っております。
想定する挙動としては、Webの「モデル」画面の
「すべてのバックテスト」項目の「実行」リンクを押した時の処理となります。
上記につきまして確認したい事が3点ございます
1. 時系列予測時にすべてのバックテスト実施は可能になりますでしょうか?
→ set_targetのmodeに"comprehensive"を設定したところエラーとなりました
2. 1が不可能である場合、APIからのすべてのバックテスト実行手順がありましたらご教示頂けると幸いです
3. 2の実行は非同期実行となると考えております。こちらの終了を検知する術はございますでしょうか?
→ project.wait_for_autopilot()の様な関数を想定しております
@k-arai さん
ご質問頂き、ありがとうございます!
Python APIを利用した時系列モデリングについて回答いたします。
まず、頂いたコメントの通りで、「すべてのバックテスト」が実施されないのは処理時間の軽減のためです。これによって、より短時間でモデル選定できるようになっています。
また、model.request_training_predictions(DATA_SUBSET.ALL_BACKTESTS )実行時のエラーについても、「すべてのバックテスト」の計算を実施していないときに表示されます。
そこで、「どのように、すべてのバックテストを実行するのか?」について回答いたします。
1. 時系列予測時にすべてのバックテスト実施は可能になりますでしょうか?
→ set_targetのmodeに"comprehensive"を設定したところエラーとなりました
残念ながら時系列予測時にすべてのバックテスト実施はできません。一方で、モデリング後に、APIですべてのバックテストを実行することができます(2を参照ください)。
また、時系列モデリングの場合、”comprehensive”モードには対応していません。
2. 1が不可能である場合、APIからのすべてのバックテスト実行手順がありましたらご教示頂けると幸いです
モデリング後に、APIですべてのバックテストを実行する手順を以下に記載します。時系列モデルなので、project.get_models()ではなくproject.get_datetime_models()でモデル取得するのがポイントです。また、既にバックテストが実施されているモデルは、model.score_backtests()でエラー出力するので例外処理しています。
#時系列モデルを取得
models = project.get_datetime_models()
#並列でバックテスト実行
for model in models:
try:
model.score_backtests()
except:
continue
3. 2の実行は非同期実行となると考えております。こちらの終了を検知する術はございますでしょうか?
2の実行は非同期実行です。そこで、2を実行した後に、下記スクリプトを実行することで、プロジェクトで現在回っているjobのリストを取得し、全てのJobが完了したかどうか確認できます。
jobs_list = project.get_all_jobs()
for job in jobs_list:
job.wait_for_completion(max_wait=60000)
以上、記載の通り、一括でバックテストの実行ができるのは、Python APIならではのメリットですので、是非お試しください。不明点などありましたら、お気軽にご質問ください。
ご回答頂いた内容にて、時系列予測時の想定していた操作が実行出来る事を確認しました。
ありがとうございます。
お忙しいところ恐縮ですが追加で質問をさせてください。
数値予測の際にmodeに「comprehensive」を設定する事で全ての交差判定が実施される認識でしたが、
実際に試したところ、モデル(ブループリント)の75件中15件までの実行となりました。
「comprehensive」を設定しても必ずしも全件実行とはならないものでしょうか?
APIには下記の様に記載がありました。
AUTOPILOT_MODE.COMPREHENSIVE: Runs all blueprints in the repository (warning: this may be extremely slow)
set_targetのコードは下記となります
----------
project.set_target(
target=config.targetColumn,
mode=AUTOPILOT_MODE.COMPREHENSIVE,
max_wait=3600,
worker_count=-1
)
----------
また、個別の交差判定実施はmodel.cross_validate()でwebの「実行」リンクと同一の動きである認識ですが、
こちらに関して認識は合っておりますでしょうか。
@k-arai さん
実行確認して頂けたとのこと、ありがとうございます!
追加の質問について回答いたします。
「comprehensive」モードはこちらのドキュメント の「包括的なオートパイロット」に対応し、すべてのリポジトリモデリングブループリントを実行します。これは、モデルの精度を高めるために行われます。
そのため、「comprehensive」モードでも「すべてのバックテスト」が実行されるわけではありません。こちらはモデリングにかかる時間を短縮するためです。
また、model.cross_validate()で「すべてのバックテスト」の「実行」リンクと同一です。ご認識の通りです。
ご不明点などありましたらお気軽にご質問ください。
「comprehensive」モードについてご回答頂きありがとうございます。
本モードの実行にて、数多くのモデルで予測実施可能である事を確認できました。
「comprehensive」モードで予測実施した際に、提示された全てのモデルで予測実施したところ、
かなり高精度な予測が出来たモデルがありました。
※既に結果が出ているデータにて予測実施
しかし、これらのモデルの「検定」、「交差検証」、「ホールドアウト」の値はとても大きく、
上記データから適切なモデルを数値的に判定する術が分からない状態となっております。
モデルの「評価」項目にある、「リフトチャート」や「残差」等の値も、
モデルの選定に利用可能かと考えておりますが、DataRobotにおけるモデル選定では、
どの様な値を元にモデル選定を行う等の実例等がありましたらご教示頂きたいと存じます。
@k-arai さん
「モデル選定」についてご質問ありがとうございます。
「検定」「交差検定」「ホールドアウト」の欄ではRMSEなどの精度サマリを確認できます。
一方で、「リフトチャート」や「残差」を見ることで、より詳細なモデル選定が可能です。
「リフトチャート」は、予測値の領域ごとに予測と実測の差を見ることができ、また全領域に共通のバイアス(下振れしていないか)など、を確認できます。
「残差」では、どのレンジでどれだけ残差があるのか、また外れ値があるのか確認できます。なお、外れ値の影響で、RMSEなどのスコアが悪くなることがあります。
詳しくはこちらのモデルレビューをご覧ください。
p.33, p.34で「リフトチャート」と「残差」の見方についてご紹介しています。
また、その他の方法としては、実際にそのモデルを運用した場合、どれくらいの業務効果があるのかのシミュレーションがモデル運用の決め手になるケースもございますのでご検討ください。