:解決時間序列小樣本高維特征過擬合)
1. 多元時間序列預測的第一道坎特征太多樣本太少接到一個電商日頻銷量預測需求的時候我差點被常規(guī)思路帶進溝里歷史銷量、價格、促銷標記、訪問量、天氣、節(jié)假日……三十幾個特征全部塞進多元線性回歸手頭卻只有最近兩百天的日度數(shù)據(jù)。訓練集上 R2 能到 0.9一上測試集預測曲線幾乎變成一條平線擬合效果慘不忍睹。后來把算法換成主成分回歸模型才算穩(wěn)定下來。也是從那次之后我把主成分回歸當作時間序列預測里一個不可或缺的基線工具今天這篇就把完整思路和踩過的坑一起寫出來。先說清楚這篇文章適合誰手里有幾十個特征、幾百條樣本想做銷量、客流、用電量這類日頻或周頻預測的人。如果你也遇到過“特征一多模型就爆炸”“訓練集好看測試集翻車”的情況主成分回歸大概率能幫你把問題大幅緩解。它不是什么高深算法但用好它需要的細節(jié)不少。1.1 為什么直接硬上多元線性回歸會翻車時間序列預測里特征高度相關(guān)是常態(tài)這不是數(shù)據(jù)臟而是業(yè)務本身如此。氣溫升高空調(diào)銷量和冷飲銷量一起漲促銷力度大銷量和訪問量同步波動即便只拿一個序列做滯后特征t-1 和 t-2 這兩天的銷量之間也天然存在強自相關(guān)。這些相關(guān)性體現(xiàn)在特征矩陣上就是 X 的列之間“長得太像”導致 X^T X 接近奇異。普通最小二乘回歸的解是 (X^T X)^{-1} X^T y當 X^T X 病態(tài)時訓練數(shù)據(jù)稍微抖動一下系數(shù)估計就劇烈震蕩出現(xiàn)正負交替、數(shù)值大到離譜的情況。模型不是在學習規(guī)律而是在拿參數(shù)拼命擬合噪聲。樣本量不足會把這個毛病進一步放大。經(jīng)典統(tǒng)計經(jīng)驗里特征數(shù) p 和樣本量 n 的比值最好別太夸張而時間序列的樣本量天然受限一天一條數(shù)據(jù)做日頻預測一年也就 365 條改為小時頻雖然樣本多了但相鄰樣本之間的自相關(guān)又變強了做交叉驗證時一不小心就把模型的“虛假自信”學進去了。三十多個特征對著兩三百個樣本模型自由度太大訓練集 R2 一路向下掉驗證集誤差卻先降后升這就是教科書里說的過擬合。很多人第一反應是用正則化比如嶺回歸或者 LASSO。這確實是一條路。但主成分回歸提供了另一條更符合直覺的思路既然這些特征互相糾纏、信息大量重疊不如先把它們壓縮成幾個互不相關(guān)的綜合指標再拿這些指標去做回歸。這就像一大群人七嘴八舌給你介紹一個水果甜度、水分、個頭、顏色都說了一遍其實核心信息就那么一兩點綜合成一個“好吃程度”再判斷更省事。1.2 主成分回歸到底解決了什么問題主成分回歸Principal Component Regression簡稱 PCR做的事情分兩步。第一步用主成分分析PCA把原始 p 個特征轉(zhuǎn)換成 p 個正交的主成分這些主成分按方差從大到小排列前面的主成分承載了數(shù)據(jù)里絕大部分波動信息。第二步只取前 K 個主成分作為自變量做線性回歸。相當于把原始特征做了坐標旋轉(zhuǎn)然后丟掉那些方差小、信息量低的方向只保留數(shù)據(jù)中最穩(wěn)定的結(jié)構(gòu)。這個操作的實際效果是把有效參數(shù)數(shù)量從 p 個壓到 K 個。原始線性回歸需要估計的系數(shù)是 30 個PCR 可能只需要估計 6 個主成分對應的系數(shù)參數(shù)空間一下子縮小了。樣本還是那兩百條但每個參數(shù)能分到的“數(shù)據(jù)支撐”多了過擬合風險自然下降。另一個隱藏收益是PCR 天然改善了共線性問題。因為主成分之間是正交的回歸時不再出現(xiàn)“兩個特征互相搶解釋力”的尷尬系數(shù)估計穩(wěn)定得多。不過有一點必須說在前面PCR 歸根結(jié)底是線性方法。它只負責去掉特征冗余、穩(wěn)住線性回歸的系數(shù)不負責挖掘時間序列里的復雜非線性關(guān)系。如果你手里的是高度非線性的數(shù)據(jù)PCR 的效果會有一個上限。但現(xiàn)實里大量日頻業(yè)務數(shù)據(jù)的線性成分非常強先用 PCR 把線性部分榨干再決定要不要上更復雜的模型是性價比極高的一條路。2. 通俗拆解主成分回歸坐標系旋轉(zhuǎn)和信息濃縮2.1 主成分分析的直覺方差最大就是信息最大主成分分析的直覺可以拿菜市場來類比。你面前有一堆蘋果每個蘋果都有好幾個測量指標重量、直徑、甜度、光澤度。但仔細一看重量和直徑幾乎是一回事甜度和光澤度也高度相關(guān)。PCA 做的事情是重新發(fā)明一組指標讓這組新指標之間完全互不相關(guān)并且按信息量排序。第一個新指標盡可能多地概括所有原始指標的變化第二個新指標在第一個之下的殘余變化里再取最大以此類推。數(shù)學上先把 X 的每一列做中心化然后計算協(xié)方差矩陣對這個矩陣做特征值分解。特征向量就是新的坐標軸方向特征值就是這個方向上數(shù)據(jù)的方差。把原始數(shù)據(jù)投影到這些新坐標軸上得到的就叫主成分得分。第一個主成分的得分通常能解釋數(shù)據(jù)整體波動的一大半后面的主成分解釋力依次遞減。在實際項目里前幾個主成分加起來累計方差貢獻率達到 80% 到 90% 很常見后面的主成分基本就是噪聲。這里有個很關(guān)鍵的點PCA 是“無監(jiān)督”的。它在旋轉(zhuǎn)坐標系時只看 X 本身的變化結(jié)構(gòu)完全不看預測目標 y。換句話說PCA 挑出來的是“自身方差大”的方向不是“和預測目標關(guān)系強”的方向。方差大的方向和 y 相關(guān)運氣成分很大。這也是 PCR 和偏最小二乘PLS的核心區(qū)別之一后面講踩坑時我會再提。2.2 PCR 的數(shù)學本質(zhì)先投影再回歸設 X 是 n 行 p 列的特征矩陣W 是由 PCA 得到的載荷矩陣每一列是一個特征向量那么 T X W 就是主成分得分矩陣。PCR 只取前 K 列 T_K擬合線性回歸 y T_K β ε得到系數(shù) β。因為主成分之間正交這個回歸做起來非常穩(wěn)定不存在共線性問題。如果要把 PCR 的系數(shù)還原到原始特征空間只需要把 β 乘回對應的載荷β_原始 W_K β。但要注意這樣還原出來的系數(shù)只涉及前 K 個主成分覆蓋的方向其余方向的系數(shù)全部為 0。這體現(xiàn)了一個非常重要的思想PCR 相當于對原始回歸系數(shù)做了一次“硬收縮”。它直接放棄了信息量低的坐標方向而不是像嶺回歸那樣給所有系數(shù)都乘以一個連續(xù)縮小的因子。嶺回歸更像是“每個參數(shù)都少拿一點”PCR 則是“沒選中的方向直接切掉選中的方向全額保留”。從另一種角度看PCR 等價于先把 X 投影到由前 K 個主成分張成的子空間里得到 X_K再用 X_K 和 y 做最小二乘回歸。兩者結(jié)果一致。理解了這層關(guān)系后面選 K 時你就明白K 太小丟掉的信息太多模型欠擬合K 太大噪聲方向也被保留過擬合又回來。這個 K 是 PCR 唯一真正重要的超參數(shù)。2.3 為什么在時間序列里格外合適時間序列預測里最常見的特征構(gòu)造方式是用滯后值。預測明天的銷量把今天、昨天、前天的銷量拿來做特征也就是 t-1、t-2、t-3。問題在于這些滯后特征彼此之間的相關(guān)性極高今天銷量高往往意味著昨天銷量也高t-1 和 t-2 直接高度正相關(guān)。如果一口氣放了 7 個、14 個甚至 30 個滯后特征幾乎就是重復信息的大雜燴。直接做線性回歸時系數(shù)會在這些高度相關(guān)的滯后項之間互相“打架”一會兒正一會兒負你根本沒法解釋“為什么 t-2 的系數(shù)是 -0.8而 t-3 的系數(shù)是 0.9”模型本身也非常不穩(wěn)。PCR 遇到這種場景非常從容。你給它 30 個高度相關(guān)的滯后特征它會把它們濃縮成幾個有意義的主成分其中一個往往代表“近期平均水平”另一個代表“近期變化趨勢”這兩個方向本身就對應時間序列的典型動力學結(jié)構(gòu)。用它做預測既減少了需要估計的參數(shù)個數(shù)又保留了時序里真正重要的信息所以小樣本場景下效果常常出奇地好。這也是為什么我后來做日頻預測時不再糾結(jié)到底應該用哪些滯后階數(shù)而是先把滯后特征鋪開再讓 PCR 替我做信息濃縮。3. 用 Python 完整跑通PCR 做日頻銷量預測3.1 數(shù)據(jù)準備滯后特征與外部變量我拿一個簡化的電商日頻銷量預測來演示。原始數(shù)據(jù)只有三個字段銷量、商品價格、頁面訪問量共 180 天的日度記錄。目標是預測當天的銷量。第一步要為每個原始變量構(gòu)造滯后特征。我一般會構(gòu)造 1、2、3、7、14 天的滯后為什么放 7 和 14因為日頻業(yè)務大多有周周期周幾對銷量的影響很明顯滯后 7 天和 14 天可以捕捉“上周同一天”和“上上周同一天”的信號。這是業(yè)務經(jīng)驗不是算法自動得出的做特征工程時務必帶上這種周期意識。import pandas as pd def make_lag_features(df, cols, lags(1, 2, 3, 7, 14)): df df.copy() for col in cols: for lag in lags: df[f{col}_lag{lag}] df[col].shift(lag) # 丟棄前面的空值行 df df.dropna() return df df pd.read_csv(sales_daily.csv) feature_cols [sales, price, visits] data make_lag_features(df, feature_cols, lags(1, 2, 3, 7, 14))這樣每個原始變量產(chǎn)生 5 個滯后列一共 15 個特征。樣本從第 15 天開始才有完整特征所以實際有效樣本會比原始數(shù)據(jù)少一點。這里有個常見的初學者錯誤不 dropna 直接建模模型會把缺失值當特殊信號干擾很大。時序數(shù)據(jù)里的 NaN 必須處理干凈最穩(wěn)妥的方式就是直接丟棄那些還沒有完整滯后的行。3.2 三步走的標準流程標準化、PCA、線性回歸PCR 的標準流水線是三步先標準化再做 PCA 降維最后線性回歸。在 sklearn 里用 Pipeline 可以一次性串起來。from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline pcr_pipeline Pipeline([ (scaler, StandardScaler()), (pca, PCA(n_components6)), (reg, LinearRegression()) ])標準化這一步常常被人忽略但它極其關(guān)鍵。PCA 是依據(jù)方差找方向的如果價格以“元”為單位數(shù)值是幾十幾百而訪問量是幾千上萬兩個變量的方差量級完全不同。不標準化的話PCA 得出的主成分幾乎會被訪問量這個變量獨占銷量信息在降維過程中被淹沒。做了標準化之后每個特征都變成均值為 0、方差為 1 的量綱PCA 才會公平地看待所有特征。標準化還有一個技術(shù)細節(jié)scaler 的 fit 必須只用訓練集數(shù)據(jù)得到均值和標準差后再用同一套參數(shù)去 transform 測試集。絕對不能在全部數(shù)據(jù)上先 fit 一遍再切訓練測試那樣的話測試集信息已經(jīng)混進了訓練過程評估結(jié)果會虛高。Pipeline 的好處就在這里它保證每一次交叉驗證折內(nèi)scaler 都只用當前訓練折去 fit天然規(guī)避了數(shù)據(jù)泄露。3.3 關(guān)鍵參數(shù)主成分數(shù)量 K 怎么選PCR 里唯一需要調(diào)的超參數(shù)是主成分數(shù)量 K。很多人習慣畫一個累計方差貢獻率曲線選在 85% 或者 90% 的那個點。這個方法能看個大概但不嚴謹。原因我前面提過PCA 不關(guān)心 y方差貢獻率高的主成分不一定和銷量強相關(guān)。有時候前 3 個主成分已經(jīng)解釋了 90% 的方差但和銷量相關(guān)的信息其實在第 4、第 5 個主成分里。所以更靠譜的做法是直接以預測誤差為目標用時間序列交叉驗證去搜 K。import numpy as np from sklearn.model_selection import GridSearchCV, TimeSeriesSplit from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.linear_model import LinearRegression # X 是滯后特征y 是當日銷量 tscv TimeSeriesSplit(n_splits5) param_grid {pca__n_components: range(1, 12)} pcr Pipeline([ (scaler, StandardScaler()), (pca, PCA()), (reg, LinearRegression()) ]) search GridSearchCV( pcr, param_grid, cvtscv, scoringneg_mean_absolute_error ) search.fit(X, y) print(最優(yōu)主成分數(shù)量:, search.best_params_)這里必須用TimeSeriesSplit而不是普通的KFold。普通 KFold 是隨機打亂后切分訓練折里很可能出現(xiàn)比測試折更晚的樣本也就是用“未來”去預測“過去”評估結(jié)果會嚴重虛高。TimeSeriesSplit嚴格按時間順序切分每一折的訓練數(shù)據(jù)永遠在測試數(shù)據(jù)之前這才符合真實的預測場景。我見過太多項目在時序任務里直接套 KFold模型上線后效果和離線評估差一大截多半就是這個問題。3.4 預測效果評估一個可以直接抄的指標組合模型評估我用三個指標RMSE 看大誤差的懲罰MAE 看平均絕對偏差MAPE 看相對誤差的百分比。時間序列預測里我還會額外注意誤差的方向系統(tǒng)性高估還是低估這對庫存決策的影響完全不同。from sklearn.metrics import mean_squared_error, mean_absolute_error from sklearn.model_selection import train_test_split # 按時間順序切分前 80% 訓練后 20% 測試 train_size int(len(data) * 0.8) X_train, X_test X.iloc[:train_size], X.iloc[train_size:] y_train, y_test y.iloc[:train_size], y.iloc[train_size:] best_pcr search.best_estimator_ best_pcr.fit(X_train, y_train) y_pred best_pcr.predict(X_test) rmse np.sqrt(mean_squared_error(y_test, y_pred)) mae mean_absolute_error(y_test, y_pred) mape np.mean(np.abs((y_test - y_pred) / y_test)) * 100 print(fRMSE: {rmse:.2f}, MAE: {mae:.2f}, MAPE: {mape:.2f}%)我在自己一個實際項目上的結(jié)果比較有代表性普通多元線性回歸 RMSE 235MAE 189MAPE 31.4%PCR 選擇 6 個主成分后 RMSE 降到 149MAE 112MAPE 19.8%。更復雜的 LSTM 在這個小樣本場景下是 167 的 RMSE比 PCR 還差一截。不同數(shù)據(jù)集數(shù)字會變但排序規(guī)律我反復驗證過面對十幾個高度相關(guān)特征加幾百條樣本PCR 通常明顯優(yōu)于不做處理的普通回歸也常常優(yōu)于倉促上馬的深度學習模型。4. PCR 和 LSTM 的取舍別讓“必須上深度學習”的思路綁架建模4.1 深度學習在時間序列上的真實門檻最近幾年一提時間序列預測很多人第一反應就是 LSTM、GRU 這些循環(huán)神經(jīng)網(wǎng)絡相關(guān)教程一搜一大把百度熱搜詞里都掛著“l(fā)stm 時間序列預測 python”。但這類模型有個硬傷它是“數(shù)據(jù)饑餓型”的。LSTM 哪怕做一個簡單的單變量預測想訓練穩(wěn)定也最好有幾千條樣本如果還要輸入多變量、多滯后特征樣本量要求更是水漲船高。你手里只有幾百條日頻數(shù)據(jù)上來就搭一個兩層 LSTM十有八九會出現(xiàn)訓練集損失降得很漂亮、驗證集預測曲線卻劇烈抖動的情況。另外LSTM 的調(diào)參成本很高。batch size、學習率、時間步長、隱藏層單元數(shù)、dropout 比例任何一個設置不合適結(jié)果都可能天差地別。我在一個用戶量預測項目上調(diào) LSTM 調(diào)了兩周最后還是沒比過一個做了特征工程的線性模型。不是說深度學習不能用而是它應放在問題本身需要的時候而不是因為潮流需要。4.2 PCR 的舒適區(qū)小樣本、高相關(guān)、表格型時序數(shù)據(jù)PCR 的適用范圍非常明確線性或近似線性關(guān)系、特征高度相關(guān)、樣本量小、需要快速迭代和可解釋性。這四個條件放在一起基本就是業(yè)務側(cè)最常見的日頻、周頻預測場景。它跑得極快十幾列特征加幾百條樣本一秒鐘出結(jié)果不需要 GPU不需要分布式。它對特征工程容錯率也高哪怕你塞了一堆相關(guān)性極高的滯后變量PCR 也會先把冗余信息壓縮掉不會像普通回歸一樣立刻爆掉??山忉屝陨?PCR 也有獨特優(yōu)勢。線性回歸的系數(shù)可以直接看到每個特征的影響方向而 PCR 更進一步通過 PCA 的載荷矩陣你能看到每個主成分主要由哪些原始特征構(gòu)成。比如某個主成分里近一周銷量滯后項的載荷都很高那它代表的就是“近期經(jīng)營水平”另一個主成分里價格和訪問量相關(guān)特征的載荷較高代表“流量轉(zhuǎn)化環(huán)境”。這種拆解在向業(yè)務方解釋模型為什么預測某一天銷量很高時非常有用。4.3 混合玩法用 PCR 給 LSTM 做減負我比較推薦的進階做法是把 PCR 當作深度學習的前置特征工程而不是二選一。具體來說先用標準化加 PCA 把 15 個高度相關(guān)的特征壓縮成 6 個主成分再把這 6 個主成分作為 LSTM 的輸入特征。原始特征里有大量重復信息和噪聲直接喂給 LSTM模型需要花很多容量去學習忽略這些東西主成分輸入則干凈得多LSTM 只需要專注擬合主成分到銷量之間的非線性關(guān)系訓練更快、也更穩(wěn)。我試過另一種互補方式先用 PCR 預測銷量得到一條預測序列計算殘差 y_true - y_pcr再用 LSTM 去擬合這個殘差。這樣 PCR 負責吃掉數(shù)據(jù)里主要的線性結(jié)構(gòu)LSTM 只去捕捉殘余的非線性波動相當于給模型做了“接力”。這兩個玩法的核心思想是一致的不要一上來就把所有復雜度拋給一個模型線性部分交給線性方法非線性部分交給非線性方法逐層消化。實際落地時我習慣先跑一個 PCR 作為基線如果它的 MAPE 已經(jīng)能到 20% 以下我會認真考慮是不是還需要更復雜的模型。5. 主成分回歸在時間序列上踩過的坑與血淚建議5.1 PCA 方向的符號漂移別被載荷表騙了PCA 的載荷向量符號不是唯一的特征向量乘以 -1 之后還是同一個特征向量。sklearn 在不同版本、不同隨機狀態(tài)下跑出來的主成分方向可能完全反過來上一次 PC1 在“銷量_lag1”上是正載荷下一次跑就變成了負載荷。這不影響預測結(jié)果因為回歸系數(shù)也會跟著翻轉(zhuǎn)兩者相乘之后還是一樣。但如果你把 PCA 載荷打印出來做業(yè)務解讀會發(fā)現(xiàn)這次和上次“結(jié)論完全相反”容易鬧出笑話。解決辦法是如果只是做預測不用管符號如果要展示載荷或做歸因可以在訓練完成后固定一個規(guī)則比如保證每個主成分里載荷絕對值最大的那個原始特征為正值不符合就整體乘以 -1。最保險的做法是固定 random_state但即使固定了跨版本升級時符號仍可能變化所以別讓業(yè)務方太依賴某個具體載荷數(shù)值。5.2 時間序列交叉驗證千萬別用普通 KFold這是我在初學階段踩過最貴的一個坑。當時用 KFold 做交叉驗證選擇主成分數(shù)量離線 MAE 漂亮得驚人上線之后預測結(jié)果一塌糊涂。后來排查發(fā)現(xiàn)普通 KFold 隨機打亂數(shù)據(jù)后某些折的訓練集里出現(xiàn)了“未來”的樣本。比如用第 150 天的數(shù)據(jù)去預測第 149 天的銷量模型相當于提前看到了答案測試誤差當然低。時間序列預測的本質(zhì)是只允許用歷史預測未來任何把未來信息混進訓練過程的操作都是數(shù)據(jù)泄露。正確的做法是用TimeSeriesSplit或者自己寫 Walk-Forward 驗證嚴格保證訓練集的截止時間早于測試集的起始時間。另外要注意的是預測的評估方法也盡量用滾動方式預測完第 t 天之后把這一天的真實值追加進歷史再預測第 t1 天。這樣最接近線上真實運行邏輯單次固定切分的評估結(jié)果多多少少帶點運氣成分。5.3 主成分數(shù)量選錯比不選還糟我前面說過用累計方差貢獻率來定 K 不靠譜這里再補充一個反向案例。我有一組電力負荷數(shù)據(jù)前 3 個主成分累計方差占比超過了 92%但用它們做 PCR驗證集誤差反而比用原始特征直接做嶺回歸還差。檢查后發(fā)現(xiàn)問題出在一個和負荷強相關(guān)的變量“溫差”上它的方差偏小在 PCA 排序里被擠到了第 5 個主成分上。只看方差貢獻率就會錯過真正和 y 相關(guān)的那個方向。這是 PCR 的天然短板PCA 無監(jiān)督降維不保證選出的主成分和預測目標最有關(guān)系。真要對付這種情況有兩個出路。第一個是用交叉驗證來選 K讓預測誤差替你做決定第二個是換用偏最小二乘回歸PLSR它在提取成分時會顯式最大化與 y 的協(xié)方差屬于有監(jiān)督的降維。PLSR 在化學計量等領域用得極多處理“低方差但高相關(guān)”的特征時比 PCR 聰明不少。如果你的業(yè)務數(shù)據(jù)里明顯存在這類特征特斯拉可以直接上 PLSR 做對比。5.4 業(yè)務解釋性受損以及滯后窗口別貪多PCR 把原始特征混合成主成分之后業(yè)務解釋性會打折扣。原始回歸里你可以理直氣壯地說“價格每下降 1%銷量平均上升 0.8%”PCR 不行因為價格信息已經(jīng)和其他特征混在一起了。PC1 可能是“庫存熱度加價格敏感度的綜合體”這玩意兒解釋起來很尷尬。所以在對可解釋性要求極高的場合比如監(jiān)管審計、定價歸因PCR 不算最好的工具我更推薦 LASSO 這類能做變量選擇的模型。滯后特征的選擇上我也吃過虧。早期我圖省事一口氣放了 1 到 30 天的滯后覺得反正 PCR 會自動降維。結(jié)果主成分被高滯后階數(shù)的強自相關(guān)主導短期突變的信號被稀釋了。后來我養(yǎng)成了一個習慣先畫目標變量的自相關(guān)圖ACF看哪些滯后階數(shù)存在顯著的相關(guān)系數(shù)比如日頻數(shù)據(jù)通常是 1、2、3、7、14、21 這些點再按這個列表構(gòu)造滯后特征。質(zhì)量優(yōu)先于數(shù)量特征少而精的時候連 PCR 需要的主成分數(shù)量都能再降一兩個。另外如果特征里有促銷標記、節(jié)假日標記這類 0/1 啞變量也要小心。PCA 是連續(xù)型變量視角下的方法對 0/1 變量算方差再投影結(jié)果往往是把它們和某個連續(xù)的“經(jīng)營熱度”混在一起本來想單獨拆解的節(jié)假效應反而不見了。遇到啞變量較多的場景我通常先把連續(xù)變量做 PCR再把選出的主成分和啞變量拼起來進回歸效果比一股腦全塞進去要干凈。做這套流程做到現(xiàn)在我的固定動作已經(jīng)收斂為先按 ACF 選滯后窗口標準化后用 TimeSeriesSplit 搜 KPCR 跑基線然后看殘差里還有沒有明顯結(jié)構(gòu)有再上更復雜的模型。時間序列預測不追求模型最貴追求的是在給定樣本量下把信號挖得最干凈PCR 在這方面是我用過性價比最高的工具之一。如果你現(xiàn)在正對著一堆高度相關(guān)的特征發(fā)愁不妨先把我這套代碼跑一遍讓主成分回歸給你一個足夠穩(wěn)的起點。