合距離、KS對(duì)比與評(píng)估避坑指南)
簡(jiǎn)介面向近紅外光譜建模與機(jī)器學(xué)習(xí)入門的樣本集劃分實(shí)踐材料聚焦SPXY樣本劃分法及其與蒙特卡羅交叉驗(yàn)證結(jié)合時(shí)的模型優(yōu)化思路適合需要處理訓(xùn)練集、驗(yàn)證集與測(cè)試集劃分并評(píng)估模型泛化能力的高年級(jí)本科生、研究生和算法初學(xué)者。壓縮包共4個(gè)文件約291KB以3個(gè)MATLAB腳本和1份PDF文獻(xiàn)為主腳本覆蓋SPXY劃分、隨機(jī)劃分與KS檢驗(yàn)等環(huán)節(jié)文獻(xiàn)結(jié)合橘葉中橙皮苷含量測(cè)定案例說明光譜數(shù)據(jù)預(yù)處理、樣本選擇及交叉驗(yàn)證的完整流程。已有1827人學(xué)習(xí)反映該主題在光譜定量分析與模型驗(yàn)證中關(guān)注度較高。讀者可據(jù)此理解SPXY如何兼顧特征空間與濃度分布比較不同劃分策略對(duì)預(yù)測(cè)精度的影響并借助KS檢驗(yàn)判斷預(yù)測(cè)分布與真實(shí)分布的差異為參數(shù)調(diào)優(yōu)和最終評(píng)估提供可復(fù)用的腳本與實(shí)驗(yàn)參照。1. 一份「自己出題自己考」的成績單樣本集劃分到底在分什么小時(shí)候都干過這種事把練習(xí)冊(cè)的答案抄一遍再把同一套題當(dāng)考試做分?jǐn)?shù)當(dāng)然漂亮可換一套題就原形畢露。模型也是這個(gè)毛病——喂給它見過的樣本它答得又快又準(zhǔn)真正要看的是它面對(duì)沒見過的樣本還能不能站住。樣本集劃分要解決的正是這個(gè)問題把有限的樣本切成幾份一份用來“學(xué)”一份藏起來“考”。SPXY 是其中比較講究的一種做法全稱叫“基于 X 與 Y 聯(lián)合距離的樣本集劃分”。名字唬人說白了它只是在決定“哪些樣本去當(dāng)練習(xí)題、哪些去當(dāng)考卷”時(shí)比隨機(jī)抓鬮多考慮了一件事——樣本的標(biāo)簽值也得分布均勻。搞懂它你才能判斷自己那份模型成績單到底是真本事還是背答案。2. 為什么不能隨手一劃KS 與 SPXY 差在「看不看 Y」這一刀很多人第一次做劃分直接train_test_split一下比例 8:2跑完指標(biāo) 0.98開心得不行。等換一批新樣本進(jìn)來誤差翻了三倍才發(fā)現(xiàn)當(dāng)初那份成績單是摻了水的。問題往往不在模型而在“分”這一步就已經(jīng)埋下了雷。2.1 隨機(jī)劃分翻車的三個(gè)典型場(chǎng)景第一個(gè)場(chǎng)景是濃度斷層。一批樣本的參考值集中在中間某個(gè)窄區(qū)間只有零星幾個(gè)落在兩端。隨機(jī)切 20% 做測(cè)試集很可能低端那幾個(gè)樣本一個(gè)都沒被抽中于是模型在低濃度段的表現(xiàn)完全無從驗(yàn)證。指標(biāo)好看是因?yàn)榭季砝飰焊鶝]有難題。第二個(gè)場(chǎng)景是批次漂移。樣本按時(shí)間順序采集儀器上午和下午的狀態(tài)有細(xì)微差別。如果直接按順序切前 80% 訓(xùn)練、后 20% 測(cè)試測(cè)試集就整段落在“下午”測(cè)出來的其實(shí)是跨批次泛化能力。這未必是錯(cuò)但你得清楚自己在測(cè)什么而不是把結(jié)果當(dāng)成“模型精度”四個(gè)字貼到報(bào)告上。第三個(gè)場(chǎng)景是平行樣泄漏。同一樣品測(cè)了三次或者為了擴(kuò)樣本量做了輕微擾動(dòng)這些“親戚樣本”被隨機(jī)分到不同集合里。測(cè)試集里坐著一堆訓(xùn)練集的近親指標(biāo)自然虛高。這類翻車最隱蔽因?yàn)榱鞒躺厦恳徊蕉己弦?guī)只有把樣本的來源捋一遍才會(huì)發(fā)現(xiàn)。隨機(jī)劃分的問題在于它不保證任何事。它只保證每個(gè)樣本有固定概率落進(jìn)某一側(cè)至于落完之后兩邊的分布像不像它不管。樣本量上千、分布本身就均勻的時(shí)候這種“不管”影響不大樣本量只有一百出頭、標(biāo)簽范圍又拉得很開的時(shí)候一次不走運(yùn)的隨機(jī)就足以讓整篇結(jié)論作廢。2.2 KS 方法只看 X 距離的均勻撒點(diǎn)KS 全稱 Kennard-Stone比 SPXY 早出現(xiàn)很多年思路樸素得很樣本在特征空間里鋪得越開模型見到的情況就越全。它只關(guān)心 X也就是光譜、圖像特征、工藝參數(shù)這一側(cè)。做法是這樣的先算出所有樣本兩兩之間的 X 距離挑出距離最遠(yuǎn)的那一對(duì)作為種子然后每一輪對(duì)每個(gè)還沒入選的樣本算出它到“已選集合”里所有樣本的距離取其中最小的那個(gè)再從所有候選里挑出這個(gè)最小值最大的樣本加入已選集合。重復(fù)到訓(xùn)練集湊夠數(shù)為止。這套“最大最小距離”的邏輯效果是讓選出來的樣本彼此盡量疏遠(yuǎn)像往一張地圖上撒點(diǎn)先撒最邊上的再往中間填空。好處是確定性算法沒有隨機(jī)種子同一個(gè)數(shù)據(jù)集跑一百遍結(jié)果都一樣可復(fù)現(xiàn)壞處是它眼里只有 X。如果兩個(gè)樣本在 X 空間離得很遠(yuǎn)但標(biāo)簽值幾乎相同KS 會(huì)優(yōu)先把它們都選進(jìn)訓(xùn)練集白白占掉名額。更麻煩的情況是 X 和 Y 的關(guān)系不單調(diào)。比如某段光譜區(qū)間對(duì)濃度不敏感兩個(gè)濃度差很多的樣本光譜卻長得幾乎一樣。KS 看不出這個(gè)差別它按 X 距離挑很可能把一整段濃度區(qū)間的樣本全漏掉。等到測(cè)試集里冒出一個(gè)該區(qū)間的樣本模型只能靠外推硬猜。2.3 SPXY 方法把 Y 也拉進(jìn)距離公式SPXY 的關(guān)鍵改動(dòng)只有一處距離不再只算 X而是把 Y 也算一份各自歸一化后相加。$$d_{xy}(p,q)\frac{d_x(p,q)}{\max d_x}\frac{d_y(p,q)}{\max d_y}$$$d_x$ 是樣本 $p$、$q$ 在特征矩陣上的歐氏距離$d_y$ 是它們?cè)趨⒖贾瞪系臍W氏距離。單變量時(shí) $d_y$ 就是兩個(gè)數(shù)值之差的絕對(duì)值多變量時(shí)按歐氏距離算。分母上的兩個(gè) $\max$ 是整套方法里最容易被忽略、也最不能省的一步。原始光譜的強(qiáng)度動(dòng)輒幾千算出來的 $d_x$ 可能是幾百上千而參考值如果是含量百分比$d_y$ 可能只有零點(diǎn)幾。不歸一化直接相加Y 的貢獻(xiàn)會(huì)被 X 徹底淹沒SPXY 就退化成了 KS。除以各自的最大值之后兩項(xiàng)都被壓進(jìn) 0 到 1 之間權(quán)重才對(duì)等。換個(gè)說法KS 挑樣本時(shí)只問“這兩個(gè)樣本長得像不像”SPXY 還要多問一句“它們的答案差多少”。長得不像、答案又差得多的樣本SPXY 會(huì)優(yōu)先送進(jìn)訓(xùn)練集因?yàn)檫@類樣本信息量最大。2.4 一個(gè)公式看清兩者的分水嶺把三種常見做法擺在一起差別一目了然。維度隨機(jī)劃分KSSPXY挑選依據(jù)無純概率僅 X 距離X 與 Y 聯(lián)合距離結(jié)果是否可復(fù)現(xiàn)需固定隨機(jī)種子是是訓(xùn)練集覆蓋 Y 范圍不保證不保證更容易覆蓋兩端額外計(jì)算開銷幾乎沒有一個(gè) X 距離矩陣兩個(gè)距離矩陣適合的場(chǎng)面樣本量大、分布本身均勻只關(guān)心特征空間覆蓋樣本少、參考值跨度大分水嶺就在中間那一列。KS 和 SPXY 的流程幾乎一模一樣代碼改一行就能互換但選出來的樣本集合可能差得很遠(yuǎn)。判斷該用哪個(gè)看的不是哪個(gè)名字更時(shí)髦而是你的 Y 分布是不是均勻——Y 本來就均勻KS 夠用Y 有明顯斷層或者兩端樣本稀少SPXY 那額外一份距離就算得值。3. SPXY 走一遍從距離矩陣到挑出第一批樣本公式看懂了落到操作上還有幾步容易踩坑的地方。這一章把流程拆開走一遍順便說清楚每個(gè)參數(shù)改動(dòng)的后果。3.1 第一步永遠(yuǎn)是看數(shù)據(jù)不是算距離拿到一份樣本集先做三件事看樣本量、看 Y 的分布、看有沒有重復(fù)或近似重復(fù)的樣本。這三件事決定了后面所有參數(shù)怎么定。樣本量決定測(cè)試集能有多大。總共 60 個(gè)樣本按 8:2 分測(cè)試集只有 12 個(gè)任何一個(gè)樣本預(yù)測(cè)偏了指標(biāo)就大幅波動(dòng)。這時(shí)候更合理的比例是 2:1 甚至 3:1把測(cè)試集撐到 20 個(gè)以上。樣本量上千比例反倒可以放松因?yàn)榻y(tǒng)計(jì)量本身已經(jīng)穩(wěn)了。Y 的分布決定要不要用 SPXY。把 Y 畫成直方圖如果兩端稀稀拉拉、中間堆成一座山隨機(jī)劃分和 KS 都有較大概率漏掉兩端SPXY 值得上。如果 Y 近似均勻分布那 KS 省一半計(jì)算量效果差不多。重復(fù)樣本要在劃分之前處理掉。同一樣品測(cè)三次這三條記錄必須分進(jìn)同一個(gè)集合否則就是前面說的泄漏。做法很簡(jiǎn)單給每個(gè)原始樣品編一個(gè)組號(hào)劃分時(shí)按組號(hào)分而不是按行號(hào)分。還有一步常被跳過X 的各列要不要標(biāo)準(zhǔn)化。如果特征里既有光譜強(qiáng)度量級(jí)上千又有溫度量級(jí)幾十直接算歐氏距離光譜會(huì)獨(dú)占話語權(quán)溫度等于沒參與。用歐氏距離之前把 X 各列標(biāo)準(zhǔn)化到同一量級(jí)這個(gè)距離才有意義。SPXY 公式里那層歸一化解決的是“X 距離和 Y 距離之間”的量級(jí)差解決不了“X 內(nèi)部各列之間”的量級(jí)差兩件事不能混。3.2 選出起手的那一對(duì)最遠(yuǎn)樣本算完聯(lián)合距離矩陣第一步是在整個(gè)矩陣?yán)镎易畲笾?。這一對(duì)樣本就是種子直接進(jìn)訓(xùn)練集。為什么從最遠(yuǎn)的一對(duì)開始因?yàn)樗鼈兇砹诉@個(gè)數(shù)據(jù)集能覆蓋的邊界。先把邊界占住后面的樣本才是在邊界之間填空整個(gè)訓(xùn)練集的覆蓋范圍從第一輪就定下了基調(diào)。這里有個(gè)細(xì)節(jié)如果數(shù)據(jù)里存在測(cè)量錯(cuò)誤的離群樣本它很可能就是那個(gè)“最遠(yuǎn)點(diǎn)”第一輪就被選進(jìn)訓(xùn)練集。這是好事還是壞事取決于那個(gè)離群點(diǎn)是真實(shí)極端情況還是錄入錯(cuò)誤。真實(shí)極端情況該進(jìn)訓(xùn)練集模型得見過錄入錯(cuò)誤進(jìn)了訓(xùn)練集等于往模型嘴里塞了一口沙子。所以劃分之前先看一眼最遠(yuǎn)的那幾對(duì)是誰值不值得信任這一步花不了五分鐘能省掉后面很多返工。3.3 逐輪挑選誰離已選集合最遠(yuǎn)就選誰種子定下之后進(jìn)入循環(huán)。每一輪做三件事算每個(gè)未選樣本到已選集合里所有樣本的距離、取最小值、在所有候選里挑這個(gè)最小值最大的那個(gè)。注意這里是“最小距離的最大值”不是“最大距離的最大值”。區(qū)別在于如果只看最大距離一個(gè)離某個(gè)已選樣本很遠(yuǎn)的樣本會(huì)被優(yōu)先選中但它可能同時(shí)離另一個(gè)已選樣本很近選進(jìn)來等于在密集區(qū)又添了一個(gè)點(diǎn)沒有增加覆蓋。取最小距離意思是“這個(gè)候選離已選集合最近的那個(gè)點(diǎn)有多遠(yuǎn)”這個(gè)值越大說明它離整個(gè)已選集合越疏遠(yuǎn)選它才真正擴(kuò)大覆蓋。這個(gè)機(jī)制帶來一個(gè)隱含后果值得單獨(dú)說一句SPXY 選出的順序本質(zhì)上是“從邊緣往中間收”。排在前面的樣本偏邊緣越往后越靠近密集區(qū)。如果你的訓(xùn)練集取前 70%測(cè)試集就是剩下的 30%那測(cè)試集大概率集中在密集區(qū)幾乎不含極端樣本。這意味著模型的外推能力沒有被檢驗(yàn)測(cè)出來的指標(biāo)反映的是內(nèi)插表現(xiàn)。這不是 SPXY 的缺陷是它的特性但你得知道。如果業(yè)務(wù)上關(guān)心的是“超出歷史范圍的新樣本能不能預(yù)測(cè)準(zhǔn)”那測(cè)試集里必須人為保留幾個(gè)極端樣本不能全交給算法去分。做法是從兩端各留一兩個(gè)樣本不參與劃分直接塞進(jìn)測(cè)試集剩下的再走 SPXY。這一手有點(diǎn)土但管用。3.4 完整實(shí)現(xiàn)與參數(shù)逐個(gè)拆開看下面這段是標(biāo)準(zhǔn)實(shí)現(xiàn)把前面幾節(jié)的邏輯落成代碼。import numpy as np def spxy(X, y, n_train): 基于 X-Y 聯(lián)合距離的樣本集劃分 X: 特征矩陣形狀 (n_samples, n_features) y: 參考值形狀 (n_samples,) 或 (n_samples, n_targets) n_train: 訓(xùn)練集樣本數(shù) 返回: (訓(xùn)練集下標(biāo), 測(cè)試集下標(biāo)) X np.asarray(X, dtypefloat) y np.asarray(y, dtypefloat).reshape(len(X), -1) # 1. 分別計(jì)算 X 空間與 Y 空間的歐氏距離矩陣 dx np.sqrt(((X[:, None, :] - X[None, :, :]) ** 2).sum(axis-1)) dy np.sqrt(((y[:, None, :] - y[None, :, :]) ** 2).sum(axis-1)) # 2. 各自除以本矩陣最大值壓到 0~1讓兩項(xiàng)權(quán)重對(duì)等 d dx / dx.max() dy / dy.max() n len(X) # 3. 起手聯(lián)合距離最大的一對(duì)樣本 i, j np.unravel_index(np.argmax(d), d.shape) selected [int(i), int(j)] # 4. 循環(huán)每輪選“到已選集合最小距離”最大的候選 while len(selected) n_train: rest [k for k in range(n) if k not in selected] # d[np.ix_(rest, selected)] 取出候選行 × 已選列的子矩陣 min_to_selected d[np.ix_(rest, selected)].min(axis1) selected.append(rest[int(np.argmax(min_to_selected))]) test [k for k in range(n) if k not in selected] return np.array(selected), np.array(test)幾個(gè)參數(shù)的含義和改動(dòng)后果n_train決定訓(xùn)練集大小。它和測(cè)試集大小是互補(bǔ)的設(shè)成 0.7 倍樣本數(shù)就是 7:3。改這個(gè)值會(huì)直接改變訓(xùn)練集覆蓋的疏密程度n_train 越小訓(xùn)練集越偏向邊緣模型見到的中段樣本越少。dy的算法對(duì)單變量和多變量不一樣。單變量時(shí)用絕對(duì)差也行多變量時(shí)必須用歐氏距離否則多個(gè)目標(biāo)值之間沒法合成一個(gè)標(biāo)量。如果你的 y 是多列輸出reshape(len(X), -1)那一步不能省否則廣播會(huì)出錯(cuò)。dx.max()和dy.max()這兩個(gè)分母如果某個(gè)矩陣全零所有樣本特征完全一致會(huì)除零報(bào)錯(cuò)。實(shí)際數(shù)據(jù)里很難出現(xiàn)但做小規(guī)模試驗(yàn)時(shí)可能碰到加個(gè)判斷更穩(wěn)妥。整個(gè)函數(shù)返回的是下標(biāo)不是數(shù)據(jù)本身。這個(gè)設(shè)計(jì)是為了讓原始數(shù)據(jù)保持不動(dòng)訓(xùn)練集和測(cè)試集在需要的時(shí)候按下標(biāo)取避免復(fù)制帶來的內(nèi)存開銷也避免改動(dòng)順序后對(duì)不上號(hào)。跑完之后別急著建模先把兩組樣本的 Y 值分布畫出來對(duì)比一眼。理想狀態(tài)下訓(xùn)練集的 Y 覆蓋整個(gè)范圍測(cè)試集的 Y 落在范圍之內(nèi)且分布均勻。如果測(cè)試集某一段完全空白說明劃分還有問題得回去調(diào) n_train 或者手動(dòng)補(bǔ)樣本。4. 易混與誤區(qū)SPXY、KS、交叉驗(yàn)證別攪成一鍋這三個(gè)詞經(jīng)常在同一段話里出現(xiàn)功能卻完全不在一個(gè)層面上。把它們分開比記住公式更重要。4.1 誤區(qū)一SPXY 是一種建模算法易混點(diǎn)名字里沒有“劃分”二字看起來和 PLS、SVR 這些算法是并列關(guān)系很多資料里也確實(shí)把它們排在一起講。為什么混SPXY 總是出現(xiàn)在建模流程的上下文里前后文都在聊模型精度很容易被當(dāng)成“又一種建模方法”。怎么區(qū)分看它的輸出。SPXY 輸出的是兩組下標(biāo)——訓(xùn)練集是哪幾行、測(cè)試集是哪幾行它不產(chǎn)生任何預(yù)測(cè)值也不擬合任何參數(shù)。建模算法吃的是數(shù)據(jù)吐的是預(yù)測(cè)SPXY 吃的是數(shù)據(jù)吐的是“怎么分”。它跑完之后模型還是那個(gè)模型只是喂進(jìn)去的樣本換了。所以 SPXY 的效果不能單獨(dú)評(píng)價(jià)只能通過“用了它之后模型在測(cè)試集上的表現(xiàn)”間接體現(xiàn)。順帶提一句拼寫。有些資料里寫成sxpy其實(shí)就是 SPXY 的手誤兩者指的是同一個(gè)東西。搜索的時(shí)候兩種寫法都試一下能多找到一些材料。4.2 誤區(qū)二KS 和 SPXY 只差一個(gè)字母可以隨便換易混點(diǎn)流程一模一樣代碼只改一行距離矩陣結(jié)果看起來也差不多于是很多人默認(rèn)兩者等價(jià)。為什么混在 Y 分布本來就均勻的數(shù)據(jù)集上兩者的選擇結(jié)果確實(shí)高度重合跑出來的模型精度也相差無幾。這時(shí)候換不換指標(biāo)上看不出來。怎么區(qū)分把兩份劃分結(jié)果各自的 Y 直方圖拉出來比。如果 Y 分布均勻兩者幾乎一樣用 KS 更省事如果 Y 有兩端稀薄、中間堆積的情況SPXY 的訓(xùn)練集會(huì)明顯更均衡地覆蓋兩端KS 則可能在中段扎堆。判斷標(biāo)準(zhǔn)不在算法本身在你的數(shù)據(jù)長什么樣。另外KS 的計(jì)算量少一個(gè)距離矩陣樣本上萬時(shí)這個(gè)差別不小值得納入考慮。4.3 誤區(qū)三做了交叉驗(yàn)證就不用留測(cè)試集易混點(diǎn)k 折交叉驗(yàn)證給出的分?jǐn)?shù)看起來很嚴(yán)謹(jǐn)每一折都當(dāng)過驗(yàn)證集感覺已經(jīng)把泛化能力測(cè)透了。為什么混兩者測(cè)的都是“模型在沒見過的樣本上表現(xiàn)如何”聽起來像同一件事的兩種叫法。怎么區(qū)分交叉驗(yàn)證發(fā)生在訓(xùn)練集內(nèi)部用途是選超參數(shù)、比模型結(jié)構(gòu)測(cè)試集是完全不參與任何決策的一批樣本只在最后用一次。區(qū)別在“用了幾次”。交叉驗(yàn)證會(huì)被反復(fù)用——試十組參數(shù)每組都跑一遍交叉驗(yàn)證取分?jǐn)?shù)最高的那組。這個(gè)過程里驗(yàn)證集的信息已經(jīng)通過你的選擇滲進(jìn)了模型。測(cè)試集如果也這么用它就不再是獨(dú)立的考卷而是變成了第二個(gè)驗(yàn)證集指標(biāo)會(huì)越來越樂觀越來越不真實(shí)。正確的順序是訓(xùn)練集內(nèi)部做交叉驗(yàn)證定參數(shù)模型定死之后測(cè)試集只跑一次跑完就封存。4.4 誤區(qū)四測(cè)試集指標(biāo)不好看調(diào)一調(diào)再測(cè)一次易混點(diǎn)第一次測(cè)出來誤差偏大回去改了改特征再測(cè)一遍好多了于是認(rèn)為模型進(jìn)步了。為什么混這個(gè)操作在流程上完全跑得通代碼也不會(huì)報(bào)錯(cuò)結(jié)果也確實(shí)變好了看不出問題。怎么區(qū)分問題在于“變好”的原因。你看到了測(cè)試集的結(jié)果然后根據(jù)這個(gè)結(jié)果改了模型——這一步之后測(cè)試集的信息就已經(jīng)泄漏進(jìn)模型了。第二次的指標(biāo)不再是無偏估計(jì)而是“針對(duì)這份考卷調(diào)過參”的成績。改一次還能接受改十次之后那個(gè)指標(biāo)基本沒什么參考價(jià)值了。真要做這一步就把原測(cè)試集降級(jí)成驗(yàn)證集另外再劃一批從來沒碰過的樣本當(dāng)新測(cè)試集。樣本不夠劃怎么辦那就別調(diào)接受第一次的結(jié)果或者承認(rèn)這份數(shù)據(jù)的結(jié)論強(qiáng)度有限。4.5 誤區(qū)五比例照著 7:3 抄就不會(huì)錯(cuò)易混點(diǎn)到處都在寫 7:3、8:2仿佛這是某種標(biāo)準(zhǔn)答案。為什么混大多數(shù)教程的示例數(shù)據(jù)樣本量都在幾百上千那個(gè)量級(jí)下比例怎么定影響都不大于是比例被當(dāng)成了固定參數(shù)。怎么區(qū)分比例的本質(zhì)是“測(cè)試集要裝多少個(gè)樣本才夠支撐一個(gè)可信的判斷”。樣本量 50 的時(shí)候7:3 意味著測(cè)試集 15 個(gè)一個(gè)樣本預(yù)測(cè)偏了指標(biāo)就跳一大截這時(shí)候 2:1 讓測(cè)試集到 17 個(gè)也沒什么本質(zhì)改善反而訓(xùn)練集更緊張。樣本量 50 這種小數(shù)據(jù)集更實(shí)際的做法是留一交叉驗(yàn)證或者重復(fù)多次隨機(jī)劃分取平均而不是糾結(jié)一個(gè)固定比例。反過來樣本量上萬的時(shí)候測(cè)試集留 10% 就是一千個(gè)統(tǒng)計(jì)上足夠穩(wěn)多留純屬浪費(fèi)訓(xùn)練數(shù)據(jù)。比例跟著樣本量和任務(wù)難度走不跟著教程走。5. 什么時(shí)候該用 SPXY什么時(shí)候該收手把前面幾章的意思收成一句話SPXY 是解決“Y 分布不均、樣本又少”這個(gè)組合問題的工具脫離這個(gè)前提它的優(yōu)勢(shì)就不成立。下面這張表可以直接對(duì)著自己的數(shù)據(jù)比。你的情況建議做法樣本量一百出頭參考值跨度大、兩端樣本稀少SPXY訓(xùn)練集比例放寬到 2:1 或 3:1樣本量幾百以上Y 分布本身均勻KS 或隨機(jī)劃分都行省計(jì)算樣本按批次、按時(shí)間采集存在系統(tǒng)漂移先按批次分層再在每層內(nèi)部用 SPXY存在同一樣品的多次測(cè)量按樣品分組劃分絕不按行號(hào)隨機(jī)關(guān)心的是超出歷史范圍的外推能力SPXY 劃分后手動(dòng)從兩端各抽樣本補(bǔ)進(jìn)測(cè)試集樣本量不到 30別硬分測(cè)試集用留一交叉驗(yàn)證Y 是多列輸出且量綱差異大先對(duì)每列 y 標(biāo)準(zhǔn)化再算聯(lián)合距離需要收手的場(chǎng)面主要有兩類。一類是數(shù)據(jù)量本來就撐不起劃分。樣本二三十個(gè)硬切出 20% 做測(cè)試集測(cè)試集只有五六個(gè)樣本任何一個(gè)偏了誤差就翻倍。這時(shí)候與其糾結(jié) SPXY 還是 KS不如老老實(shí)實(shí)做留一交叉驗(yàn)證把每一個(gè)樣本都當(dāng)過一次驗(yàn)證樣本雖然計(jì)算量大一點(diǎn)但結(jié)論穩(wěn)得多。劃分方法的價(jià)值建立在“測(cè)試集樣本數(shù)夠多”這個(gè)前提上前提不成立方法再精巧也白搭。另一類是 Y 分布本身很均勻。這時(shí)候 SPXY 多算的那份 Y 距離幾乎不會(huì)改變選擇結(jié)果付出的計(jì)算成本換不來對(duì)應(yīng)的收益。樣本量上千的時(shí)候兩個(gè)距離矩陣的內(nèi)存占用也不是小數(shù)目。用 KS甚至用固定種子的隨機(jī)劃分效果一樣代碼還短。還有一個(gè)需要主動(dòng)放棄的場(chǎng)景如果數(shù)據(jù)里存在大量測(cè)量錯(cuò)誤、標(biāo)簽可疑的樣本SPXY 會(huì)把它們優(yōu)先挑出來塞進(jìn)訓(xùn)練集——因?yàn)樗暨x的依據(jù)就是“最遠(yuǎn)”而錯(cuò)誤樣本往往正好最遠(yuǎn)。這時(shí)候該先做的是數(shù)據(jù)清洗而不是換劃分方法。劃分解決的是“怎么分得公平”解決不了“數(shù)據(jù)本身靠不靠得住”。具體到一個(gè)例子某次做近紅外光譜的定量模型樣本 80 個(gè)參考值從低到高分三段中間一段樣本占了七成。第一次用隨機(jī)劃分測(cè)試集里一個(gè)高值樣本都沒有交叉驗(yàn)證的分?jǐn)?shù)漂亮但模型一上真實(shí)樣品就系統(tǒng)性偏低。換成 SPXY 之后訓(xùn)練集的 Y 覆蓋了全段測(cè)試集也落在合理范圍內(nèi)指標(biāo)從 0.98 掉到了 0.87——數(shù)字變難看了但這次的 0.87 是可信的。如果當(dāng)時(shí)只看那個(gè) 0.98 就交付后面踩的坑只會(huì)更深。從那以后我每次分完樣本集都會(huì)先把兩組樣本的 Y 分布畫出來并排比一眼確認(rèn)測(cè)試集不是一片空白才動(dòng)手建模。這個(gè)動(dòng)作花不了兩分鐘能擋掉大部分看起來很美的假成績。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取