ニューラルネットワークでの日の特徴の最適な構築


18

回帰問題に取り組んで、「曜日」機能の表現について考え始めました。私はどちらのアプローチがより良くなるのだろうか:

  • 1つの機能。月曜日の値は1/7。火曜日は2/7
  • 7つの機能:(1、0、0、0、0、0、0)月曜日; (0、1、0、0、0、0、0)火曜日...

ネットワーク構成の違いにより、測定が困難です。(追加の6つの機能は、私が信じる隠れノードの数に反映されるはずです。)

すべての機能の数は約20です。単純なbackpropを使用して、通常のフィードフォワードニューラルネットワークを学習します。


曜日にバイナリエンコーディングを使用するのはどうですか?3つの機能。(0、0、0)は日曜日です。(0、0、1)月曜日などに?
Shamoon

これは、計算時間に短縮することがより意味のあるものに機能を低下させる付加的な利点がある
Shamoon

回答:


22

2番目の表現は、曜日などのカテゴリ変数に対してより伝統的です。

これは、作成とも呼ばれます ダミー変数の、カテゴリ変数をエンコードするために広く使用されている方法です。1-7エンコードを使用した場合、4日目と5日目は非常に似ているが、1日目と7日目は非常に似ていないことをモデルに伝えています。実際、1日目と7日目は4日目と5日目と同じです。同じロジックは、その月の0〜30エンコーディングに適用されます。

月の日は少し複雑です。なぜなら、毎週は7日間同じですが、毎月は30日間同じではないからです。ある月は31日、ある月は28日です。週と月の両方が周期的であるため、フーリエ変換を使用できますを使用してそれらを滑らかな線形変数に変換できます。

たとえば(私の選択したプログラミング言語Rを使用):

day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

raw vs sin vs cosine

(サイン/コサイン変数を-1/1ではなく0/30になるようにスケーリングしたため、グラフが見やすくなりました)

ご覧のとおり、生の「月の変数」は各月の終わりにゼロに戻りますが、サイン変換とコサイン変換はスムーズな移行を行い、1か月の終わりの日が翌月の初めの日。

次のように残りのフーリエ用語を追加できます。

for(i in 1:3){
  s = sin((2*pi)/30*day_of_month + 30 * i/4)
  c = cos((2*pi)/30*day_of_month + 30 * i/4)
  lines(15*s+15 ~ day_of_year, col='blue')
  lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

完全な変換

サイン/コサイン波の各ペアは円を作ります:

m <- lapply(1:4, function(i){
  as.matrix(
    data.frame(
    s = sin((2*pi)/30*day_of_month + 30 * i/4),
    c = cos((2*pi)/30*day_of_month + 30 * i/4)
    )
  )
})
m <- do.call(cbind, m)
pairs(m)

サークル このページには、正弦波と余弦波を操作する方法の非常に便利な説明があります。


そうする特別な理由はありますか?どのように収束に影響するのだろうか。2番目の疑問は、変数がまだカテゴリカルである場合です。月の日はどうでしょうか。(
0-30

同じこと; インジケータ変数を使用します。最初のエンコードは、適切でない可能性のある類似性の尺度を誘導します。例えば、日曜日は本当に月曜日から最も異なる日ですか?それがエンコーディングが意味するものです...
Emre 14

@OepasDost私の投稿があなたの質問に答えたら、チェックマークをクリックして自由に投票したり、受け入れたりしてください。
ザック14

@Zachなぜ曜日(0から6にエンコード可能)をカテゴリカルと見なし、月の日を順序循環と見なします(したがって、フーリエ変換を使用します)。そして、それらの両方が通常の周期的なものではなく、したがって、曜日のフーリエ変換も行いますか?
-zipp

1
@zipp曜日にもフーリエを使用できます。私の経験では、曜日の主な値は平日と週末の差であり、ダミー変数(またはインジケータ変数)を使用してキャプチャするのは非常に簡単です。
ザック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.