標準化時間序列數據的正確方法
已經問過一個與我非常相似的問題:
我問了一個新問題,因為那個問題沒有任何答复。
我在這里分析數據集 6
https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/
特別是數據集 001。
數據:數據集由多個多元時間序列組成。每個時間序列都來自不同的引擎——也就是說,數據可以被認為來自同一類型的引擎。對於每台發動機,我們都有發動機 ID、運行時間(以周期為單位)和 24 個時間序列:三個運行條件和 21 個噪聲傳感器測量值。例子:
> glimpse(train_set) Observations: 20,631 Variables: 26 $ engine <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1... $ cycles <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,... $ op_setting_1 <dbl> -0.0007, 0.0019, -0.0043, 0.0007, -0.0019, -0.... $ op_setting_2 <dbl> -4e-04, -3e-04, 3e-04, 0e+00, -2e-04, -1e-04, ... $ op_setting_3 <dbl> 100, 100, 100, 100, 100, 100, 100, 100, 100, 1... $ sensor_1 <dbl> 518.67, 518.67, 518.67, 518.67, 518.67, 518.67... $ sensor_2 <dbl> 641.82, 642.15, 642.35, 642.35, 642.37, 642.10... $ sensor_3 <dbl> 1589.70, 1591.82, 1587.99, 1582.79, 1582.85, 1... $ sensor_4 <dbl> 1400.60, 1403.14, 1404.20, 1401.87, 1406.22, 1... $ sensor_5 <dbl> 14.62, 14.62, 14.62, 14.62, 14.62, 14.62, 14.6... $ sensor_6 <dbl> 21.61, 21.61, 21.61, 21.61, 21.61, 21.61, 21.6... $ sensor_7 <dbl> 554.36, 553.75, 554.26, 554.45, 554.00, 554.67... $ sensor_8 <dbl> 2388.06, 2388.04, 2388.08, 2388.11, 2388.06, 2... $ sensor_9 <dbl> 9046.19, 9044.07, 9052.94, 9049.48, 9055.15, 9... $ sensor_10 <dbl> 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1... $ sensor_11 <dbl> 47.47, 47.49, 47.27, 47.13, 47.28, 47.16, 47.3... $ sensor_12 <dbl> 521.66, 522.28, 522.42, 522.86, 522.19, 521.68... $ sensor_13 <dbl> 2388.02, 2388.07, 2388.03, 2388.08, 2388.04, 2... $ sensor_14 <dbl> 8138.62, 8131.49, 8133.23, 8133.83, 8133.80, 8... $ sensor_15 <dbl> 8.4195, 8.4318, 8.4178, 8.3682, 8.4294, 8.4108... $ sensor_16 <dbl> 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03... $ sensor_17 <int> 392, 392, 390, 392, 393, 391, 392, 391, 392, 3... $ sensor_18 <int> 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388... $ sensor_19 <dbl> 100, 100, 100, 100, 100, 100, 100, 100, 100, 1... $ sensor_20 <dbl> 39.06, 39.00, 38.95, 38.88, 38.90, 38.98, 39.1... $ sensor_21 <dbl> 23.4190, 23.4236, 23.3442, 23.3739, 23.4044, 2...
有訓練集中的引擎(多元時間序列),每個時間序列大約有時間樣本,所以對於每個傳感器,我們總共有大約 訓練集中所有引擎的時間樣本。如有必要,我可以添加數據圖,但我認為我的問題不需要它。
發動機在每個時間序列開始時正常運行,並在序列期間的某個時間點出現故障。在訓練集中,故障的規模不斷擴大,直到系統故障。在測試集中,時間序列在系統故障之前的某個時間結束。
分析目標:給定一個測試時間序列作為輸入,我想預測相應的剩餘使用壽命 (RUL) 值,並使用我將在訓練集上訓練的模型。我還有一個用於測試集中所有時間序列的 RUL 向量,因此我可以計算模型的測試準確度。我選擇使用兩種模型:
- Cox 比例風險模型,已更正以允許依賴時間的輸入功能(有關如何執行此操作的任何建議/參考?)
- 循環神經網絡
並比較結果。
問題:我想標準化傳感器輸出的值,因為我認為測量單位不攜帶任何有關 RUL 的信息。最正確的做法是什麼?
- 用於傳感器, 計算樣本均值和样本標準差在所有的訓練集中所有時間序列的數據點。例如,因為
sensor_11
我們有summary(train_set$sensor_11) Min. 1st Qu. Median Mean 3rd Qu. Max. 46.85 47.35 47.51 47.54 47.70 48.53
然後我們計算
- 或者我們計算樣本均值和样本標準差的 每次,我們用隨時間變化的樣本均值和样本標準差對時間序列進行歸一化,. 既然我有訓練集中的引擎,每次我有一個隨機大小的樣本估計和. 我不太喜歡這種方法,因為它引入了新問題:如果是訓練集中所有引擎的最小故障時間,我如何計算和好幾次?
最後,在這兩種情況下,我相信我應該計算和(或者 和) 僅基於訓練集數據,並使用如此計算的值來標準化測試集時間序列。正確的?
請注意,我將使用的模型之一是 RNN。我不確定這在選擇數據規範化方式時是否有任何相關性。
- 你應該堅持第一種方法。或者當您計算每個系列的單獨比例時它的變化。這是一個簡短的答案,但有細微差別。
如果您的模型中沒有比例尺,您的比例尺必須保持不變。例如,看看金融界的赫斯頓模型。只看方程式,忽略上下文。您會看到可變性如何隨時間變化。第一個方程模擬收益,第二個方程模擬波動率(標準差)。該模型明確地模擬了波動性。
在這種情況下,我可以看到動態縮放正在工作,因為這樣您的模型的其他部分就會對縮放本身進行建模。您的模型不必像 Heston 的那樣是隨機波動率,但它必須明確說明波動率會以某種方式隨時間變化的事實。否則,如果你的規模發生變化而你不處理它,我懷疑你會得到一個明智的結果。
- 關於是否使用訓練集進行規模化的第二個問題。理想情況下,這甚至不重要,因為您的規模是恆定的,對嗎?所以,如果它是恆定的,那麼如果你在子樣本上計算它,你的比例就不應該改變。實際上,它會移動一點,如果更改導致問題,則意味著您的訓練集與測試集不同。子樣本之間的均值和標準差等宏觀特徵不應發生太大變化。如果發生這種情況,那就是採樣或數據大小問題。此外,如果規模變化很小,但模型崩潰了,這意味著該模型對小擾動不穩健,在我看來,這本身就是一個問題。