「不是說大數據沒問題嗎?這就是你的沒問題?!」
總部高層的咆哮聲震得會議室玻璃嗡嗡作響,手裡整疊各店損益表被狠狠摔在桌面上。散落一地的報表紙上,紅字標註的單店日均營業額(PSD)格外刺眼——這家當初被演算法精算預測會大賣的新設門市,單店業績在全區直接墊底。
當初專案立項時,大數據選址模型跑出來的預估指標堪稱完美。翻開系統手頭上的特徵變數(X),圈內在意的指標無懈可擊:
商圈條件極佳:位於精華成熟商圈的三角窗核心,集客力十足;
人流量完全充足:白天的上下班尖峰時段,門前路過人潮與車流完全達標;
門市規格頂配:店面面寬與坪數都是旗艦標準,陳列貨架、鮮食溫控冷藏設備全用最高規格;
後勤配套到位:物流配送頻率、促銷檔期與全台總部行銷活動完全同步,甚至特地調派了全體系內最有實戰經驗的王牌店長親自坐鎮。
在總部的預測模型裡,這家店的日均額絕對會輕鬆突破目標線。
結果新店熱熱鬧鬧剪綵開幕後,結算出來的數字卻慘澹到令人難以置信——單店業績連損益平衡點(BEP)的門檻都摸不到,全日營收直接在全區吊車尾。
總部高層百思不得其解:商圈評估對了、人潮看了、店格設備給了、王牌店長也壓陣了,大數據算出來的黃金店面,營業額為什麼就是起不來?
但只要把 POS 機的營收報表按每小時拆開來看,就會發現一個極其詭異的現象:白天這家店的業績其實差強人意,但一到入夜之後,營業額直接出現斷崖式暴跌!
過去總部幾次場勘全都挑在艷陽高照的白天,自然覺得一片歲月靜好。直到總部指派督導親自在晚上跑一趟現場,謎底在五秒鐘內徹底揭曉——
一到了晚上,這家新店正門兩側的騎樓與排風口下,剛好就是附近幾位流浪漢習慣聚集躺臥的過夜據點,身上散發出刺鼻難聞的惡臭。
只要夜幕降臨路過這家店,迎面撲來的就是一股難以忍受的異味;不管你白天人流再大、地段再精華,晚上下班回家的行人全都捏著鼻子繞道而行,誰敢、又有誰願意在晚上走進去買一杯咖啡或一顆茶葉蛋?
但這個在入夜後宣判門市死刑的致命變數——「夜間門口有散發異味的流浪漢聚集」——自始至終完全沒有記錄在總部的任何資料庫裡!
工程師坐在冷氣房裡翻遍 SQL 表格,資料庫裡只看得到冷冰冰的「全日平均人流量」、「坪數」與「幹部資歷」;沒有人走進夜間的現場,就永遠不可能知道這項關鍵特徵的存在。
這就是最血淋淋的「巧婦難為無米之炊」。
企業花了上千萬買 GPU 伺服器、請來頂尖的資料科學家,陣仗擺得像米其林三星主廚盛大進場;結果主廚繫好圍裙、磨亮菜刀走進後廚,打開米缸一看,裡面只有一瓶自來水。長官還在門口發飆催餐:「設備都買最好的,你怎麼連一碗飯都煮不出來?」
演算法不是神仙,它不會憑空無中生有。少了那個真正決定生死與物理因果的關鍵特徵(X),就算你動用了全世界最頂級的算力與模型,端出來的東西,也絕對不會是一鍋能喝的好粥!
這 30 億學費裡最冤枉的一筆,往往就是這樣燒掉的——冷氣房裡幾百萬的軟硬體與演算法全買到位了,系統一上線卻因為缺了現場最關鍵的一粒米,直接在營運現場摔得粉身碎骨。
如果說超商大數據的悲劇是「米缸裡空無一物」;那麼在專案現場另一種更隱蔽的災難,則是資料庫看似塞滿了米,但你舀起來仔細一看,全都是有毒的「作弊米」!
拿預測身高來說,「體重能預測身高」那是生物統計學;但如果有人跟你說:「給我你護照上的資料,我就能鐵口直斷預測出你的身高——準確度 99.9%。」
在台灣工程師聽來,這話簡直像是夜市擺攤算命;但如果是泰國人聽到了,只會冷冷吐槽一句:「這不是廢話嗎?」
因為泰國護照的個人資料頁上,白紙黑字就印著持照人的「身高(Height)」。
這根本不是演算法突破,我只是「把答案抄出來」而已。在機器學習裡這叫標籤洩漏(Target Leakage)。你可能會笑說誰會蠢到把「身高」當特徵?但在產線現場,這種標籤洩漏往往換了個英文代碼或縮寫——例如把反映最終檢驗結果的判定碼、或產品規格編號(Grade)混進去當特徵——大家就認不出來了。當工程師不求甚解,把本來就是答案的變數當成神奇特徵,根本是把抄答案當成了科技奇蹟。
更多時候,我們是在自以為聰明地「瞎子摸象」:
很多工程師做資料清洗,看到身高小於 160 公分或大於 190 公分,兩眼一瞪就認定是「極端離群值」一刀切除;但如果資料庫多給一個特徵變數——「性別:台灣女性」,160 公分根本高於平均線,完全是常態!
但若系統再塞進一個特徵——「體重:40 公斤」?你的大腦演算法又會瞬間重新計算:一個 40 公斤的成年女性,你大概率不會猜她是 175 公分的高挑身材。
同樣的,把「年齡」無腦當連續變數灌進線性模型也是一場災難。生活常識告訴我們,年齡與身高的關係根本不是一條直線:學齡前後是快速抽高的發育期;成年後是動也不動的水平線;到了高齡退化期,隨著脊椎壓迫甚至會出現殘酷的「倒長(縮水)」。
每多拿到一項關鍵資訊、理清非線性機理,你所能推論的邊界就是完全不同的世界。
除了缺乏上下文與標籤洩漏,特徵變數還有另一個最陰險的陷阱——時序(Time Series)的錯置。
打開 Excel 或資料庫,單看表格結構往往極度順眼:一筆資料整整齊齊排在同一個列(Row)上,左邊擺著 x1, x2, x3,最右邊對應著目標 Y。隨便拉個模型灌進去,損失函數降得飛快,驗證集準確率動輒 99%,團隊上下興奮得像挖到金礦。
但在真實世界裡,這張看似和諧的二維表格,根本是抹殺了物理時間先後順序的「時空騙局」!
資料工程在做資料表關聯時,往往沒有嚴格依照事件發生的真實時間戳(Point-in-time Join)去做向後截斷:
你的預測目標是 Y,但那個在重要度名列前茅的神奇特徵 x3,在工廠產線上的真實發生時間點,居然是在 Y 產出「之後」!
拿一個在 Y 發生之後才記錄到的滯後指標去預測過去,本質上就是拿「印有解答的考古題去考試,結果考了滿分」。模型只是把答案背下來,根本沒學到因果邏輯。一旦推到即時產線上,因為未來的 x3 根本還沒發生,模型當場就會像失去小抄的學生一樣徹底崩盤。
所以,下次如果你的資料科學夥伴拿著欄位清單反覆折磨你,極度囉嗦地追問:「這個數值到底是幾點幾分記錄的?」「採樣點是在反應槽前還是出口之後?」「現場到底先調了閥門還是先有這個訊號?」
請千萬耐心對待他! 他不是故意找麻煩,他是在做最關鍵的生死排查——確認這套系統到底有沒有在神不知鬼不覺中偷看答案!
在搞定特徵定義與時序後,現場還有一個極其普遍的災難——把「多個世界」硬融成一個平均值。
舉個生活化的例子:
某所高中的學生食堂為了避免廚餘浪費,調出歷史紀錄算出全校學生的「平均飯量是 1.5 碗」,隔天起嚴格規定每位打飯的同學盛上整整 1.5 碗白飯。結果不到三天全校民怨四起:發育期、運動量大的男同學餓得頭昏眼花,大罵 1.5 碗根本吃不飽;而胃口小的女同學看著滿滿一碗半直發愁,硬吃吃不下、倒掉又被罵。
真實世界根本不是均勻的常態分佈,而是涇渭分明的「雙峰分佈(Bimodal Distribution)」!如果不把「性別與運動量」當作關鍵特徵,中間那個精準算出來的「平均 1.5 碗」,現實中根本沒有任何活人需要。
把場景拉回工廠產線,這種事天天上演。
現場的實際運轉工況,往往粗暴且清楚地分成「高產量模式」與「低產量模式」。在第一線,現場老鳥只要低頭瞄一眼入料流量計、或是馬達運轉的電流負載(Ampere),用膝蓋想也知道現在機台正開足馬力衝產量,還是為了換料在低負載慢拖。
但偏偏有些資料分析師,把一整年混雜著高產與低產的數據倒進大黑盒。在沒有在特徵層面納入工況狀態變數的前提下,硬要用簡單連續模型去訓練出一個通吃全場的「大一統模型」。
模型跑出來的結果,就像那個 1.5 碗飯一樣荒謬:在高負載時跟不上劇烈反應,在低負載時又反應過度,兩頭不討好。
抓出雙峰背後的物理原因後,實務上有兩種解法:
分別建模(Divide and Conquer):用電流負載當作閘道條件(Gate Condition),高產時跑專為高產調校的模型 A,低產時切換成模型 B。一條簡單的規則切分(Rule-based Gate),往往比硬跑大一統模型管用得多!
確定模型的一般度足以覆蓋與外推(Generalization & Extrapolation):若非得用單一模型,就必須在特徵層面提供足夠的工況狀態變數,並嚴格確認模型在跨越兩座山峰的過渡帶具備足夠的外推能力,而不是在跨峰的縫隙裡胡亂擺盪。
說句心底的大實話:站在第一線使用者的角度,只要控制結果夠好、介面設計夠簡單直覺,根本沒人在乎你後台到底是一個模型還是多個模型!
現場盤控人員打開螢幕,他只要系統給出的控制建議穩健、好用、不跳車。
但如果你今天是設計演算法的人,知道這兩者的差異、並把後續的「維護成本」算清楚,對未來的長期維運將有著天壤之別的助益。
搞清楚 X 的分佈與工況切分,實質上就是在「確認未來模型上線時的使用邊界」:
如果未來的 X 超出了你所看過的歷史資料(Out of Distribution)?
身為一個負責任的系統設計者,你可以選擇「不輸出」,或者在介面上「加點警示提示」告知盤控人員當前工況已超出經驗邊界;
如果是已經納入自動控制的閉環系統?
最自然也最安全的做法,是讓系統平滑降級為保守控制模式、維持現狀輸出(Hold),或跳出邊界警示交給盤控人員介入複判,而不是任由黑盒子在未知的工況海域裡瞎猜亂撞!
記住:在工業現場,絕對、絕對不能把黑盒子硬算出來的盲目預測,直接未經檢驗就輸出給現場去執行控制!
從超商夜間選址漏掉門口流浪漢、泰國護照與時序錯置的抄答案、身高體重年齡的非線性,再到高低產量工況造成的雙峰民怨——我們最終會看清一個極度骨感的現實:
身為在第一線扛起長期維運責任的工程師,我們必須時刻保持清醒:機器學習的本質是 Y = f(X)。Y 是你前進的靶心,而 X 才是推動演算法運轉的實體燃料。
很多專案之所以在十四天摸底期就注定走向往生,往往不是因為演算法不夠前瞻,而是盤點到最後,大家驚恐地發現:現場根本拿不出能支撐因果推論的關鍵特徵變數。
該記錄的反應動態全留在空氣中的電話裡
該即時反映的訊號全是滯後抄答案的假象
連工況切換的電流與流量計都未曾建檔
沒有 X,任何 AI 應用都只是無源之水、無本之木。
明白這層道理,你就能在專案初期少走極大的冤枉路——當關鍵特徵根本不存在、且短期內現場無法加裝硬體補齊時,最專業的決策不是硬著頭皮把雜訊倒進黑盒子裡交差,而是乾脆俐落地舉手喊停。因為米缸裡沒有米,巧婦再神,也變不出能吃的飯;少了最核心的那一味,再華麗的大數據,也煮不出能入口的好粥!
好,現在我們手中有了端正的靶心 Y,也翻遍了具備物理意義、時序邏輯與邊界意識的特徵變數 X——米有了,鍋也架好了,按理說,這道題終於能送進演算法交給電腦了。
但這時候,專案現場往往會迎來另一場毀滅性的集體狂歡:
「既然數據都有了,那我們何必費力去理什麼特徵工程?直接把幾百層深度神經網路(Neural Network)丟下去,讓它自己去學不就好了嗎?」
很多人被電腦視覺(CV)的奇蹟沖昏了頭:在圖像資料裡,像素與像素之間存在天然的空間局部關聯,卷積神經網路(CNN)確實能驚艷地自己學出邊緣、紋理甚至整張臉。
但在工業與企業真實世界裡,我們每天面對的不是貓貓狗狗的照片,而是充滿離散、連續、時滯與強物理因果的「表格與網格資料(Tabular Data)」!
表格資料從來不是神經網路的天下。妄想靠多疊幾層黑盒子就省去對物理因果的理解,最後迎來的只會是算力燒乾、預測崩盤的慘烈災難。演算法的選型至關重要,但神經網路絕不是治百病的萬靈丹。
下一篇,我們來為盲信算力的自嗨舉行一場告別式:
《第十四章|特徵工程的葬禮:當神經網路 f() 被當作萬靈丹》。