《AI時代:碼農的涅盤重生》第72章 機器學習優化(1)

作者:Flint8·1小時前

凌晨兩點,寶安某老舊小區狹窄的書房裡,螢幕的冷光映照著林晨專注的臉。

他盯著剛剛執行完畢的程式輸出,眉頭微皺。系統自動下載美股資料時果然遇到了問題——雅虎財經 API 返回的某些歷史資料格式不一致,導致 pandas 在解析時丟擲了型別錯誤。

“邊界條件……”林晨低聲自語,手指在鍵盤上敲擊。

他花了半小時修改資料預處理模組,增加了更魯棒的型別轉換和異常值處理。修復完成後,系統順利載入了過去五年標普 500 指數成分股的日線資料,總計超過六十萬條記錄。

但真正讓他陷入思考的,是另一個問題。

過去一週的實盤執行加上新整合的傳統技術指標,現在他的決策系統裡已經有三十七個特徵維度。從移動平均線到波動率指標,從成交量變化到市場情緒代理變數,系統在每次預測前都要處理這些海量資料。

“太多了”。林晨靠在椅背上,揉了揉發酸的眼睛。

他想起以前做跨境電商系統時的一個教訓:當時為了追求功能全面,他們在訂單處理模組里加入了十幾個校驗規則和異常處理流程。結果系統變得臃腫不堪,每次新需求都要考慮與舊邏輯的相容性,最終不得不重構。

程式碼可以騙人,但邏輯不會。

林晨點開 Jupyter Notebook,新建了一個檔案。他決定用 XGBoost 來做一次徹底的特徵重要性分析——這是他在學習機器學習課程時掌握的工具,一種基於梯度提升樹的演算法,能直觀地展示每個特徵對模型預測的貢獻程度。

“先看看哪些特徵在真正起作用”。

他匯入資料,開始編寫程式碼。首先將三十七個特徵標準化處理,然後劃分訓練集和測試集。XGBoost 模型的引數需要仔細調優:學習率不能太高,否則容易過擬合,樹的最大深度要控制,子取樣比例要設定……

窗外遠處的城中村漸漸安靜下來,只有遠處偶爾傳來貨車的轟鳴聲。林晨完全沉浸在程式碼的世界裡,一行行指令在螢幕上流淌。

三小時後,模型訓練完成。

林晨執行特徵重要性分析函式,螢幕上生成了一張橫向條形圖。三十七個特徵按照重要性得分從高到低排列,結果讓他有些意外。

排名前五的特徵分別是:20 日波動率、相對強弱指標(RSI)的 14 日均值、布林頻寬度、成交量的 5 日變化率、以及 CD 柱狀圖的趨勢。

這些都在預料之中。

但往下看,從第十名開始,特徵的重要性得分斷崖式下跌。第二十名之後的那些特徵——比如某些特定週期的移動平均線交叉訊號、成交量加權價格的一些衍生指標——重要性得分幾乎為零。

“也就是說,系統裡超過一半的特徵,對預測的貢獻微乎其微”?林晨喃喃道。

他重新運行了幾次分析,每次隨機劃分不同的訓練測試集,結果都高度一致。那些他花了不少時間從金融文獻裡找來的“經典指標”,在機器學習模型眼裡,大部分都是噪聲。

林晨沒有馬上刪除這些低重要性特徵,而是做了另一個實驗:他用重要性排名前十五的特徵重新訓練了一個模型,然後用完整的測試集進行評估。

結果讓他愣住了。

精簡後的模型,在測試集上的準確率不僅沒有下降,反而從原來的 61.3% 提升到了 63.8%。更重要的是,模型的泛化誤差顯著降低——在模擬 2022 年熊市資料的壓力測試中,新模型的回撤控制得更好。

“少即是多……”林晨盯著螢幕上的數字,忽然笑了。

這是一種奇妙的頓悟時刻。在過去十年的程式設計師生涯裡,他習慣了“功能越多越好”的思維模式。做電商系統時要支援幾十種促銷規則,做後臺管理時要覆蓋所有可能的查詢條件。複雜度在不知不覺中累積,直到系統變得難以維護。

而現在,機器學習模型用冰冷的資料告訴他:很多時候,精簡才是高效。

林晨站起身,走到窗邊做了幾個伸展動作。凌晨四點的鵬城,天空是深藍色,幾顆星星在雲隙間隱約可見。樓下早餐鋪的燈光已經亮起,蒸籠冒著白氣——這座城市永遠有人比你以為的更早開始新的一天。

猜你喜歡

同題材或同分類的其他作品。