用指南)
簡(jiǎn)介CARS競(jìng)爭(zhēng)性自適應(yīng)重加權(quán)算法可執(zhí)行代碼與文檔整合包面向化學(xué)計(jì)量學(xué)、光譜分析及機(jī)器學(xué)習(xí)研究者解決高維數(shù)據(jù)下PLS回歸的變量選擇與過(guò)擬合問(wèn)題。rar壓縮包內(nèi)共有37個(gè)文件以32個(gè)m格式MATLAB源程序?yàn)橹髁碛?個(gè)mat實(shí)測(cè)數(shù)據(jù)集、1份PDF手冊(cè)、1個(gè)doc說(shuō)明和1張示意圖整體大小1.27MB。已有11425人學(xué)習(xí)下載。資料內(nèi)含PDF操作手冊(cè)、多種示例腳本與玉米光譜數(shù)據(jù)覆蓋CARS、SCARS、PLS、MCS等算法代碼含交叉驗(yàn)證、預(yù)處理、可視化等模塊便于理解自適應(yīng)重加權(quán)迭代流程與RMSECV評(píng)估機(jī)制可直接用于論文復(fù)現(xiàn)和實(shí)際光譜特征篩選。1. 變量篩選為何要競(jìng)爭(zhēng)CARS算法切入光譜建模的獨(dú)特視角近紅外光譜數(shù)據(jù)動(dòng)輒上千個(gè)波長(zhǎng)點(diǎn)變量比樣本還要多按常理信息越豐富模型越準(zhǔn)實(shí)測(cè)卻往往是變量越多預(yù)測(cè)誤差越大。因?yàn)椴ㄩL(zhǎng)點(diǎn)之間存在嚴(yán)重的共線性冗余信息和不相關(guān)噪聲會(huì)把偏最小二乘模型的回歸系數(shù)拉扯變形導(dǎo)致模型泛化能力急速下降。競(jìng)爭(zhēng)性自適應(yīng)重加權(quán)算法CARS要解決的正是這個(gè)矛盾它不追求一次性找出最優(yōu)變量組合而是通過(guò)模擬自然選擇的迭代過(guò)程讓變量在競(jìng)爭(zhēng)中逐輪淘汰最終收斂到一個(gè)低維、低相關(guān)性的變量子集。理解CARS就理解了變量選擇里隨機(jī)但有方向這一類方法背后的設(shè)計(jì)動(dòng)機(jī)與底層機(jī)制。2. CARS的骨架蒙特卡洛采樣與回歸系數(shù)權(quán)重的底層邏輯2.1 蒙特卡洛采樣為什么不看全量樣本CARS的第一步是抽樣。每一輪迭代算法會(huì)從校正集樣本里隨機(jī)抽取一定比例的樣本通常約80%基于這些樣本建立PLS模型。這里有個(gè)問(wèn)題值得先想清楚為什么不直接用全部樣本建模我個(gè)人的理解是變量選擇的目標(biāo)不只是找哪些變量有用還要找哪些變量總是有用——即魯棒性。如果用全量樣本只建一次模型某個(gè)變量的回歸系數(shù)可能是偶然大、也可能是偶然小而多次隨機(jī)抽樣相當(dāng)于給每個(gè)變量提供了多次考試機(jī)會(huì)。一個(gè)真正重要的變量無(wú)論抽到哪一批樣本其回歸系數(shù)的絕對(duì)值都會(huì)穩(wěn)定地居于前列一個(gè)靠運(yùn)氣突出重圍的變量則會(huì)在不同抽樣下權(quán)重忽高忽低。這種做法的本質(zhì)是交叉驗(yàn)證的思想下放到變量評(píng)估不用單獨(dú)留出驗(yàn)證集而是通過(guò)反復(fù)重采樣觀察系數(shù)的穩(wěn)定性。每輪抽樣都得到一組回歸系數(shù)算法比較的是這些系數(shù)在不同抽樣下的相對(duì)大小而不是某一次的絕對(duì)數(shù)值。抽樣比例這個(gè)參數(shù)的敏感性也在這里體現(xiàn)比例太高每輪模型幾乎相同系數(shù)波動(dòng)小等于白抽樣比例太低樣本子集不足以代表整體系數(shù)方差過(guò)大評(píng)估結(jié)果又不可靠。2.2 回歸系數(shù)絕對(duì)值最樸素的變量貢獻(xiàn)度量有了PLS模型每個(gè)變量都會(huì)得到一個(gè)回歸系數(shù)。系數(shù)的絕對(duì)值越大意味著該變量對(duì)預(yù)測(cè)結(jié)果的貢獻(xiàn)越強(qiáng)系數(shù)接近零的變量則基本可以被視為噪聲攜帶者。CARS把每個(gè)變量的回歸系數(shù)絕對(duì)值作為其權(quán)重并在這個(gè)權(quán)重的基礎(chǔ)上設(shè)計(jì)后續(xù)的隨機(jī)抽樣。這里要特別強(qiáng)調(diào)一個(gè)細(xì)節(jié)CARS用的不是VIP分?jǐn)?shù)或相關(guān)系數(shù)而是PLS回歸系數(shù)。原因是回歸系數(shù)天然地考慮了變量之間的聯(lián)合作用——某個(gè)變量單獨(dú)來(lái)看與目標(biāo)值毫無(wú)線性關(guān)系但在PLS的潛變量結(jié)構(gòu)中它可能與其他變量協(xié)同發(fā)揮作用回歸系數(shù)能捕捉這種協(xié)同貢獻(xiàn)。VIP分?jǐn)?shù)也能做到類似的事但VIP是基于協(xié)方差的投影度量而CARS選擇回歸系數(shù)的絕對(duì)值核心動(dòng)機(jī)是可加性多個(gè)變量組合的貢獻(xiàn)大致可以按系數(shù)絕對(duì)值累加這為后面的按權(quán)重隨機(jī)抽樣提供了天然的數(shù)學(xué)基礎(chǔ)。在實(shí)際計(jì)算中權(quán)重計(jì)算非常廉價(jià)核心邏輯只有幾行import numpy as np from sklearn.cross_decomposition import PLSRegression def evaluate_variable_weight(X, y, sample_ratio0.8, n_components5): # 隨機(jī)抽取樣本子集完成蒙特卡洛采樣 n_samples X.shape[0] sampled_idx np.random.choice(n_samples, int(n_samples * sample_ratio), replaceFalse) # 用抽樣樣本建立 PLS 模型 pls PLSRegression(n_componentsn_components) pls.fit(X[sampled_idx], y[sampled_idx]) # 回歸系數(shù)的絕對(duì)值作為該輪變量權(quán)重 coefficients pls.coef_.ravel() weight np.abs(coefficients) # 按權(quán)重降序排序返回排序后的索引和權(quán)重 sorted_idx np.argsort(weight)[::-1] return sorted_idx, weight這段代碼把蒙特卡洛采樣 回歸系數(shù)評(píng)估兩個(gè)步驟壓縮在一個(gè)函數(shù)里。關(guān)鍵參數(shù)有三個(gè)sample_ratio控制抽樣比例過(guò)大則每輪模型幾乎相同失去多樣性過(guò)小則模型不穩(wěn)定系數(shù)估計(jì)方差太大一般取0.7到0.9之間。n_components是PLS潛變量數(shù)它決定模型對(duì)數(shù)據(jù)結(jié)構(gòu)的擬合程度太小會(huì)欠擬合太大會(huì)把噪聲也擬合進(jìn)去。返回值里的sorted_idx專門用于下一階段的變量淘汰。注意coef_的形狀PLSRegression的coef_在單因變量場(chǎng)景下是一個(gè)二維數(shù)組形狀為n_features行、1列所以需要ravel()展平成一維。很多初寫CARS實(shí)現(xiàn)的人會(huì)在這里取錯(cuò)維度導(dǎo)致后續(xù)的索引對(duì)應(yīng)不上原始變量這是一個(gè)非常隱蔽的坑。2.3 權(quán)重排序之后次輪變量子集如何產(chǎn)生每輪評(píng)估完權(quán)重后并不是簡(jiǎn)單地砍掉后半截。CARS使用指數(shù)衰減函數(shù)確定本輪保留的變量比例然后用自適應(yīng)重加權(quán)采樣按權(quán)重從保留變量里做放回式抽樣抽樣結(jié)果作為下一輪的變量子集。這里要區(qū)分兩個(gè)概念強(qiáng)制淘汰與隨機(jī)抽樣。強(qiáng)制淘汰是把當(dāng)前輪次里確定不重要的變量直接刪掉這是硬性操作隨機(jī)抽樣則是在剩余變量里按權(quán)重概率性地選取權(quán)重大的變量有更高概率被選中但權(quán)重小的變量也保留了一絲被選中的機(jī)會(huì)。這個(gè)保留一絲機(jī)會(huì)的設(shè)計(jì)恰恰是CARS與貪心算法的分水嶺——貪心算法會(huì)無(wú)情地丟棄所有當(dāng)前看起來(lái)不重要的變量而CARS允許眼下弱、但組合起來(lái)有用的變量有存活的機(jī)會(huì)。關(guān)于這個(gè)機(jī)制的數(shù)學(xué)細(xì)節(jié)是下一章要展開的重點(diǎn)。3. 指數(shù)衰減函數(shù)與自適應(yīng)重加權(quán)采樣競(jìng)爭(zhēng)淘汰的節(jié)奏控制3.1 EDF的數(shù)學(xué)形式為什么是冪函數(shù)衰減CARS每輪要保留多少比例的變量由指數(shù)衰減函數(shù)EDF決定。設(shè)初始變量總數(shù)為p當(dāng)前第i輪從1開始計(jì)數(shù)總運(yùn)行輪數(shù)為N則第i輪的變量保留率近似為r_i (p_min / p)^(i / N)p_min是計(jì)劃在最后一輪保留的最小變量數(shù)。這個(gè)形式變換一下就能看出指數(shù)衰減的本質(zhì)等式兩邊取對(duì)數(shù)log(r_i) (i/N)·log(p_min/p)保留率的對(duì)數(shù)隨輪次線性下降也就是說(shuō)保留率本身是幾何級(jí)數(shù)式的衰減。開頭幾輪淘汰速度快越到后面淘汰速度越慢。為什么不是線性衰減線性衰減意味著每輪淘汰固定比例這在變量數(shù)很多的光譜場(chǎng)景下會(huì)搶跑——前十幾輪把大量變量快速砍光后面想精細(xì)篩選時(shí)已經(jīng)沒有候選變量了。而指數(shù)衰減前半段快速粗篩、后半段慢速細(xì)選正好匹配光譜變量成百上千個(gè)變量里真正關(guān)鍵的只有幾十個(gè)的分布特征。常見實(shí)現(xiàn)的EDF代碼如下def compute_retained_ratio(current_round, total_rounds, n_variables, min_variables): 計(jì)算第 current_round 輪需要保留的變量比例 current_round: 從 1 開始計(jì)數(shù)的當(dāng)前輪次 total_rounds: 總輪次 N n_variables: 初始變量總數(shù) min_variables: 計(jì)劃最終保留的最小變量數(shù) # 指數(shù)衰減保留率按輪次比例指數(shù)下降 ratio (min_variables / n_variables) ** (current_round / total_rounds) return ratio # 每輪保留變量數(shù) 當(dāng)前變量數(shù) * ratio向下取整 # 典型運(yùn)行軌跡從 1000 個(gè)變量出發(fā)50 輪后計(jì)劃保留約 30 個(gè)這里面的min_variables是個(gè)超參數(shù)一般取2到10之間的值。它并不代表最終一定保留那么多變量而是給EDF一個(gè)收斂錨點(diǎn)讓衰減曲線有末端約束。如果設(shè)得太小比如1衰減曲線過(guò)于陡峭可能在第30輪就把變量數(shù)壓到個(gè)位數(shù)后面的輪次完全退化成矮子里拔將軍如果設(shè)得偏大比如50衰減又太緩前幾輪幾乎沒什么淘汰效果計(jì)算開銷增大。3.2 強(qiáng)制淘汰與自適應(yīng)重加權(quán)一只腳剎車、一只腳油門EDF決定的是保留多少個(gè)——這是剎車ARS決定的是保留哪一些——這是油門。兩者必須配合起來(lái)才能讓迭代正常推進(jìn)。強(qiáng)制淘汰是硬約束即使某個(gè)變量之前一直權(quán)重很高一旦EDF的保留變量數(shù)小于當(dāng)前變量數(shù)權(quán)重最低的那一截會(huì)被直接移除。這個(gè)步驟保證了變量子集規(guī)模的單調(diào)遞減是算法收斂的剎車。自適應(yīng)重加權(quán)采樣是軟操作變量不是簡(jiǎn)單地按權(quán)重比例被抽中而是要經(jīng)過(guò)一個(gè)非均勻采樣過(guò)程。具體做法是把保留下來(lái)的變量按權(quán)重歸一化每個(gè)變量的被抽中概率等于其權(quán)重占總權(quán)重的比例然后從這個(gè)概率分布里做放回抽樣抽出的變量集合作為下一輪輸入。這一步是油門——它讓權(quán)重高的變量在下一輪里被重復(fù)選中從而增加其出鏡率權(quán)重低的變量也有機(jī)會(huì)被抽到避免了重要變量被一步錯(cuò)殺。用一句話概括強(qiáng)制淘汰篩掉確定不行的隨機(jī)重加權(quán)篩掉概率上不行的。前者是規(guī)則驅(qū)動(dòng)后者是概率驅(qū)動(dòng)。3.3 權(quán)重歸一化與相關(guān)性保持還有一個(gè)經(jīng)常被忽略的細(xì)節(jié)CARS的隨機(jī)抽樣是放回式的。放回意味著同一變量可以在一次抽樣中被抽到多次這相當(dāng)于變相提高了該變量在下一輪中的權(quán)重。疊加上權(quán)重歸一化高權(quán)重變量的影響力會(huì)被進(jìn)一步放大。很多人第一次看CARS會(huì)覺得奇怪為什么要放回放回不會(huì)導(dǎo)致變量重復(fù)嗎實(shí)際上放回恰恰是CARS保護(hù)協(xié)同變量組的手段。在光譜數(shù)據(jù)里一個(gè)有效變量往往與其附近波長(zhǎng)的變量高度相關(guān)它們是作為一個(gè)模塊共同發(fā)揮作用的。如果抽樣改成不放回那么當(dāng)某個(gè)模塊里的多個(gè)變量被抽走后模塊的整體貢獻(xiàn)會(huì)被削弱而放回抽樣允許模塊里的關(guān)鍵成員被多次選中保持模塊在下一輪模型中的結(jié)構(gòu)完整性。理解到這一層CARS和普通逐步回歸的差別就更清晰了逐步回歸靠統(tǒng)計(jì)檢驗(yàn)決定變量的去留而CARS靠的是加權(quán)隨機(jī)抽樣帶來(lái)的模塊級(jí)選擇壓力。這種機(jī)制在變量高度共線性的光譜數(shù)據(jù)里特別有效因?yàn)樗恍枰A(yù)先判斷變量之間的相關(guān)結(jié)構(gòu)算法自己會(huì)在競(jìng)爭(zhēng)中自發(fā)地保留那些互相支撐的變量組。4. 從采樣到收斂CARS完整流程的機(jī)制拆解4.1 運(yùn)行階段N輪循環(huán)里發(fā)生了什么把前兩章的機(jī)制拼起來(lái)CARS的完整運(yùn)行流程可以拆成五個(gè)步驟每輪迭代都走一遍從校正集樣本中隨機(jī)抽取一份子集約80%。用該子集建立PLS模型得到每個(gè)變量的回歸系數(shù)。取回歸系數(shù)絕對(duì)值作為變量權(quán)重。用EDF計(jì)算本輪變量保留數(shù)強(qiáng)制淘汰權(quán)重最低的變量。在保留變量中按權(quán)重做自適應(yīng)重加權(quán)采樣生成下一輪的變量子集。迭代N輪之后算法會(huì)得到一個(gè)輪次→變量子集的軌跡。每一輪對(duì)應(yīng)的變量子集都能重新建立PLS模型并用交叉驗(yàn)證評(píng)估預(yù)測(cè)能力。CARS最后做的事情是用交叉驗(yàn)證去評(píng)估每一輪產(chǎn)生的變量子集所建立模型的RMSECV選RMSECV最小的那一輪作為最優(yōu)變量子集。這里的關(guān)鍵是最優(yōu)變量子集往往不是最后那一輪。原因在于EDF在最后幾輪會(huì)把變量數(shù)壓到很小的規(guī)模此時(shí)已經(jīng)出現(xiàn)欠擬合——變量子集漏掉了某些必要的協(xié)同信息。所以CARS的價(jià)值不是收斂到某個(gè)終點(diǎn)而是在收斂路徑上找到一個(gè)最佳停留點(diǎn)。4.2 主循環(huán)實(shí)現(xiàn)與參數(shù)含義下面給出一個(gè)結(jié)構(gòu)完整的CARS主循環(huán)包含EDF、強(qiáng)制淘汰和ARS三個(gè)核心步驟import numpy as np from sklearn.cross_decomposition import PLSRegression from sklearn.model_selection import cross_val_predict from sklearn.metrics import mean_squared_error def cars(X, y, total_rounds50, sample_ratio0.8, min_variables3, n_components5): n_samples, n_vars X.shape current_idx np.arange(n_vars) # 當(dāng)前變量索引 results [] # 每一輪的變量子集與RMSEcv for i in range(1, total_rounds 1): # 1. 蒙特卡洛采樣隨機(jī)抽樣本 sampled_rows np.random.choice(n_samples, int(n_samples * sample_ratio), replaceFalse) X_s X[sampled_rows][:, current_idx] y_s y[sampled_rows] # 2. 建立PLS模型取回歸系數(shù)絕對(duì)值作為權(quán)重 pls PLSRegression(n_componentsn_components) pls.fit(X_s, y_s) coef np.abs(pls.coef_.ravel()) # 3. EDF計(jì)算保留比例得到本輪的保留變量數(shù) ratio (min_variables / n_vars) ** (i / total_rounds) retain_count max(int(len(coef) * ratio), 1) # 4. 強(qiáng)制淘汰只保留權(quán)重最高的 retain_count 個(gè)變量 top_idx np.argsort(coef)[::-1][:retain_count] selected current_idx[top_idx] # 5. 自適應(yīng)重加權(quán)采樣按權(quán)重放回抽樣 weights coef[top_idx] / (coef[top_idx].sum()) sampled np.random.choice(selected, sizelen(selected), pweights, replaceTrue) current_idx np.unique(sampled) # 去重后作為下一輪變量集 # 用當(dāng)前變量子集做交叉驗(yàn)證評(píng)估 cv_pred cross_val_predict(PLSRegression(n_componentsn_components), X[:, current_idx], y, cv5) rmsecv mean_squared_error(y, cv_pred) ** 0.5 results.append((rmsecv, current_idx.copy())) # 選 RMSECV 最小的輪次作為最終變量子集 best min(results, keylambda r: r[0]) return best[1], best[0]幾個(gè)需要注意的參數(shù)細(xì)節(jié)sample_ratio是單輪采樣的樣本比例對(duì)模型穩(wěn)定性影響很大total_rounds是總迭代次數(shù)一般50到100之間min_variables是EDF的末端錨點(diǎn)不能單獨(dú)看要和total_rounds一起調(diào)節(jié)。第5步里np.unique去重是必要的否則放回抽樣可能讓下一輪變量數(shù)膨脹導(dǎo)致EDF無(wú)法按預(yù)期控制規(guī)模。這段代碼也暴露了CARS的一個(gè)典型短板每一輪都要重新訓(xùn)練PLS并進(jìn)行交叉驗(yàn)證計(jì)算量不小。對(duì)于光譜數(shù)據(jù)動(dòng)輒幾千個(gè)變量、幾百個(gè)樣本來(lái)說(shuō)跑50輪通常還好如果數(shù)據(jù)規(guī)模更大建議用并行方式將各輪的交叉驗(yàn)證分散到多個(gè)計(jì)算單元上。4.3 交叉驗(yàn)證與最終選擇輪次軌跡有什么價(jià)值CARS最終的輸出并不是一個(gè)普通的變量列表而是一個(gè)帶評(píng)估記錄的軌跡。這個(gè)軌跡信息非常有用第一它可以告訴你模型從過(guò)擬合到欠擬合的變化過(guò)程。最早的幾輪變量最多、模型最容易過(guò)擬合中間的輪次變量數(shù)適中RMSECV往往最低最后幾輪變量太少RMSECV重新上升。畫出輪次→RMSECV的曲線你會(huì)非常直觀地看到什么規(guī)模的變量子集對(duì)這組數(shù)據(jù)是甜蜜點(diǎn)。第二它可以幫你識(shí)別不穩(wěn)定變量。如果一個(gè)變量在多輪次中都出現(xiàn)在變量子集里說(shuō)明它是穩(wěn)定重要的如果某變量只在個(gè)別輪次出現(xiàn)且其后迅速消失說(shuō)明它權(quán)重不高、可有可無(wú)。實(shí)踐中運(yùn)行多次CARS統(tǒng)計(jì)每個(gè)變量被選中的頻率挑選出現(xiàn)頻率高的變量組成最終集合是一種比單次運(yùn)行更穩(wěn)健的做法。第三輪次曲線的形狀還能用來(lái)判斷潛變量數(shù)n_components設(shè)得是否合理。如果曲線非常平坦、所有輪次的RMSECV都差不多說(shuō)明潛變量數(shù)選擇不當(dāng)模型沒有充分利用變量信息如果曲線在中間輪次出現(xiàn)明顯低谷則說(shuō)明潛變量數(shù)設(shè)置是合適的。5. CARS實(shí)踐避坑變量篩選中的常見問(wèn)題與排查5.1 每次運(yùn)行選出的變量都不一樣現(xiàn)象同一份數(shù)據(jù)、同樣的參數(shù)連續(xù)跑三次CARS三次選出的變量子集重合度不到一半。原因CARS每一輪都做蒙特卡洛采樣隨機(jī)性從第一輪就開始累積。如果total_rounds取得偏小比如20輪隨機(jī)偏差還沒有被充分平均掉最終結(jié)果會(huì)高度依賴初始抽樣的運(yùn)氣。解決把total_rounds提到50以上并多次運(yùn)行取變量出現(xiàn)頻率。具體做法是先跑10次CARS統(tǒng)計(jì)每個(gè)變量被選中的次數(shù)再按出現(xiàn)頻率排序選出高頻變量。留意一個(gè)邊界情況如果樣本量本來(lái)就只有40、50個(gè)抽樣比例0.8會(huì)讓每輪僅抽30多個(gè)樣本此時(shí)建議降低total_rounds、提高sample_ratio到0.85以上避免樣本代表性不足。5.2 先標(biāo)準(zhǔn)化還是先跑CARS現(xiàn)象CARS選出的變量集中在中高頻波長(zhǎng)段而低頻段幾乎沒有變量被選中模型效果卻很差。原因不同波段的信號(hào)強(qiáng)度差異很大。CARS的權(quán)重基于PLS回歸系數(shù)絕對(duì)值如果原始光譜沒有做過(guò)標(biāo)準(zhǔn)化數(shù)值大的波段天然會(huì)獲得更高權(quán)重算法傾向保留數(shù)值大的變量而不是貢獻(xiàn)大的變量。解決先對(duì)光譜數(shù)據(jù)做均值中心化或方差標(biāo)準(zhǔn)化再運(yùn)行CARS。均值中心化通常就夠了因?yàn)镻LS本身對(duì)數(shù)據(jù)的列中心化有天然需求如果數(shù)據(jù)量綱差異極端再疊加方差標(biāo)準(zhǔn)化。經(jīng)驗(yàn)上標(biāo)準(zhǔn)化的操作必須在劃分校正集和測(cè)試集之前統(tǒng)一完成避免數(shù)據(jù)泄漏。5.3 校正集和測(cè)試集劃分時(shí)機(jī)不對(duì)現(xiàn)象CARS在訓(xùn)練數(shù)據(jù)上選出的變量表現(xiàn)很好但在獨(dú)立測(cè)試集上誤差翻倍。原因如果先把全部樣本混在一起做CARS再劃分校正集和測(cè)試集變量選擇過(guò)程已經(jīng)把測(cè)試集的信息泄漏進(jìn)了模型的選變量階段。這屬于典型的后選擇偏差變量選擇時(shí)的交叉驗(yàn)證結(jié)果虛高真實(shí)泛化能力遠(yuǎn)低于預(yù)期。解決嚴(yán)格按照先劃分、后篩選的流程先把數(shù)據(jù)按7:3或8:2切成校正集和測(cè)試集只在校正集上運(yùn)行CARS選出的變量固定后再用相同的變量索引去提取測(cè)試集特征。CARS的變量選擇結(jié)果不能因?yàn)榧尤肓藴y(cè)試集樣本而重新計(jì)算。5.4 RMSECV最小的輪次太多無(wú)法區(qū)分現(xiàn)象RMSECV曲線在很長(zhǎng)一段范圍內(nèi)非常接近最小值前后的輪次波動(dòng)差別很小難以判斷哪一輪是真正最優(yōu)。原因變量子集之間的預(yù)測(cè)能力差異可能很小交叉驗(yàn)證本身的隨機(jī)波動(dòng)就已經(jīng)掩蓋了差異。這種情況在共線性嚴(yán)重、變量數(shù)接近的情況下很常見。解決優(yōu)先選變量數(shù)更少的那一輪因?yàn)槟P透?jiǎn)潔、更容易部署和解釋。另外可以配合變量出現(xiàn)頻率選同時(shí)滿足RMSECV接近最優(yōu)和變量出現(xiàn)頻率高的子集。提示CARS選出的變量子集必須經(jīng)過(guò)再驗(yàn)證。用選出的變量重新建立PLS模型在測(cè)試集上計(jì)算RMSEP和全變量模型對(duì)比確認(rèn)變量篩選確實(shí)帶來(lái)了泛化性能提升才算走完完整流程。5.5 數(shù)據(jù)量太小導(dǎo)致PLS擬合失敗現(xiàn)象某輪迭代時(shí)PLS模型無(wú)法收斂報(bào)出線性代數(shù)相關(guān)的錯(cuò)誤。原因蒙特卡洛抽樣后參與建模的樣本數(shù)可能少于潛變量數(shù)或在某些變量組合下設(shè)計(jì)矩陣接近奇異導(dǎo)致矩陣求逆失敗。解決檢查n_components是否小于抽樣樣本數(shù)的三分之一提前對(duì)抽樣后的矩陣做條件數(shù)檢查如果條件數(shù)過(guò)大跳過(guò)該輪或重新抽樣。更根本的做法是在數(shù)據(jù)預(yù)處理階段先做簡(jiǎn)單的無(wú)信息變量剔除把明顯是純?cè)肼暤牟ㄩL(zhǎng)提前刪掉減少CARS在高危區(qū)域掙扎的概率。6. 設(shè)計(jì)取舍為什么CARS選擇競(jìng)爭(zhēng)而不是貪心把CARS和同類算法擺在一起會(huì)看到一條清晰的設(shè)計(jì)取舍線。逐步回歸、向前選擇這類貪心算法試圖在每一步做出當(dāng)前最優(yōu)的決定每步精準(zhǔn)砍掉一個(gè)或幾個(gè)變量參數(shù)少、可解釋性強(qiáng)但它們對(duì)變量的共線性極度敏感兩個(gè)相關(guān)性極高的變量貪心算法會(huì)先選一個(gè)然后再也無(wú)法公正評(píng)估另一個(gè)的獨(dú)立貢獻(xiàn)。CARS用隨機(jī)性和競(jìng)爭(zhēng)繞開了這個(gè)問(wèn)題——它不在每一步做最優(yōu)決策而是讓多個(gè)變量在反復(fù)競(jìng)爭(zhēng)中自發(fā)分層重要變量自然留在高頻區(qū)冗余變量被隨機(jī)淘汰。這個(gè)選擇是有代價(jià)的CARS的隨機(jī)性導(dǎo)致單次運(yùn)行結(jié)果不可完全復(fù)現(xiàn)必須靠多次運(yùn)行或調(diào)大N來(lái)?yè)Q取穩(wěn)定。相比貪心算法的一次性確定輸出CARS像是一種統(tǒng)計(jì)式的變量選擇它的結(jié)果本質(zhì)上是一個(gè)概率分布而不是一個(gè)唯一答案。我個(gè)人的使用習(xí)慣是把CARS當(dāng)作變量預(yù)篩器而非最終決策器。先用CARS把變量從上千壓到幾十再用簡(jiǎn)單的手工推理或逐步回歸從幾十里挑出最終的十幾二十個(gè)。這樣既利用了CARS對(duì)共線性的容忍又保留了貪心算法在最后階段的確定性。另一個(gè)值得想的設(shè)計(jì)點(diǎn)是EDF的強(qiáng)制性。為什么不讓權(quán)重直接決定去留而要額外加一個(gè)指數(shù)衰減的外力因?yàn)榧儼礄?quán)重隨機(jī)抽樣變量的淘汰速度會(huì)很慢而且方差大EDF給了整個(gè)迭代一個(gè)時(shí)間表讓變量數(shù)在第N輪之前收斂到用戶預(yù)設(shè)的尺度。這個(gè)外力看似粗暴其實(shí)是對(duì)隨機(jī)過(guò)程的一種正則化——它保證了收斂速度也讓何時(shí)停止這個(gè)問(wèn)題擺脫了對(duì)權(quán)重閾值的主觀設(shè)定。從那以后我每次跑CARS都會(huì)做三件事先畫RMSECV曲線看收斂節(jié)奏多跑幾次統(tǒng)計(jì)頻率再用最終變量子集做一次獨(dú)立的測(cè)試集驗(yàn)證。這套流程每次都能幫我把變量從混亂的物理信號(hào)里撈出來(lái)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取