分類入力のシリーズ次元削減


8

私は、結果変数がバイナリで入力が時系列である予測モデルを構築しようとしています。より具体的にするために、モデルは、過去60日間に会社で費やした金額に基づいて、顧客が解約するかどうか(会社を去る、1または0としてコード化)を予測します。したがって、データは行ごとに1人の顧客であり、列は結果因子(1または0)であり、時間t-1、t-2 .... t-60で費やされた金額の60の追加列です。

ここにいくつかのサンプルデータがあります:

#create the data a series of length 60 and a class ID
sc <- read.table("http://kdd.ics.uci.edu/databases/synthetic_control/synthetic_control.data", header=F, sep="")

#binary class lable
classId <- as.factor(c(rep(0,300), rep(1,300)))
newSc <- data.frame(cbind(classId, sc))
newSc$ID<-seq(1,600,1)

実際のモデルには、顧客ごとにこれらのシリーズの多くがある可能性があるため、シリーズのデータ​​の次元を減らす必要があります。たとえば、60の値を使用する代わりに、これを一握りに減らす必要があります。もちろん、系列の平均値、最小値、最大値などを使用できますが、離散フーリエ変換の使用について読んでいます。

質問:

  1. RのDFFTは私の目的に使用する適切な方法ですか?それがどのように機能するかについてのあらゆる情報がいただければ幸いです。

  2. このR関数が正しいと仮定して、次元削減を実現するために最も意味のある係数だけをどのように抽出しますか?

追加:次元削減にDFFTを使用することは賢明な選択ではないというコンセンサスがあるようですが、データマイニングでは、この関数、DWTおよびSVDがすべて一般的に使用されているようです: 20ページから始まる時系列マイニング


簡単なコメントとしては、FFTを各顧客の機能を取得する別の手段と見なすことができます。各顧客の時系列やその他のデータに基づく要約統計を含む特徴ベクトルがあると仮定すると、FFTから派生した特徴を追加することで特徴ベクトルを補足できます。FFTが話しているウィンドウが静止している場合にのみ適切であることに注意してください。それ以外の場合、1次および2次導関数などの時間特性がより適切な場合があります。
BGreene 2013年

回答:


12

フーリエ変換自体を次元削減手法として分類するかどうかはわかりませんが、確かにそのように使用できます。

ご存知のように、フーリエ変換は時間領域関数を周波数領域表現変換します。元の関数では、は通常時間を示します。たとえば、f(1)は最初の日の誰かの口座残高、または曲の録音の最初のサンプルのボリュームを示し、f(2)は翌日の残高を示します。 /サンプル値)。しかし、引数でF ω T ω F ωf(t)F(ω)tωF(ω)通常は周波数を示します。F(10)は、信号が10サイクル/秒(または時間単位が何であれ)で変動する範囲を示し、F(20)は、信号が2倍の速度で変動する範囲を示します。フーリエ変換は、オリジナルの信号を正弦波の加重和として再構築することで「機能」します(実際には、通常は振幅と呼ばれる「重み」と、各周波数成分の「位相」値と呼ばれる「シフト」値を取得します)。ウィキペディアの記事は少し複雑ですが、ウェブ上に浮かんでいる適切なチュートリアルがたくさんあります。

フーリエ変換は、それ自体では、次元の削減はありません。信号の長さが場合、約振幅と位相が戻ります(1)。これは明らかに大きな節約にはなりません。ただし、一部の信号では、これらの振幅のほとんどがゼロに近いか、事前に無関係であることがわかっています。信号を再構築するために係数が必要ないため、これらの周波数の係数を捨てることができます。これにより、スペースが(信号によっては)大幅に節約される可能性があります。これは、リンクされた本が「次元削減」として説明しているものです。N / 2 N / 2NN/2N/2

フーリエ表現は、次の場合に役立ちます。

  1. あなたの信号は定期的であり、
  2. 有用な情報は、信号の周期性でエンコードされます。

たとえば、患者のバイタルサインを記録しているとします。EKGからの電気信号(または聴診器からの音)は、高次元の信号(たとえば、200 +サンプル/秒)です。ただし、一部のアプリケーションでは、FFTのピークの位置である可能性が高く、したがって1桁で表すことができる、被験者の心拍に関心がある場合があります。

FFTの主な制限は、信号全体を一度に検討することです。FFTの変化を特定することはできません。たとえば、10サイクル/秒に関連する係数を見てみます。次の場合、同様の振幅値が得られます

  1. 信号には一貫性がありますが、中程度のサイズの10 Hzの振動があります。
  2. その振動は信号の前半では2倍ですが、後半では完全になくなります。
  3. 前半は振動が全くなく、後半は1倍の2倍の大きさです。
  4. (等々)

