Data-Mining

分類輸入的系列降維

  • March 6, 2013

我正在尋找構建一個預測模型,其中結果變量是二元的,輸入是時間序列。更具體地說,該模型將根據客戶在前 60 天內在公司花費的金額來預測客戶是否流失(離開公司;編碼為 1 或 0)。因此,數據是每行一位客戶,列是結果因素(1 或 0),另外 60 列表示在時間 t-1、t-2….t-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 函數是正確的,你如何只提取最有意義的係數來實現降維?

ADD:似乎有一個共識,認為使用DFFT進行降維不是一個明智的選擇,但似乎在數據挖掘中,這個函數,DWT和SVD都是常用的: 從第20頁開始的時間序列挖掘。

我不確定我是否會將傅立葉變換本身歸類為降維技術,儘管您當然可以這樣使用它。

您可能知道,傅里葉變換轉換時域函數成頻域表示. 在原始函數中,通常表示時間:例如,f(1) 可能表示某人第一天的帳戶餘額,或歌曲錄製的第一個樣本的音量,而 f(2) 表示第二天的餘額/樣本值)。然而,論據在) 通常表示頻率:F(10) 表示信號以 10 個週期/秒(或任何您的時間單位)波動的程度,而 F(20) 表示它以兩倍速度波動的程度。傅里葉變換通過將原始信號重建為正弦曲線的加權和來“起作用”(實際上,您得到“權重”,通常稱為幅度,以及“偏移”,通常稱為相位,每個頻率分量的值)。維基百科的文章有點複雜,但是網上有很多不錯的教程。

傅里葉變換本身並不會降低維度。如果您的信號有長度, 你會得到幅度和階段後退(1),這顯然不是一個巨大的節省。然而,對於某些信號,這些幅度中的大多數接近於零,或者是先驗已知的無關緊要的。然後,您可以丟棄這些頻率的係數,因為您不需要它們來重建信號,這可以節省大量空間(同樣,取決於信號)。這就是鏈接書所描述的“降維”。

在以下情況下,傅里葉表示可能很有用:

  1. 您的信號是周期性的,並且
  2. 有用的信息被編碼在信號的周期性中。

例如,假設您正在記錄患者的生命體徵。來自 EKG 的電信號(或來自聽診器的聲音)是高維信號(例如,200+ 樣本/秒)。但是,對於某些應用程序,您可能對受試者的心率更感興趣*,*這可能是 FFT 中峰值的位置,因此可以用一位數表示。

FFT 的一個主要限制是它一次考慮整個信號——它不能定位其中的變化。例如,假設您查看與 10 個週期/秒相關的係數。如果你會得到相似的幅度值

  1. 信號中存在一致但中等大小的 10 Hz 振盪,
  2. 該振盪在信號的前半部分是兩倍大,但在後半部分完全不存在,並且
  3. 上半場完全沒有振盪,但下半場是 #1 的兩倍。
  4. (等等)

我顯然對您的業務了解不多,但我想這些可能是非常相關的功能。FFT 的另一個主要限制是它在單一時間尺度上運行。例如,假設一位客戶每隔一天虔誠地訪問您的公司:他的“頻率”為 0.5 次/天(或 2 天的時間段)。另一位顧客也可能連續兩天來,休息兩天,然後在接下來的兩天再次光顧。從數學上講,第二個客戶的“振盪”速度是第一個客戶的兩倍,但我敢打賭,這兩個客戶流失的可能性相同。

時頻方法通過定位頻率和時間的變化來幫助解決這個問題。一種簡單的方法是短時 FFT,它將您的信號分成小窗口,然後計算每個窗口的傅里葉變換。這假設信號在一個窗口內是靜止的,但在它們之間發生變化。小波分析是一種更強大(並且在數學上更嚴格的方法)。周圍有很多 Wavelet 教程——迷人的Wavelet for Kids是一個很好的起點,即使它對除了最聰明的實際孩子之外的所有人來說有點多。R 有幾個小波包,但它們的語法非常簡單(參見小波包的第 3 頁一個文件)。您需要為您的應用程序選擇一個合適的小波——理想情況下,這看起來像您的信號中感興趣的波動,但 Morlet 小波可能是一個合理的起點。與 FFT 一樣,小波變換本身不會給您帶來太多的降維。相反,它將原始信號表示為兩個參數(類似於頻率的“比例”和類似於時間位置的“平移”)的函數。與 FFT 係數一樣,您可以安全地丟棄幅度接近於零的係數,從而可以有效地降低維度。


最後,我想問你降維是否真的是你想要的。您一直在詢問的技術本質上都是減少數據大小同時盡可能忠實地保留數據的方法。然而,為了獲得最佳分類性能,我們通常希望收集和轉換數據以使相關特徵盡可能明確,同時丟棄其他所有內容。

有時,傅立葉或小波分析正是需要的(例如,將高維 EKG 信號轉換為單個心率值);其他時候,您最好使用完全不同的方法(移動平均線、衍生品等)。我鼓勵您好好考慮一下您的實際問題(甚至可能與銷售/客戶保留人員進行頭腦風暴,看看他們是否有任何直覺)並使用這些想法來生成功能,而不是盲目地嘗試一堆轉換。

引用自:https://stats.stackexchange.com/questions/51475

comments powered by Disqus