機械学習-日付/時刻データからのエンジニアリング機能


45

機械学習アプリケーションの時間データを処理するための一般的/ベストプラクティスは何ですか?

たとえば、データセットに「2014-05-05」などのイベントのタイムスタンプを持つ列がある場合、この列から有用な機能を抽出する方法はありますか?

前もって感謝します!

回答:


44

時間変数と他の変数をグラフ化し、傾向を調べることから始めます。

例えば

ここに画像の説明を入力してください

この場合、定期的な週次トレンドと長期的な上昇トレンドがあります。したがって、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つの理由です。


7

データをウィンドウに分割し、自己相関係数、ウェーブレットなどのウィンドウの機能を見つけ、それらの機能を学習に使用します。

たとえば、温度と圧力のデータがある場合、それを個々のパラメーターに分解し、そのウィンドウ内の極小数などの特徴を計算し、モデルにこれらの特徴を使用します。


7

考慮すべきもう1つのことは、Ben Haleyが言ったすべてのことを超えて、ユーザーの現地時間変換することです。たとえば、すべてのユーザーで午後8時頃に発生する何かを予測しようとしている場合、UTC時間を見ると、予測が難しくなります。


6

時系列内のデータとイベントは季節的な場合があります。そのような場合、イベントの月と年が非常に重要です。したがって、このようなシナリオでは、バイナリ変数を使用して、イベントが特定の月/年に発生しているかどうかを表すことができます。

これがあなたの質問に答えることを願っています。そうでない場合は、正確に何を達成しようとしているのかをもう少し具体的にしてください


4

ベンナールは、日付時刻オブジェクトそれを見逃すだろう-うまく説明し、日付と時刻の部分のバケットに日付時刻オブジェクトを破壊することは、完全な(ユニークで通常さらに悪いことには)季節のトレンドを、検出に役立つだろう

興味のある特定の機械学習アルゴリズムについては言及しませんでしたが、k-meansのような距離ベースのクラスタリングにも興味がある場合は、date-timeオブジェクトをunix-time形式に一般化ます。これにより、アルゴリズムの単純な数値距離比較が可能になり、2つの日付値がどれだけ離れているかを簡単に示すことができます。

あなたの例では、日付のみの値2014-05-05を1399248000に一般化します(Unix時間は2014年5月5日の開始、UTC)。

[日付時刻を可能なすべての日付時刻部分にバケット化することでそれを達成できると主張することもできます。そのため、距離測定用のunix-timeと、いくつかのdate-timeバケットを組み合わせることをお勧めします]


3

ベンは静的機能について話し、タイムスタンプ機能を利用します。

拡張機能として、ラグ機能を紹介します。生の時系列ではなく、その集計です。

最も神秘的な部分は、私たちにとって将来の価値が見えないということです。トレーニングデータでその集計機能をどのように使用できますか。

ちょっとした例: 1991年から2015年までの年間電力消費量データがあります。2016年から2020年までの将来5年間の電力消費量を予測します。電力消費量の過去5年間の移動平均を2020年の特徴値として計算しますが、 2016年から2020年は不明であるため、5年の時系列をリードして(遅れとは反対に)2010年から2015年に移動平均を行い、この値を2020年の特徴値として使用します。したがって、将来の5年間の特徴データを構築できます。

次のステップは、移動関数(count \ mean \ median \ min \ max.etc)を使用して、異なるウィンドウを試すだけです。その後、多くの機能を構築します!


2