私は明らかにあなたのビジネスについてあまり知りませんが、これらは非常に関連性の高い機能であると思います。FFTのもう1つの大きな制限は、FFTが単一の時間スケールで動作することです。たとえば、ある顧客が1日おきにビジネスに熱心にアクセスするとします。「頻度」は1日あたり0.5回(または2日)です。別の顧客も2日間続けて来て、2度離陸してから、次の2日間再び訪問するかもしれません。数学的には、2番目の顧客は最初の顧客の2倍の速度で「振動」していますが、これら2つの顧客は解約する可能性が等しいと思います。

時間-周波数アプローチは、周波数と時間の両方の変化を局所化することにより、この問題を回避するのに役立ちます。簡単なアプローチの1つは、短時間のFFTです。これは、信号を小さなウィンドウに分割し、各ウィンドウのフーリエ変換を計算します。これは、信号がウィンドウ内で静止しているが、ウィンドウ全体で変化することを前提としています。ウェーブレット分析はより強力です(そして数学的に厳密なアプローチです)。多くのWaveletチュートリアルがあります。魅力的な名前のWavelets for Kidsは、最も賢い実際の子供を除くすべての人にとって少しでも、始めるのに最適な場所です。Rにはいくつかのウェーブレットパッケージがありますが、構文は非常に単純です(ウェーブレットパッケージの 3ページを参照)。1つのドキュメント)。アプリケーションに適したウェーブレットを選択する必要があります。これは理想的には信号の関心の変動のように見えますが、モーレットウェーブレットが妥当な出発点になる場合があります。FFTと同様に、ウェーブレット変換自体は、次元をあまり削減しません。代わりに、元の信号を2つのパラメーターの関数として表します(周波数に類似した「スケール」と時間内の位置に類似した「変換」)。FFT係数と同様に、振幅がゼロに近い係数を安全に破棄できます。これにより、効果的な次元削減が可能になります。


最後に、私は、次元削減が本当にあなたがここで望んでいるものであるかどうかを尋ねることによって結論を述べたいと思います。あなたが尋ねてきたテクニックはすべて、本質的にデータをできるだけ忠実に保持しながらデータのサイズを削減する方法です。ただし、最高の分類パフォーマンスを得るには、通常、データを収集して変換し、他のすべてを破棄しながら、関連する機能をできるだけ明示的にします。

時には、フーリエまたはウェーブレット分析がまさに必要なものです(たとえば、高次元のEKG信号を単一の心拍数値に変換する)。それ以外の場合は、完全に異なるアプローチ(移動平均、導関数など)を使用したほうがよいでしょう。盲目的に一連の変換を試すのではなく、実際の問題について十分に検討し(そして、販売/顧客維持担当者に直感があるかどうかを確認するためにブレインストーミングを行い)、それらのアイデアを使用して機能を生成することをお勧めします。


こんにちはマット。リンク付きの追加記事を投稿しました。これらの手法は次元削減に使用されているようです。Rで離散ウェーブレット変換を使用して次元削減を行う方法を知っていますか?
B_Miner 2013年

大規模な編集を行いました。私は最後のビットを最初に読むことをお勧めします!
Matt Krause 2013年

マットありがとうございます!私はあなたの返答を完全に読む機会がありませんでしたが、まもなくします。
B_Miner 2013年

@MattKrause、あなたはフーリエ変換を本当によく理解しているようです。同様の問題があります。ここでの投稿に基づくと、次元削減の手法としてフーリエ変換を行うのは理にかなっていると思います。しかし、実際にそれを行う方法はわかりません。あなたは見てかかることがありstats.stackexchange.com/questions/176283/...を
2015年

ありがとう、@ felbo!お世辞ですが、追加すべきことがたくさんあるかわかりません。
Matt Krause、2015年

2

Mattが言ったように、DFTがアプリケーションに関連する機能を生成するかどうかはわかりません。しかし、あなたがこの質問で尋ねるようにx、関数を使用してdetrend(たとえば、パッケージpracmaを使用して)1D信号のDFTの分位数の機能を構築するためのRコードを次に示します。

l <- length(x)
detrended <- detrend(x)
dft <- fft(detrended)/l
amplitude <- 2*abs(dft[1:l/2])
plot(amplitude, type='l')
quantiles <- quantile(amplitude)

1

あなたがそれが正しいことであると示唆するいくつかのモデルがない限り、私はここでFFTをまったく使用しません。そして、あなたが与えた情報から、単にFFTあなたのデータは適切です。行き止まりになりそうなFFTを見る代わりに、他のアプローチを検討することをお勧めします。

より適切な方法は、移動平均フィルター(たとえば、過去N日間の平均売上高)または加重移動平均フィルター(モデルがあるため、より重要であると考えられる値に加重が与えられることを除いて同じ)これをサポートする/仮説、またはこれが過去の状態であることを示す実際のデータ。たとえば、より最近の数値に重みを付けたり、月曜日の売上が予測的であることを示唆するデータがあるために月曜日のデータに重みを付けたりすることができます。何らかの理由で)。

別のアプローチは、単に回帰(特にロジスティック回帰)を使用することです。これは伝統的で退屈に思えるかもしれませんが、機能します。

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