トレインセットとテストセットの間にギャップがある時系列データのウォークフォワードcvを実装します。
拡大する
@saninsteinなぜギャップなのか?
@clstaudtギャップは、株式取引におけるモデル評価に役立つ機能です。 価格予測では、モデルがトレーニングセットの直後にデータに対して非常に良好に機能し、時間の経過とともに劣化する場合が非常に一般的です。 したがって、場合によっては、トレーニングセットの後に発生した少量の「適切な」データをスキップすると便利なことがあります。
時系列関連の機能に関する私たちの通常の立場は、それがsklearnの範囲外であるということだと思います(少なくとも今のところ)。 そして私にとっては、タイムスタンプなどのサンプルプロパティがデータに添付されたら、問題を再検討することは理にかなっています。
これについて@ scikit-learn / core-devsから少なくとも1つの意見を聞きたいのですが、私の投票は今のところ「修正されない」解決策です。
@adrinjalali sklearnには、
どれ?
@adrinjalalisklearnにすでに実装されているTimeSeriesSplitがあります:)
TimeSeriesSplitは、提案されたWalkForwardCVの特定のケースです( gap=0, expanding=True
引数で実現できます)。実際、TimeSeriesSplitはWalkForwardCVに簡単に置き換えることができます(前述のようにデフォルトの引数を設定するだけです)。
私は株取引MLチームの一員であり、さまざまなsklearn機能とsklearn互換ライブラリを正常に使用しています。 適切なCVスプリッターが不足していたため、sklearnに戻すことにしましたが、そうでない場合は、内部で使用します:)
TimeSeriesSplitは、提案されたWalkForwardCVの特定のケースです(gap = 0、expanding = True argsで実現できます)。実際、TimeSeriesSplitはWalkForwardCVに簡単に置き換えることができます(前述のようにデフォルトの引数を設定するだけです)。
公平ですが、必要な機能を追加するために、下位互換性のある方法でTimeSeriesSplit
にパッチを適用しようと思います。 また、コミュニティに受け入れられる可能性も高くなります。
WalkForwardCVの場合は、時系列予測だけではありません。 データセットの観測が時間内に順序付けられ、検証を同じ方法で実行する必要がある場合に役立ちます。
たとえば、私たちのタスクの1つは、取引に「許可を与える」mlモデルを使用して既存の取引戦略を改善しようとするときに、取引フィルタリング分類の問題を失うことです。
公平ですが、必要な機能を追加するために、下位互換性のある方法でTimeSeriesSplitにパッチを適用しようと思います。 また、コミュニティに受け入れられる可能性も高くなります。
それが最善の解決策になると思います。
私は時系列予測モデルに取り組んでいるデータサイエンティストです。 時系列固有のものはscikit-learnの範囲外であると想定したため、このスレッドで説明されている方法とは少し異なる独自の検証コードの実装を開始しました。
その後、 TimeSeriesSplitの存在を知り、車輪の再発明を始めたかどうか疑問に思いました。 検証コードを既存の確立されたプロジェクトに提供したいと思います。
このようなモデル評価の需要は明らかなので、どこに当てはまるのだろうか。
時系列の予測に必要なパターンはたくさんあります。 私
たとえば、ウェーブレット機能を作成するトランスフォーマーは
とても便利です。
ただし、これらはscikit-learnの範囲外です。 それは役に立つでしょう
これらすべてを一貫した方法で実装するパッケージを作成します。 それ
おそらく勢いを増すでしょう。
これらすべてを一貫した方法で実装するパッケージを作成すると便利です。 それはおそらく勢いを増すでしょう。
はい。 サインアップしてください。
このようなパッケージをhttps://github.com/scikit-learn-contrib/に用意できれば幸いです
これを閉じてから:)
より良い時系列交差検定を追加することは範囲内だと思います。
#13666#13204#6322#13761も参照してください
スコープに関しては、これを一般的なユースケースに拡張することを受け入れるべきであるという
しかし、 @ amuellerも指摘しているように、実際には、既存のプルリクエストで会話を継続し、それらを快適な状態に移行する必要があります。
もちろんですが、データの実際のタイムスタンプが、単なる行数ではなく、分割(どのIMOである必要があるか)で重要になる場合には注意が必要です。 タイムスタンプをすぐに処理するつもりはないと思いますよね?
https://github.com/scikit-learn/scikit-learn/issues/3202で最初にこれを提案してから5年間で、この質問は、教育や応募の会話で少なくとも50回出てきました。 @saninstein 、ここに含めるか、-contribをプッシュするかを決定しましたか? これを(どこかで)乗り越えるために支援が必要なことがあれば、私は助けたいと思います。
私も貢献したいと思います。 これに関する別の問題を書き、TimeSeriesSplitを拡張するか、そのための別のパッケージの作成に協力したいと考えています。 これはCVドメインの分割に関連するものであり、sklearnに含める必要があると思います。
正直なところ、貢献したいので、どこに行けばいいのか、今何をしたらいいのか、完全に混乱しています。 私は自分の時間を心に留めており、コミュニティのために正しい方法でそれを使用したいと思います。
@mjbommar上記の私と@jnothmanが言っているように、私たちは前進することに非常にオープンであり、いくつかの既存のPR、特に#13761と#13204があり、2つのAPIに関するフィードバックをいただければ幸いです。
#13204が最も成熟しているように見えるので、そこから行くのが最も理にかなっていると思いますか? 応答が遅れていることを考えると、 @ kykosicがまだ作業中であるかどうかは
うーん、#13204はWalkForwardを実装していません...最初に#13204をマージしてから、後でWalkForwardを実装しますか?
それは別のCVオブジェクトである必要がありますか?
@amuellerこの投稿が出るまで、私は#13204について忘れていました。 私は来週にわたってそれに関するレビューに取り組み、それがまだ収まるかどうかを確認します。
@kykosic素晴らしい、ありがとう!
#13204が終了したため、なぜこの問題が解決されたのか知りたい。 #13204がこれの前提条件だと思いました。
gap
をTimeSeriesSplit
追加しました。
最も参考になるコメント
より良い時系列交差検定を追加することは範囲内だと思います。