日付/時刻情報に関心があるものに応じて、単にビンに入れたい場合があります。たとえば、開始点からの距離に関心があり(たとえば、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

結果変数に対してさまざまな時間の変動があるグラフをプロットして、その影響を確認します。月、日、年を個別の機能として使用できます。月はカテゴリ変数であるため、ボックス/ウィスカープロットを試して、パターンがあるかどうかを確認できます。数値変数の場合、散布図を使用できます。


1

これが一般的/ベストプラクティスであるかどうかはわかりませんが、それは問題の別の観点です。

たとえば、日付がある場合、各フィールドを「連続変数」ではなく「カテゴリ変数」として扱うことができます。日にはセット{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)に変換されます。「スパースベクトル」を使用すると、特徴の量は問題になりません。

同様のことが、時間データ、曜日、月の日付についても実行できます...

それはすべて、機械学習モデルに答えてほしい質問に依存します。


これは、月の14日と15日が「類似」しているなど、おそらく存在する関係をキャプチャできません。毎日が文字通り異なると信じている限り、明日についての予測は不可能だと信じています。また、必ずしもカテゴリーをワンホットでエンコードする必要はありません。
ショーンオーウェン

近い日付の「近接」の取得に失敗する理由がわかりません。たとえば、バイナリベクトルをNNに供給する場合、適切なトレーニング後にそれを把握します。バイナリベクトルの使用は、カテゴリを表す1つの方法にすぎません。
パコバーター

この場合、「is_12th」や「is_13th」などの列が効果的にあります。これらの列は、入力スペースでは、「is_1st」とは無関係で、無関係です。連続的な機能として、12番目と13番目ある意味では、1番目と12番目よりも近い。モデルが推測するものに魅力を感じていますが、私は入力機能がエンコードするものについて話しています。
ショーンオーウェン

なるほど、分かりました。あなたは正しい、連続機能は日付の「近接」品質をよりよく捉えます。私のポイントは、日付の数値が無関係なデータの傾向があるかもしれないということです(たとえば、土曜日のみの顧客購入の特定のパターン)。したがって、日付を扱うための別の視点を提供します。
パコバーター

実際、@ PacoBarterが言ったように、ワンホットエンコーディングはカテゴリ間の異なる距離を無視します。これらの機能は本質的にフェーズ情報であるため、これはそれほど簡単に取り組むことができませんが、ほとんどの機械学習モデルにはフェーズタイプの入力がありません。ただし、距離メトリックに関するいくつかのDIYでも可能です。
plpopk

0

私の回答の背景:これまでに素晴らしい回答がありました。しかし、この特定の時系列の将来の値を予測するための機械学習アプリケーションについて話していると想定して、会話を広げたいと思います。そのコンテキストを念頭に置いて、私のアドバイスを以下に示します。

アドバイス:予測パフォーマンスのベースラインとして、最初に従来の統計的予測戦略(つまり、指数平滑法、SARIMAXまたは動的回帰)を調べます。機械学習はさまざまなアプリケーションに大きな可能性を示していますが、時系列では、アプリケーションにより適した統計的手法が試行されています。最近の2つの記事に注目してください。

  1. 統計的および機械学習の予測方法: Spyros Makridakis et al。この記事では、多くの時系列について、従来の統計的時系列分析が機械学習(ML)モデルよりも優れていることを指摘しています。本質的に、MLはオーバーフィットする傾向があり、独立したエントリに関するMLモデルの前提に違反します。
  2. 単純な予測と複雑な予測:ケステンCグリーンらによる証拠。この記事では、さまざまなモデルと比較して、または比較せずに、時系列分析を報告する査読付きジャーナル記事の時系列出力を比較して調べます。結論として、研究者は解析が複雑で、解釈が難しくパフォーマンスが悪いモデルで複雑になっています。通常、これはインセンティブ構造が不十分なために発生します。

優れたパフォーマンスを求めている場合は、いくつかのモデル(MASEなど)と比較するメトリックを選択し、いくつかの統計(下記参照)および機械学習モデル(上記の機能開発戦略を使用)をスイープします。

乾杯、

統計的予測を学習するためのリソースhttps ://otexts.org/fpp2/のRob J Hyndmanによる無料の教科書を確認することから始めます。テキストは、分析に簡単に組み込むことができるRパッケージhttps://otexts.org/fpp2/appendix-using-r.htmlに基づいています。最後に、ここで説明されているように、クロスセクションクロスバリデーションと時系列クロスバリデーションの違いに注意してください:https : //robjhyndman.com/hyndsight/tscv/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.