測實(shí)戰(zhàn)復(fù)盤:從特征工程到XGBoost落地)
一提到“員工離職預(yù)測”很多人的第一反應(yīng)是“這不就是HR那邊的事嗎和數(shù)據(jù)工程師有什么關(guān)系”。但我做了幾個季度的離職預(yù)警項(xiàng)目之后感受完全不一樣這活兒看著是個人事問題本質(zhì)上是數(shù)據(jù)問題、成本問題、組織問題。企業(yè)為一次核心崗位離職付出的隱性成本往往相當(dāng)于該崗位年薪的30%到50%包括招聘費(fèi)用、培訓(xùn)成本、業(yè)務(wù)斷檔損失這些還只是能被HR系統(tǒng)記錄的部分。機(jī)器學(xué)習(xí)在這個場景下能做的事不是“預(yù)測誰要走然后去攔著”而是把那個看不見的離職概率顯性化給管理層一個提前干預(yù)的時間窗口。這篇就是我自己跑完整個離職預(yù)測項(xiàng)目的完整復(fù)盤從問題定義、數(shù)據(jù)清洗、特征工程、模型選型到落地評估每一步都寫清楚。適合正在做數(shù)據(jù)分析、機(jī)器學(xué)習(xí)項(xiàng)目的人參考也適合HR或者業(yè)務(wù)部門想搞懂這玩意兒到底是怎么工作的。內(nèi)容會比較實(shí)戰(zhàn)代碼不多重點(diǎn)是思路和踩坑那種“一看就會、一跑就崩”的細(xì)節(jié)我都會提到。1. 離職預(yù)測問題的本質(zhì)與項(xiàng)目目標(biāo)拆解先說清楚一件事離職預(yù)測不是算命。它不是要你給某個員工下一個“這個人三個月內(nèi)必走”的結(jié)論而是輸出一個風(fēng)險概率讓人力資源和業(yè)務(wù)負(fù)責(zé)人能夠在概率變高之前采取動作。這個概率要不要干預(yù)、怎么干預(yù)是管理層的事模型要解決的核心是兩件事第一把高風(fēng)險的員工找出來第二告訴你為什么這些人的風(fēng)險高。1.1 業(yè)務(wù)側(cè)的隱形痛點(diǎn)與成本邏輯為什么企業(yè)愿意花錢做離職預(yù)測我用一個簡單的算式來算一下。假設(shè)某公司一位月薪兩萬的核心技術(shù)崗離職實(shí)際招聘頂替需要三到六個月的搜索和面試周期其中獵頭費(fèi)用通常是年薪的20%到25%新員工入職后前三個月的工作效率只有老員工的50%左右團(tuán)隊(duì)配合成本甚至更高。把所有這些折算進(jìn)去一次離職造成的實(shí)際損失至少在五萬到十萬之間高級崗位更多。如果一個一千人規(guī)模的公司年離職率在15%左右那么一年光離職替換成本就可能達(dá)到百萬元級這是真實(shí)的利潤流失。所以做這個項(xiàng)目的根本目標(biāo)不是“炫技”而是把這一筆成本用數(shù)字化的方式管控住。機(jī)器學(xué)習(xí)在這里的價值不是代替HR做決定而是把過去靠管理者“感覺團(tuán)隊(duì)里誰不對勁”的經(jīng)驗(yàn)主義變成有數(shù)據(jù)支撐的預(yù)警體系。我見過很多HRBP其實(shí)能事前感知到風(fēng)險但問題是經(jīng)驗(yàn)容易被忽視尤其當(dāng)組織規(guī)模變大、人跟人之間的聯(lián)系變淡時。離職預(yù)測補(bǔ)的正是這個空檔。1.2 機(jī)器學(xué)習(xí)方案的切入角度這個項(xiàng)目是一個非常典型的監(jiān)督學(xué)習(xí)二分類問題給定員工在某個時間點(diǎn)的所有已知信息預(yù)測他在未來某段時間內(nèi)是否離職。輸出是0或1但大多數(shù)實(shí)戰(zhàn)項(xiàng)目不會只用一個裸模型就完事而是要回答一連串問題哪個時間點(diǎn)是合適的觀察窗口用哪些特征作為輸入模型效果好不好的判斷標(biāo)準(zhǔn)是什么業(yè)務(wù)方真的會拿這個結(jié)果去用嗎從我的實(shí)際經(jīng)驗(yàn)來看離職預(yù)測項(xiàng)目最難的從來不在于模型精度而在于你如何定義那個“離職”的標(biāo)簽。表面上看員工是否離職誰都知道但真正落地的時候你需要處理很多邊界情況。比如試用期內(nèi)離職算不算內(nèi)部轉(zhuǎn)崗之后又離職怎么算合同到期不續(xù)簽算不算這些定義直接決定了模型學(xué)出來的東西是什么如果你定義錯了標(biāo)簽后面調(diào)參調(diào)得再好也沒有意義。1.3 技術(shù)棧與工具選型理由這次項(xiàng)目我用的主力武器是Python生態(tài)主要依賴pandas做數(shù)據(jù)處理、scikit-learn做基線模型、XGBoost做主力模型最后用SHAP做特征解釋。選這套組合的原因很簡單離職預(yù)測數(shù)據(jù)量一般不會太大幾千條到幾萬條量級居多用不著直接上深度學(xué)習(xí)樹模型在這個量級上完全能把特征交互學(xué)得很好而且解釋性強(qiáng)。更重要的是團(tuán)隊(duì)里后續(xù)維護(hù)這套系統(tǒng)的人不一定是算法專家可能是數(shù)據(jù)分析師甚至HR系統(tǒng)的工程師因此模型越容易理解和解釋落地的阻力就越小。2. 數(shù)據(jù)集理解、清洗與標(biāo)簽構(gòu)造2.1 數(shù)據(jù)字段的常見構(gòu)成離職預(yù)測的公開數(shù)據(jù)集不在少數(shù)但企業(yè)內(nèi)部真實(shí)數(shù)據(jù)通常包含的信息更多。我這次用的數(shù)據(jù)基本結(jié)構(gòu)如下既有數(shù)值型特征比如年齡、月收入、在公司工作的年限、當(dāng)前崗位年限、總工作年限、距上次晉升的月數(shù)、培訓(xùn)次數(shù)、工作滿意度評分、績效評分也有類別型特征比如部門、崗位、婚姻狀況、教育水平、是否出差、是否加班、居住地到公司的距離。除此之外還有一個很容易被漏掉但非常重要的字段上一家公司的任職年限也就是員工跳槽的間隔周期。數(shù)據(jù)雖然看著規(guī)整但拿到手第一件事不是急著建模而是做數(shù)據(jù)體檢。我發(fā)現(xiàn)這份數(shù)據(jù)里有幾個典型的臟數(shù)據(jù)問題年齡字段里有幾個寫了99的明顯是數(shù)據(jù)錄入錯誤收入字段有負(fù)數(shù)還有部分員工績效評分為0但工作滿意度為滿分明顯矛盾。這些臟數(shù)據(jù)如果不處理樹模型還能勉強(qiáng)扛住但邏輯回歸會直接被拉偏。所以清洗環(huán)節(jié)花的時間一點(diǎn)也不比建模少。2.2 離職標(biāo)簽的切分邏輯標(biāo)簽構(gòu)造是整個項(xiàng)目里最需要思考的步驟。一般公開數(shù)據(jù)集已經(jīng)把“是否離職”這個標(biāo)簽給好了但企業(yè)內(nèi)部做預(yù)測時你拿到的往往是某個截止日期的快照數(shù)據(jù)未來哪些人走了需要自己回填標(biāo)簽。這時候有一個關(guān)鍵選擇預(yù)測窗口期。比如你在1月1日做快照使用員工截至當(dāng)天之前的信息預(yù)測他在1月1日到4月1日之間是否會離職。這個窗口期不固定會導(dǎo)致漏報窗口期太長則會導(dǎo)致預(yù)測結(jié)果“太遲”業(yè)務(wù)上沒法干預(yù)。我這次定的窗口是90天。原因有兩個第一離職從有想法到真正提離職大多數(shù)情況下在三到六個月的醞釀期90天足夠讓HR部門和業(yè)務(wù)主管介入溝通第二90天窗口對應(yīng)的標(biāo)簽正負(fù)樣本比例在數(shù)據(jù)里大約在15%到20%左右類型不算極端不平衡模型訓(xùn)練起來比較穩(wěn)定。窗口期太短比如30天離職人員數(shù)量會嚴(yán)重不足模型會學(xué)不到足夠模式窗口期太長比如一年離職的決策因素早就變了預(yù)測出來也沒什么指導(dǎo)意義。2.3 類別不平衡問題的務(wù)實(shí)處理說到正負(fù)樣本比例需要展開講一講。離職預(yù)測里正樣本離職永遠(yuǎn)是少數(shù)通常占比在10%到25%之間有的崗位甚至跌破5%。很多教程一上來就讓你用SMOTE過采樣或者欠采樣但我的經(jīng)驗(yàn)是先別急。如果你的正樣本占比有15%左右XGBoost不做過采樣也能得到不錯的效果因?yàn)闃淠P吞烊荒芴幚硪欢ǔ潭鹊牟黄胶?。?qiáng)行做SMOTE反而可能生成一些脫離真實(shí)邊界的樣本干擾模型學(xué)習(xí)。真正有效的處理手段是調(diào)整損失函數(shù)中的正樣本權(quán)重以及使用更合理的評估指標(biāo)。如果正樣本實(shí)在太少比如不到5%那時候再考慮過采樣并且用簡單的隨機(jī)過采樣就行SMOTE在這種數(shù)據(jù)量下收益有限。我在這個項(xiàng)目里用的策略是直接給XGBoost傳scale_pos_weight參數(shù)數(shù)值設(shè)為負(fù)樣本數(shù)除以正樣本數(shù)效果穩(wěn)且代碼簡單。3. 特征工程從原始字段到有效信號特征工程在離職預(yù)測項(xiàng)目里是價值產(chǎn)出最明顯的環(huán)節(jié)。原始數(shù)據(jù)給你的字段是有限的但當(dāng)你從業(yè)務(wù)邏輯去洞察就會發(fā)現(xiàn)很多字段之間存在著組合關(guān)系這些關(guān)系和離職意愿高度相關(guān)。3.1 業(yè)務(wù)導(dǎo)向的新特征構(gòu)造我構(gòu)造的第一個衍生特征是“收入增長潛力”用月收入除以當(dāng)前崗位工作年限。這個比值越低說明員工在同一崗位待得越久但收入增長越慢換句話說他獲得的回報和付出的時間不匹配這類員工的離職風(fēng)險往往更高。類似地我還構(gòu)造了“距離上次晉升年數(shù)”除以“本職位的年數(shù)”用來衡量晉升的停滯感。另一個很有效的新特征是從“總工作年限”里減去“當(dāng)前公司工作年限”這個差值代表員工加入本公司前在外部積累的經(jīng)驗(yàn)?zāi)晗蕖H绻@個數(shù)字比較大說明這位員工本身就是職場老手見過的機(jī)會多流動意愿通常更強(qiáng)。同理“上一家公司任職年限”和“總工作年限”的比值也可以做特征如果一個人曾經(jīng)多年供職于一家公司那么他天然傾向長期穩(wěn)定離職概率相對低反之跳槽頻繁的人未來的離職可能性也更高。構(gòu)造這些特征的時候有一點(diǎn)必須注意你只能使用預(yù)測時點(diǎn)之前的信息不能在特征里使用預(yù)測窗口期內(nèi)的數(shù)據(jù)。這個聽起來是個廢話但實(shí)際項(xiàng)目中極其容易踩坑。比如你想用“員工平均每月出差次數(shù)”作為特征但你拿到的統(tǒng)計(jì)數(shù)據(jù)實(shí)際上是年度平均里面包含預(yù)測窗口內(nèi)的月份這就成了數(shù)據(jù)泄漏。3.2 類別特征的編碼策略類別特征編碼這件事看起來簡單坑卻不少。離職預(yù)測數(shù)據(jù)里的部門、崗位這類字段類別非常多比如一個公司的崗位可能有幾十上百個如果直接用LabelEncoder編碼成0、1、2、3……樹模型會把這個編碼當(dāng)成有序數(shù)值去切分產(chǎn)生誤導(dǎo)性的分支。所以我的做法是分兩步對于部門這樣類別數(shù)量適中的字段用frequency encoding也就是把“每個部門的人數(shù)/總?cè)藬?shù)”這個比率作為特征它保留了該部門規(guī)模的全局信息對于崗位、婚姻狀況這類字段再用onehot編碼。這里要特別注意的是frequency encoding有個隱藏問題如果一個部門的離職率整體偏高該部門內(nèi)部不同崗位的風(fēng)險差異就被抹平了。因此在做frequency encoding之外我還額外保留了一個部門原始的onehot特征供模型自己去發(fā)現(xiàn)部門之間的風(fēng)險差異。同時為了避免過擬合低頻類別我做了合并統(tǒng)一歸入“其他”類這一步非常關(guān)鍵否則模型會對出現(xiàn)次數(shù)極少的類別學(xué)習(xí)到虛假規(guī)律。3.3 缺失值和異常值的處理細(xì)節(jié)缺失值處理看似簡單處理不當(dāng)會造成信息泄漏。比如工資和績效字段可能因?yàn)楦鞣N原因缺失直接刪除行太浪費(fèi)了。用均值填充是一種做法但這個做法會低估模型的不確定性正確做法是保留一個“是否缺失”的標(biāo)記列再用中位數(shù)填充數(shù)值。我測試過加入缺失標(biāo)記列后模型的AUC會提升一到兩個百分點(diǎn)因?yàn)槿笔П旧砜赡芫吞N(yùn)含信息。異常值這塊我做了保守處理。99歲的那個異常值我直接替換為總體年齡的95分位數(shù)月收入為負(fù)的情況我判定為錄入錯誤同樣做了截斷。有人喜歡用IQR規(guī)則刪除異常值這在離職預(yù)測里我不推薦樹模型本身對異常值不敏感但刪除異常值會損失業(yè)務(wù)信息收入極高或年齡極小的員工反而是模型需要學(xué)習(xí)的邊緣樣本。4. 模型構(gòu)建、參數(shù)調(diào)優(yōu)與驗(yàn)證評估4.1 基線與主力模型的選擇邏輯模型選型我的原則很簡單先跑基線再上主力?;€模型用邏輯回歸訓(xùn)練速度快輸出可解釋還能判斷特征與標(biāo)簽之間是否存在線性相關(guān)。跑完基線之后再用XGBoost做對比如果XGBoost相比邏輯回歸在評估指標(biāo)上的提升不超過5%我反而更傾向用邏輯回歸因?yàn)闃I(yè)務(wù)部署和維護(hù)成本低得多。實(shí)際跑下來XGBoost在AUC上比邏輯回歸高出大概8%個點(diǎn)左右說明特征之間存在明顯的非線性交互關(guān)系。這個結(jié)果也在預(yù)期之內(nèi)畢竟員工離職是多種因素共同作用的結(jié)果比如“收入低”和“晉升停滯”單獨(dú)看各有風(fēng)險但兩樣都占了的人風(fēng)險不是簡單相加而是急劇升高樹模型能夠捕捉到這種交互效應(yīng)。最終我選定了XGBoost作為上線模型但保留了邏輯回歸的結(jié)果作為交叉驗(yàn)證。4.2 數(shù)據(jù)劃分與交叉驗(yàn)證策略數(shù)據(jù)劃分必須按時間切不能直接隨機(jī)抽樣。因?yàn)殡x職預(yù)測天然是一個時效性很強(qiáng)的問題用過去的數(shù)據(jù)訓(xùn)練、預(yù)測未來時間錯位會帶來特征分布的變化。如果你隨機(jī)劃分模型在交叉驗(yàn)證里表現(xiàn)得很好但一到預(yù)測未來數(shù)據(jù)就容易翻車因?yàn)橛?xùn)練集里混入了“未來”的樣本信息。我采用的一種做法是按時間順序把數(shù)據(jù)切成三段最早70%做訓(xùn)練接下來15%做驗(yàn)證調(diào)參最近15%做最終測試。驗(yàn)證集和測試集留在模型迭代的最后一刻再使用否則容易在調(diào)參過程中向驗(yàn)證集泄露信息。同時由于離職預(yù)測的樣本量有限樹模型容易在訓(xùn)練集上過擬合我配合使用StratifiedKFold做五折交叉驗(yàn)證每一折的指標(biāo)取平均減少單次隨機(jī)波動的影響。4.3 評估指標(biāo)的側(cè)重點(diǎn)與分析離職預(yù)測的評估指標(biāo)一定要圍繞業(yè)務(wù)目標(biāo)設(shè)計(jì)不能只看準(zhǔn)確率。因?yàn)閿?shù)據(jù)集中85%的人不會離職一個無腦模型“預(yù)測所有人都不離職”就能拿到85%的準(zhǔn)確率但這對業(yè)務(wù)毫無價值。有效的評估要看三件事召回率、精確率和AUC。我最為看重的是召回率。因?yàn)殡x職預(yù)測的價值在于發(fā)現(xiàn)風(fēng)險如果漏掉一個高風(fēng)險員工實(shí)際損失遠(yuǎn)超一次誤報。但召回率也不能無盡升高否則模型會把三分之一的人都標(biāo)成高風(fēng)險HR部門根本處理不過來。所以我設(shè)了一個約束條件在保持精確率不低于30%的前提下盡量提高召回率這樣輸出的預(yù)警名單里有一定比例的虛驚但不會讓業(yè)務(wù)方失去信任。我自己在實(shí)際跑完調(diào)優(yōu)后的測試集表現(xiàn)是AUC約為0.88召回率在0.68左右精確率約為0.42。也就是說模型標(biāo)記出的高風(fēng)險名單里大約四成真的會離職而實(shí)際離職人群中有七成被提前識別出來了。這個指標(biāo)已經(jīng)具備明顯的實(shí)用價值因?yàn)槿绻鸋R能在90天前發(fā)現(xiàn)七成的離職風(fēng)險并采取干預(yù)成本節(jié)約的規(guī)模是肉眼可見的。4.4 關(guān)鍵超參的調(diào)優(yōu)路徑關(guān)于XGBoost的調(diào)參網(wǎng)上一搜一大把調(diào)參順序推薦但我個人更建議先固定一個合理的樹深度再逐步調(diào)其他參數(shù)不要一次全調(diào)。我這次的參數(shù)配置大概是這樣的max_depth6這個值在數(shù)據(jù)量幾千到幾萬時很穩(wěn)。太深容易過擬合太淺沒法捕捉交互效應(yīng)。learning_rate0.05偏低的學(xué)習(xí)率配合充足的訓(xùn)練輪數(shù)效果優(yōu)于高學(xué)習(xí)率。n_estimators500左右配合early_stopping_rounds讓它自己停止我設(shè)置的早停輪數(shù)是50。subsample0.8colsample_bytree0.8這兩個參數(shù)引入隨機(jī)性防止單棵樹過擬合。scale_pos_weight根據(jù)正負(fù)樣本比例計(jì)算代碼里動態(tài)算。另外gamma和reg_lambda這類正則參數(shù)我放在了最后調(diào)因?yàn)樗鼈冊跇淠P屠飳Y(jié)果的影響相對溫和沒有前幾個參數(shù)那么敏感。調(diào)參確實(shí)比較費(fèi)時間但其實(shí)用網(wǎng)格搜索跑個兩三輪就能鎖定范圍不需要追求極致精度業(yè)務(wù)上要的是穩(wěn)和可解釋。5. 核心代碼實(shí)現(xiàn)與Model解釋5.1 數(shù)據(jù)清洗與特征構(gòu)建代碼代碼部分我分享幾個關(guān)鍵片段。首先是數(shù)據(jù)清洗和衍生特征構(gòu)造的階段這一步?jīng)]做好后面什么都白搭。import pandas as pd import numpy as np # 讀取原始數(shù)據(jù) df pd.read_csv(hr_data.csv, encodingutf-8-sig) # 處理明顯異常值 df.loc[df[age] 80, age] df[age].median() df.loc[df[monthly_income] 0, monthly_income] 0 # 構(gòu)造衍生特征 df[income_growth_potential] df[monthly_income] / (df[years_at_company] 1) df[external_experience] df[total_working_years] - df[years_at_company] df[promotion_stagnation] df[years_at_company] / (df[years_since_last_promotion] 1) # 缺失標(biāo)記與填充 for col in [job_satisfaction, performance_score]: df[col _is_missing] df[col].isna().astype(int) df[col] df[col].fillna(df[col].median())上面這個promotion_stagnation特征是我后來在模型重要性分析中發(fā)現(xiàn)的高權(quán)重特征其實(shí)邏輯也很樸素一個人在公司待了很多年但很久沒晉升外部稍有機(jī)會就很容易動搖這類人的風(fēng)險很多時候靠肉眼就能感覺出來而特征工程把這個感覺數(shù)字化了。5.2 訓(xùn)練與驗(yàn)證代碼訓(xùn)練部分我用了比較穩(wěn)定的流程直接貼出來供參考from sklearn.model_selection import train_test_split from xgboost import XGBClassifier from sklearn.metrics import roc_auc_score, classification_report features [col for col in df.columns if col not in [attrition, employee_id]] X df[features] y df[attrition] # 按時間順序切分 train_idx int(len(df) * 0.7) val_idx int(len(df) * 0.85) X_train, y_train X.iloc[:train_idx], y.iloc[:train_idx] X_val, y_val X.iloc[train_idx:val_idx], y.iloc[train_idx:val_idx] X_test, y_test X.iloc[val_idx:], y.iloc[val_idx:] # 訓(xùn)練XGBoost model XGBClassifier( max_depth6, learning_rate0.05, n_estimators500, subsample0.8, colsample_bytree0.8, scale_pos_weight(y_train 0).sum() / (y_train 1).sum(), eval_metricauc, random_state42 ) model.fit( X_train, y_train, eval_set[(X_val, y_val)], early_stopping_rounds50, verboseFalse ) y_pred_prob model.predict_proba(X_test)[:, 1] print(Test AUC:, roc_auc_score(y_test, y_pred_prob))注意scikit-learn新版和XGBoost新版參數(shù)名略有差異按你本地版本對應(yīng)調(diào)整。訓(xùn)練過程中early_stopping_rounds用到驗(yàn)證集最終的測試集只在模型定稿后評估一次避免調(diào)參過程里對測試集產(chǎn)生隱性擬合。5.3 SHAP解釋模型不是黑盒模型上線前最容易被業(yè)務(wù)方挑戰(zhàn)的問題就是“你說他有離職風(fēng)險憑什么給我原因?!彼阅P徒忉尛h(huán)節(jié)我必須拿出來講這里用的是SHAP庫。import shap explainer shap.TreeExplainer(model) shap_values explainer.shap_values(X_test) # 輸出特征重要性排序 shap.summary_plot(shap_values, X_test, feature_namesfeatures)我跑完SHAP后發(fā)現(xiàn)對模型預(yù)測影響最大的前幾位特征分別是當(dāng)前公司工作年限、promotion_stagnation、月收入、age、加班情況。這和HR經(jīng)驗(yàn)高度一致但數(shù)據(jù)把這種經(jīng)驗(yàn)量化到了單個員工級別。比如在輸出報告里我可以明確說“該員工離職概率高主要貢獻(xiàn)因素是晉升停滯、月收入低于同級水平、頻繁加班”業(yè)務(wù)方拿到這種解釋才能真正信任模型。6. 常見問題與排查經(jīng)驗(yàn)實(shí)錄6.1 模型準(zhǔn)確率高但業(yè)務(wù)不買賬有個很典型的場景模型在測試集上的準(zhǔn)確率達(dá)到90%以上但業(yè)務(wù)方試用一段時間后反饋說“不給力”。原因幾乎都一樣業(yè)務(wù)方的關(guān)注點(diǎn)根本不在準(zhǔn)確率而在于“我該對誰采取行動”。準(zhǔn)確率被大量不會離職的員工拉高了真正需要關(guān)注的少數(shù)高危員工反而被淹沒。因此我后來做匯報的時候堅(jiān)持用“預(yù)警名單命中率”和“覆蓋了多少離職人員”來溝通少談那些聽著很厲害的模型指標(biāo)。6.2 特征泄漏問題我在做這個項(xiàng)目時差點(diǎn)引入特征泄漏的情況前面已經(jīng)提到過用一年平均出差次數(shù)做特征但這平均數(shù)里包含預(yù)測窗口內(nèi)的時間。這個問題很隱蔽因?yàn)閱慰磾?shù)據(jù)字段根本發(fā)現(xiàn)不了只有結(jié)合數(shù)據(jù)生成的時間邏輯才看得出來。排查特征泄漏的辦法是單變量分析如果某個特征的預(yù)測能力異常強(qiáng)大比如AUC直接到了0.97那大概率有問題。6.3 時間平移導(dǎo)致的效果衰減模型上線一段時間后效果不可避免會衰減因?yàn)槿藛T構(gòu)成、公司政策、市場環(huán)境都在變化。我的建議是建立月度重訓(xùn)機(jī)制每個月拿最新三個月的快照數(shù)據(jù)增量更新模型保持特征口徑一致。不要指望一次訓(xùn)練一勞永逸這在離職預(yù)測這種人事場景里完全不現(xiàn)實(shí)。6.4 數(shù)據(jù)量不足的應(yīng)對方案有些比較小的公司整體人數(shù)只有幾百人一年離職員工也就幾十個這種數(shù)據(jù)量要訓(xùn)練一個穩(wěn)定的模型確實(shí)勉強(qiáng)。如果遇到這種情況可以先退一步做“分層統(tǒng)計(jì)報表”不做個體預(yù)測而是通過決策樹或聚類找到離職率奇高的群體標(biāo)簽組合比如“某崗位且晉升停滯超過兩年”。這本質(zhì)上是一種可解釋的風(fēng)險畫像比強(qiáng)行訓(xùn)練不穩(wěn)定模型靠譜得多。7. 業(yè)務(wù)落地的擴(kuò)展建議模型之外我想強(qiáng)調(diào)一個觀點(diǎn)預(yù)測做出來只是開始真正能降低離職成本的是后面的干預(yù)動作。這個項(xiàng)目在業(yè)務(wù)側(cè)延伸出去可以做幾個配套機(jī)制高風(fēng)險員工訪談、薪酬復(fù)核窗口、晉升通道調(diào)整、工作內(nèi)容重新設(shè)計(jì)。模型的價值在于讓這些機(jī)制更高效地瞄準(zhǔn)對象而不是替代管理者的判斷。還有一塊比較有價值的方向是離職原因閉環(huán)分析。預(yù)測模型判斷出風(fēng)險高但員工最終還是沒走的以及預(yù)測風(fēng)險低卻突然離職的這兩類樣本都值得細(xì)致復(fù)盤因?yàn)樗鼈兪悄P秃蜆I(yè)務(wù)認(rèn)知的盲區(qū)。把這些反例補(bǔ)充進(jìn)訓(xùn)練數(shù)據(jù)下一輪迭代的模型會變得更聰明。我在實(shí)際運(yùn)營中發(fā)現(xiàn)最穩(wěn)定的并不是某一個單一模型而是預(yù)測、預(yù)警、干預(yù)、復(fù)盤這套循環(huán)。起初大家覺得這套機(jī)制復(fù)雜真正跑了幾個季度以后HR從“靠感覺”變成“靠數(shù)據(jù)去尋找那個人”業(yè)務(wù)負(fù)責(zé)人也能更早對齊關(guān)鍵人才的保留方案這才是離職預(yù)測項(xiàng)目真正潛移默化的成果。最后分享一個小經(jīng)驗(yàn)做這類預(yù)測項(xiàng)目別急著追求技巧多高級先和業(yè)務(wù)方把“預(yù)測出來之后到底做點(diǎn)什么”談清楚。沒有干預(yù)預(yù)案的預(yù)測需求可能是偽需求再漂亮的模型也落不了地。這件事想清楚后面所有技術(shù)動作都有了方向。