月と時間などの機能をカテゴリまたは数値としてエンコードしますか?


23

機械学習モデルで、月や時間などの機能を係数または数値としてエンコードする方が良いでしょうか?

一方で、時間は順方向に進行するプロセスであるため(5か月後に6か月が経過するため)、数値エンコードは合理的であると感じますが、一方で、周期的性質のためにカテゴリーエンコードがより合理的であると思います年と日(12番目の月の後に最初の月が続きます)。

これに一般的な解決策や慣習はありますか?


RFモデルで1日の時間(1〜24)変数を定義する際に同じ問題に直面しました。変数をカテゴリとして変換すると、VarImp関数は各時間の重要度の値を表示し、非常に整理されていないように見えます。「時間」タイプの数値変数をカテゴリカルに変換する必要があるのだろうか?
マフムドゥルラーマン

回答:


19

時刻変数の(サイン、コサイン)変換を追加することを検討しましたか?これにより、たとえば、0時間と23時間が互いに近くなり、変数の周期的な性質が透けて見えるようになります。

詳細


これには問題がある(pi * 18/24)。これらは全く別の時間です
エランモシェ

次のようなサイクルを実行できます:sin(pi * X / 12)。おかげエラン:]
エランモシェ

@EranMoshe FYIポスト内のリンクから、それは罪(2 *パイ* X / 12)になりますので、彼らは、代わりに2 *パイの係数を使用の上-彼らはコメントで、このためのいくつかの推論を与える
tsando

そして、その(2 * pi X / 24)は(pi X / 12)です。]ご覧のとおり、blog.davidkaleko.com / feature-engineering-cyclical-features.htmlの著者とまったく同じ問題に苦労しています。苦労しました。そしてコメントでは、「Mariel G」が私が気付いたとおりに彼を修正しているのを見ることができます:pi * X / 12は1日中循環します。また、真の24時間を定義するには、これのcosとsinの構成要素を採用する必要があるということも学びます (あなたが真円だけではなく、定期的な機能を必要とする)
エランモシェ

@EranMosheはい、時間をかけてやりたい場合はpiX / 12に減らすことができますが、月をやりたい場合は2piX / 12、つまりpi / 6になります。だから、一般的には2piX /期間だろう
tsando

9

答えは、時間フィーチャとターゲット変数の間で表す関係の種類によって異なります。

時間を数値としてエンコードすると、モデルに特定の制限が課せられます。線形回帰モデルの場合、時間の効果は単調になり、ターゲットは時間とともに増加または減少します。決定木の場合、互いに近い時間値はグループ化されます。

時間をカテゴリカルとしてエンコードすると、モデルの柔軟性が向上しますが、場合によっては、学習するのに十分なデータがモデルにない場合があります。有用なテクニックの1つは、時間値をいくつかのセットにグループ化し、そのセットをカテゴリ属性として使用することです。

グループ化の例:

  • 月については、ユースケースに応じて四半期または季節にグループ化します。例:1月から3月、4月から6月など
  • 時間帯については、朝、夕方などの時間帯バケットにグループ化します。
  • 曜日については、平日、週末にグループ化します。

上記のそれぞれは、十分なデータがあれば、カテゴリー属性としても直接使用できます。さらに、データ分析によってグループ化を発見し、ドメイン知識ベースのアプローチを補完することもできます。


4

数値機能を使用することをお勧めします。カテゴリ機能を使用することは、本質的に2つのカテゴリ間の距離を関連性があると見なさないことを意味します(たとえば、カテゴリ1はカテゴリ3と同じようにカテゴリ2に近い)。これは、数時間または数か月間は間違いなく当てはまりません。

ただし、提起する問題は、12が1に11に近い方法で時間と月を表現することです。それを達成するために、コメントで提案されたものを使用して使用することをお勧めします時間/月を数値的特徴として使用する前のサイン/コサイン関数。


3

使用しているアルゴリズムによって異なります。

ランダムフォレストのようなツリーベースのアルゴリズムを使用している場合は、この質問に合格してください。カテゴリベースのエンコードは、ツリーベースのアルゴリズムには必要ありません。

ニューラルネットワークのような他のアルゴリズムについては、両方の方法(連続&カテゴリー)を試すことをお勧めします。効果は状況によって異なります。


ツリーベースの実装に依存します。scikit-learnやxgboostなどの広く使用されているパッケージは、カテゴリー変数を認識しません。それらをワンホットエンコードすることが期待されています。
リカルドクルス

この投稿から:datascience.com/…決定ツリーに基づいたものにホットなものを使用するべきではありません。これは私が困難な方法を見つけていることです。
アシュリー

1

持っているすべてのデータが適切に定義されているため、カテゴリエンコーディングをお勧めします。これは適用も簡単です。


1

@raghuが提供する答えを言い換えます。カテゴリと数値の特徴の大きな違いの1つは、数値の大きさが比較できるかどうか、つまり2019年が2018年よりも大きいか、12月(12)が3月(3)よりも大きいかどうかです。あんまり。これらの数字には順番がありますが、大きさは比較できません。したがって、カテゴリー値への変換はより意味があります。

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