機械学習アプリケーションの時間データを処理するための一般的/ベストプラクティスは何ですか?
たとえば、データセットに「2014-05-05」などのイベントのタイムスタンプを持つ列がある場合、この列から有用な機能を抽出する方法はありますか?
前もって感謝します!
機械学習アプリケーションの時間データを処理するための一般的/ベストプラクティスは何ですか?
たとえば、データセットに「2014-05-05」などのイベントのタイムスタンプを持つ列がある場合、この列から有用な機能を抽出する方法はありますか?
前もって感謝します!
回答:
時間変数と他の変数をグラフ化し、傾向を調べることから始めます。
この場合、定期的な週次トレンドと長期的な上昇トレンドがあります。したがって、2つの時間変数をエンコードする必要があります。
day_of_week
absolute_time
傾向が発生する一般的な時間枠はいくつかあります。
absolute_time
day_of_year
day_of_week
month_of_year
hour_of_day
minute_of_hour
これらすべての傾向を探してください。
奇妙なトレンドも探してください。たとえば、まれではあるが永続的な時間ベースの傾向が表示される場合があります。
is_easter
is_superbowl
is_national_emergency
etc.
多くの場合、イベントを時間にマッピングする外部ソースに対してデータを相互参照する必要があります。
グラフ作成が非常に重要だと思う2つの理由があります。
奇妙な傾向
一般的な傾向は非常に簡単に自動化できます(毎回追加するだけです)が、奇妙な傾向を見つけるには、人間の目と世界の知識が必要になることがよくあります。これが、グラフ作成が非常に重要な理由の1つです。
データエラー
多くの場合、データには重大なエラーがあります。たとえば、日付が2つの形式でエンコードされていて、そのうちの1つだけがプログラムに正しくロードされていることがわかります。そのような問題は無数にあり、驚くほど一般的です。これは、グラフが時系列だけでなく、あらゆるデータにとって重要だと思うもう1つの理由です。
ベンとナールは、日付時刻オブジェクトそれを見逃すだろう-うまく説明し、日付と時刻の部分のバケットに日付時刻オブジェクトを破壊することは、完全な(ユニークで通常さらに悪いことには)季節のトレンドを、検出に役立つだろう
興味のある特定の機械学習アルゴリズムについては言及しませんでしたが、k-meansのような距離ベースのクラスタリングにも興味がある場合は、date-timeオブジェクトをunix-time形式に一般化します。これにより、アルゴリズムの単純な数値距離比較が可能になり、2つの日付値がどれだけ離れているかを簡単に示すことができます。
あなたの例では、日付のみの値2014-05-05を1399248000に一般化します(Unix時間は2014年5月5日の開始、UTC)。
[日付時刻を可能なすべての日付時刻部分にバケット化することでそれを達成できると主張することもできます。そのため、距離測定用のunix-timeと、いくつかのdate-timeバケットを組み合わせることをお勧めします]
ベンは静的機能について話し、タイムスタンプ機能を利用します。
拡張機能として、ラグ機能を紹介します。生の時系列ではなく、その集計です。
最も神秘的な部分は、私たちにとって将来の価値が見えないということです。トレーニングデータでその集計機能をどのように使用できますか。
ちょっとした例: 1991年から2015年までの年間電力消費量データがあります。2016年から2020年までの将来5年間の電力消費量を予測します。電力消費量の過去5年間の移動平均を2020年の特徴値として計算しますが、 2016年から2020年は不明であるため、5年の時系列をリードして(遅れとは反対に)2010年から2015年に移動平均を行い、この値を2020年の特徴値として使用します。したがって、将来の5年間の特徴データを構築できます。
次のステップは、移動関数(count \ mean \ median \ min \ max.etc)を使用して、異なるウィンドウを試すだけです。その後、多くの機能を構築します!
日付/時刻情報に関心があるものに応じて、単にビンに入れたい場合があります。たとえば、開始点からの距離に関心があり(たとえば、2015年1月1日)、月単位で測定する場合は、月1(2015年1月1〜31日)、2 (2015年2月1〜28日)、3、4、5、6など。開始日間の距離はほぼ同じであるため、これは単純な連続形式で時間距離を表します。6.5か月と言うことができ、2015年6月の中旬であることを知っているので、連続と言います。実際の日付コーディングについて心配する必要はなく、すべての一般的な分類方法を使用できます。
数日で測定したい場合、分類の前にデータをプルするためにそれを使用する場合、MySqlには 'to_days'関数があることがわかります。Pythonはおそらく似たようなものを持っているか、またはmorkによって提案されたunix-time形式を使用します。
お役に立てれば!
これが一般的/ベストプラクティスであるかどうかはわかりませんが、それは問題の別の観点です。
たとえば、日付がある場合、各フィールドを「連続変数」ではなく「カテゴリ変数」として扱うことができます。日にはセット{1、2 ...、31}の値があり、月には{1、...、12}の値があり、年には最小値と最大値を選択しますセットを作成します。
次に、日、月、年の特定の数値はデータの傾向を見つけるのに役立たない可能性があるため、各ビットを特徴とするバイナリ表現を使用して数値をエンコードします。たとえば、5か月目は0 0 0 0 1 0 0 0 0 0 0 0
(11 0は5番目の位置で1で、各ビットが機能です)。
したがって、たとえば「年のセット」に10年があると、日付は43個の特徴のベクトル(= 31 + 12 + 10)に変換されます。「スパースベクトル」を使用すると、特徴の量は問題になりません。
同様のことが、時間データ、曜日、月の日付についても実行できます...
それはすべて、機械学習モデルに答えてほしい質問に依存します。
私の回答の背景:これまでに素晴らしい回答がありました。しかし、この特定の時系列の将来の値を予測するための機械学習アプリケーションについて話していると想定して、会話を広げたいと思います。そのコンテキストを念頭に置いて、私のアドバイスを以下に示します。
アドバイス:予測パフォーマンスのベースラインとして、最初に従来の統計的予測戦略(つまり、指数平滑法、SARIMAXまたは動的回帰)を調べます。機械学習はさまざまなアプリケーションに大きな可能性を示していますが、時系列では、アプリケーションにより適した統計的手法が試行されています。最近の2つの記事に注目してください。
優れたパフォーマンスを求めている場合は、いくつかのモデル(MASEなど)と比較するメトリックを選択し、いくつかの統計(下記参照)および機械学習モデル(上記の機能開発戦略を使用)をスイープします。
乾杯、
統計的予測を学習するためのリソース:https ://otexts.org/fpp2/のRob J Hyndmanによる無料の教科書を確認することから始めます。テキストは、分析に簡単に組み込むことができるRパッケージhttps://otexts.org/fpp2/appendix-using-r.htmlに基づいています。最後に、ここで説明されているように、クロスセクションクロスバリデーションと時系列クロスバリデーションの違いに注意してください:https : //robjhyndman.com/hyndsight/tscv/。