測中的實戰(zhàn)應(yīng)用與規(guī)則落地)
1. 先摸清業(yè)務(wù)流失預(yù)測到底在解決什么問題接手電信客戶流失預(yù)測這類項目很多人第一反應(yīng)就是找數(shù)據(jù)集、跑模型、調(diào)參出準(zhǔn)確率。我之前做過一個運營商側(cè)的流失預(yù)警項目踩過不少坑之后發(fā)現(xiàn)第一步根本不是建模而是把“流失”這件事從業(yè)務(wù)上定義清楚。在客戶關(guān)系管理里流失預(yù)測本質(zhì)上是一個二分類問題給定一個用戶在某個時間窗口內(nèi)的行為數(shù)據(jù)預(yù)測他在下一個時間窗口內(nèi)是否會離開。電信行業(yè)的流失有兩個典型特征一是流失成本極高運營商獲取一個新客戶的成本通常是維系老客戶的5到8倍二是客戶一旦離網(wǎng)再拉回來的難度非常大。所以業(yè)務(wù)方真正關(guān)心的是能不能在客戶還沒走之前提前識別出高流失風(fēng)險群體用有限的營銷資源去重點挽留。這個項目選擇決策樹作為核心模型不是因為它最“潮”而是因為電信場景里可解釋性往往比準(zhǔn)確率更值錢。運營人員需要知道“為什么這個客戶會流失”需要能向管理層解釋“模型靠什么判斷”決策樹天然滿足這個需求。它輸出的是if-then規(guī)則比如“月消費超過200元但流量使用率低于60%的客戶流失概率是平均值的2.3倍”這種話術(shù)業(yè)務(wù)方能直接聽懂、直接落地。項目的整體目標(biāo)可以拆成三層第一層搭建一套可復(fù)用的流失預(yù)測流程從數(shù)據(jù)清洗到模型評估完整跑通。第二層用決策樹模型輸出高流失風(fēng)險客戶名單并提供規(guī)則解釋。第三層結(jié)合營銷資源給出分層挽留策略的建議而不只是給一個“流失概率”的數(shù)字。評估口徑也要提前對齊。運營商內(nèi)部通常用“次月離網(wǎng)率”作為業(yè)務(wù)口徑也就是當(dāng)月還在網(wǎng)、次月辦理銷戶或轉(zhuǎn)網(wǎng)的用戶占比。模型層面則用精確率、召回率、F1值和AUC這幾個指標(biāo)綜合判斷其中召回率在這個場景里優(yōu)先級最高。原因很簡單漏掉一個真正會流失的客戶代價是徹底失去這個客戶而誤判一個不會流失的客戶最多只是多花一條營銷短信的錢。搞清楚這些問題之后才開始碰數(shù)據(jù)。下面把整個項目的實操過程拆開來講包括數(shù)據(jù)怎么處理、模型怎么調(diào)、結(jié)果怎么落地以及中間踩過的幾個典型坑。2. 數(shù)據(jù)準(zhǔn)備與特征工程建模前最花時間的環(huán)節(jié)2.1 原始數(shù)據(jù)長什么樣哪些字段真正有用電信數(shù)據(jù)集里常見的字段一般分四類。第一類是用戶靜態(tài)屬性比如入網(wǎng)時長、年齡、性別、所在地區(qū)、套餐類型第二類是消費行為數(shù)據(jù)比如月消費金額、充值金額、欠費次數(shù)、流量使用量、通話時長第三類是服務(wù)交互數(shù)據(jù)比如撥打客服電話次數(shù)、投訴次數(shù)、維修工單數(shù)量第四類是套餐使用情況比如套餐飽和度、流量超出量、語音超出量。這四類數(shù)據(jù)里權(quán)重最高的往往是入網(wǎng)時長、消費金額波動、投訴次數(shù)和流量飽和度而不是年齡、性別這類人口統(tǒng)計字段。從業(yè)務(wù)邏輯上理解也很通順一個用了8年的老用戶離網(wǎng)成本高忠誠度天然比半年內(nèi)新入網(wǎng)的用戶高一個月消費從200突然掉到80的用戶往往已經(jīng)在“試探性離網(wǎng)”投訴次數(shù)多的用戶說明他對服務(wù)不滿意但同時也說明他還在意這個號碼、還愿意反饋問題這類用戶反而是挽留成功率最高的。原始數(shù)據(jù)里常見的問題是臟數(shù)據(jù)和缺失值。比如“充值金額”字段存在大量0值要區(qū)分是“用戶確實沒充值”還是“數(shù)據(jù)沒采集到”“入網(wǎng)時長”有的記錄是按天、有的是按月需要統(tǒng)一口徑“投訴內(nèi)容”是文本初期建模一般不直接用文本而是先轉(zhuǎn)換成“投訴次數(shù)”“投訴類型數(shù)”這類數(shù)值特征。2.2 特征工程的幾個關(guān)鍵處理思路特征工程在整個項目里花的精力最多也最影響最終效果。我一般按下面幾條線處理第一缺失值處理。數(shù)值型字段用中位數(shù)填充類別型字段用眾數(shù)填充。有業(yè)務(wù)含義的字段要謹(jǐn)慎比如“停機次數(shù)”如果缺失很可能意味著該用戶從未停機直接填0比填中位數(shù)更合理。第二類別特征編碼。套餐類型、地區(qū)這類字段決策樹模型用標(biāo)簽編碼就夠了。不建議對高基數(shù)類別做獨熱編碼比如地區(qū)有15個取值獨熱編碼會生成15個稀疏列樹模型的分裂效率反而下降還容易把模型帶偏。第三連續(xù)變量分箱。決策樹本身會自動尋找切分點但把“消費金額”這種連續(xù)變量原始值直接喂進(jìn)去模型容易偏向數(shù)值較大的特征導(dǎo)致過擬合。實操中我會對明顯偏態(tài)的變量先做分箱比如將月消費金額按業(yè)務(wù)經(jīng)驗劃分為低段、中段、高段、超高段分箱后模型更穩(wěn)定解釋性也更好。第四構(gòu)造衍生特征。這是拉開模型效果差距的地方。我常用的衍生特征有幾個消費金額環(huán)比變化率計算公式是當(dāng)月消費減去前三個月均值再除以前三個月均值套餐飽和度用實際使用量除以套餐包含量投訴響應(yīng)及時性判斷投訴后是否在限定時間內(nèi)得到處理。這些特征反映的是“變化趨勢”和“體驗結(jié)果”對流失行為的預(yù)測能力非常強。2.3 樣本不平衡問題流失客戶太少怎么辦電信數(shù)據(jù)里有一個很現(xiàn)實的問題流失用戶占比通常只有5%到10%剩下90%以上都是未流失用戶。如果直接建模模型會學(xué)到“只要把所有人都預(yù)測為不流失準(zhǔn)確率就有90%以上”但這毫無業(yè)務(wù)價值。處理樣本不平衡我建議不要一上來就做SMOTE先分清楚場景。樹模型對類別不平衡不那么敏感真正問題在于評估時如果用準(zhǔn)確率會被嚴(yán)重誤導(dǎo)。我在這個項目里的做法是保留原始不平衡分布來訓(xùn)練但在評估時用召回率、精確率、F1值而不是準(zhǔn)確率。同時在預(yù)測輸出階段調(diào)整分類閾值不默認(rèn)用0.5而是用驗證集上的P-R曲線去找合適的閾值讓召回率與精確率達(dá)到業(yè)務(wù)想要的平衡點。如果數(shù)據(jù)量足夠大也可以通過欠采樣讓正負(fù)樣本比例達(dá)到1:3或1:5。但要注意欠采樣會丟棄大量信息樹模型的深度和葉節(jié)點樣本數(shù)都要相應(yīng)調(diào)小否則容易過擬合到少數(shù)樣本上。2.4 特征選擇的經(jīng)驗判斷決策樹自帶特征重要性排序但特征重要性存在偏差數(shù)值型特征和多取值特征容易被高估。所以我通常先用一個粗略的樹模型看重要性排序再結(jié)合業(yè)務(wù)經(jīng)驗核對一遍。如果某個特征重要性很高但業(yè)務(wù)上解釋不通就要懷疑是數(shù)據(jù)泄漏。比如“是否已辦理銷戶預(yù)約”“當(dāng)月是否停機超過30天”這類特征本質(zhì)上已經(jīng)是流失結(jié)果了絕不能放進(jìn)訓(xùn)練特征里。這一點我在剛做項目時踩過坑后來每次都會專門排查這類“未來信息”。3. 決策樹建模的實現(xiàn)過程從原理到調(diào)參3.1 決策樹的切分邏輯用生活類比講清楚決策樹算法本身不復(fù)雜核心思想就是“不斷提問把數(shù)據(jù)分開”。比如判斷一個用戶會不會流失第一個問題可以是“入網(wǎng)時長大于等于12個月嗎”如果是走左分支如果不是走右分支。然后每個分支再問下一個問題直到最終葉節(jié)點里大部分樣本屬于同一個類別。關(guān)鍵是“每次提問該問什么”。這個問題由純度的指標(biāo)來決定。分類決策樹常見的兩個指標(biāo)是信息增益和基尼系數(shù)。信息增益的計算基于熵熵越大表示數(shù)據(jù)越混亂。基尼系數(shù)則直接度量“從集合中隨機抽兩個樣本類別不一致的概率”。實際工程里CART樹的默認(rèn)指標(biāo)就是基尼系數(shù)計算更快、效果也不差。sklearn里的DecisionTreeClassifier默認(rèn)就是criteriongini一般不需要改。每次選擇切分點的時候算法會遍歷每個特征的每個取值計算分裂前后的基尼系數(shù)變化量選擇下降最大的那個特征和閾值作為本次分裂。這個過程會一直遞歸下去直到觸發(fā)停止條件。3.2 關(guān)鍵參數(shù)詳解別再盲目用默認(rèn)值決策樹最容易出的問題就是過擬合。默認(rèn)參數(shù)下節(jié)點可以一直分裂到每個葉子只剩一個樣本模型會把訓(xùn)練集全部記住但一遇到新數(shù)據(jù)就“失靈”。我用的參數(shù)設(shè)置一般是這樣max_depth最大深度控制在5到8之間。深度太淺欠擬合深度太深過擬合。電信數(shù)據(jù)維度一般不算高深度8基本足夠。min_samples_split內(nèi)部節(jié)點再分裂所需最小樣本數(shù)設(shè)為總樣本量的0.1%到1%。樣本量是5萬時這個值可以設(shè)50到500。min_samples_leaf葉節(jié)點最小樣本數(shù)這個參數(shù)比min_samples_split更重要建議設(shè)為總樣本的0.05%到0.2%。它直接保證每個葉節(jié)點有足夠樣本支撐防止學(xué)到噪聲。max_features每次分裂考慮的特征數(shù)默認(rèn)是全部但當(dāng)特征數(shù)超過30時可以設(shè)為sqrt(n_features)增加隨機性、降低過擬合。ccp_alpha成本復(fù)雜度剪枝參數(shù)這個參數(shù)用來做后剪枝比單純限制樹的生長更精細(xì)。先跑一個小的alpha序列畫出驗證集評分隨alpha變化的曲線選評分開始下降點對應(yīng)的alpha值。調(diào)參的時候我建議分兩步走第一步先固定max_depth和min_samples_leaf用網(wǎng)格搜索找組合第二步再對ccp_alpha做一輪細(xì)調(diào)。不要五六個參數(shù)一起搜計算成本高、還容易過擬合驗證集。3.3 訓(xùn)練集與驗證集的劃分細(xì)節(jié)數(shù)據(jù)集劃分這個環(huán)節(jié)看起來簡單但有幾個細(xì)節(jié)直接關(guān)系到模型能不能真實反映效果。第一要按時間切分而不是隨機切分。流失預(yù)測的數(shù)據(jù)天然有先后順序用前幾個月做訓(xùn)練、最后一個月做驗證最貼近真實業(yè)務(wù)節(jié)奏。如果隨機切分會造成“用未來預(yù)測過去”的泄漏。第二切分時要用分層抽樣保持訓(xùn)練集和驗證集里流失用戶的比例基本一致。第三調(diào)參要基于驗證集不要反復(fù)在測試集上試否則測試集信息會泄漏進(jìn)超參數(shù)選擇。最后可以留20%的數(shù)據(jù)作為最終的測試集只在全部流程定下來之后跑一次。3.4 一個典型建模過程的簡化代碼示例下面給出一個簡化但完整的決策樹建模代碼示例基于常見工具庫sklearn實現(xiàn)。import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score # 加載特征數(shù)據(jù)假設(shè)已經(jīng)過特征工程 data pd.read_csv(telecom_user_features.csv) X data.drop(columns[user_id, churn_label]) y data[churn_label] # 按時間切分前80%訓(xùn)練后20%驗證 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, stratifyy, random_state42 ) # 初始化決策樹參數(shù)先給一組經(jīng)驗值 model DecisionTreeClassifier( max_depth6, min_samples_split200, min_samples_leaf100, criteriongini, random_state42 ) model.fit(X_train, y_train) # 預(yù)測概率注意用的是predict_proba不是predict y_proba model.predict_proba(X_test)[:, 1] # 評估 print(roc_auc_score(y_test, y_proba))注意我在評估時用的是預(yù)測概率而不是預(yù)測類別。決策樹輸出的概率本身就是“葉子節(jié)點中正類樣本占比”這個值可以直接用來排序名單。預(yù)測類別只是把概率和閾值比較后的結(jié)果而閾值選擇本身就是業(yè)務(wù)決策的一部分。4. 模型評估與結(jié)果解讀準(zhǔn)確率很高不代表模型能用4.1 混淆矩陣和關(guān)鍵指標(biāo)怎么看才不漏信息業(yè)務(wù)方初看報告時最容易問的一句話是“準(zhǔn)確率多少”但如果流失用戶只占8%準(zhǔn)確率90%甚至95%都說明不了問題。我每次給運營看結(jié)果第一張圖永遠(yuǎn)是混淆矩陣。好的分析師不會只看“預(yù)測正確率”而是看四個格子真正例預(yù)測會流失、實際也流失了——這是模型抓到的“真流失客戶”。假正例預(yù)測會流失、實際沒流失——這部分會被浪費營銷資源。真負(fù)例預(yù)測不流失、實際也沒流失——大部隊正常經(jīng)營。假負(fù)例預(yù)測不流失、實際卻流失了——這是最需要關(guān)注的漏網(wǎng)之魚。基于混淆矩陣精確率真正例/(真正例假正例)召回率真正例/(真正例假負(fù)例)。流失預(yù)警項目的業(yè)務(wù)目標(biāo)通常是在可接受精確率的前提下最大化召回率。比如運營資源只夠覆蓋20%的用戶那就按模型輸出的概率降序取前20%這時候看這20%名單里實際流失客戶的覆蓋率是多少。AUCROC曲線下面積是一個更整體的指標(biāo)衡量模型區(qū)分正負(fù)樣本的能力0.5等于隨機猜0.8以上算有可用價值。決策樹在這個場景里一般能做到0.75到0.85之間如果超過0.9反而要警惕很可能是特征泄漏。我做過一個對比實驗同一份數(shù)據(jù)里邏輯回歸AUC約0.78決策樹約0.81隨機森林約0.85。決策樹效果略遜于隨機森林但最終業(yè)務(wù)采用了決策樹因為隨機森林完全無法解釋“為什么”。這個取舍在真實項目里非常重要。4.2 決策樹的特征重要度怎么用訓(xùn)練完成后直接輸出了特征重要度排序。印象里排名靠前的特征依次是消費金額環(huán)比變化率、入網(wǎng)時長、投訴次數(shù)、套餐飽和度、當(dāng)月停機天數(shù)。這個排序和業(yè)務(wù)經(jīng)驗的預(yù)期高度一致。消費金額環(huán)比變化率排第一業(yè)務(wù)邏輯非常清晰一個用戶如果從月消費200元降到80元基本就是在“降檔測試”甚至準(zhǔn)備離網(wǎng)。入網(wǎng)時長排在第二也符合常識。真正有意思的是投訴次數(shù)高投訴用戶流失率反而低于不投訴的用戶因為投訴說明用戶還想留在網(wǎng)內(nèi)只是對某個問題不滿那些不投訴、直接沉默流失的用戶反而更危險。特征重要度還可以用來做特征篩選。我在后續(xù)迭代中去掉重要度排名后30%的特征重新訓(xùn)練AUC幾乎沒下降但模型穩(wěn)定性和上線速度明顯提升。無用特征不僅增加計算開銷還會給模型引入噪聲。4.3 樹的可視化和業(yè)務(wù)規(guī)則轉(zhuǎn)化決策樹最大的競爭力在于可視化。把訓(xùn)練好的樹導(dǎo)出成圖直接打印出來貼墻都行。樹的每個分支都能翻譯成一條業(yè)務(wù)規(guī)則如果入網(wǎng)時長 6個月 且 消費金額環(huán)比變化率 -30% 且 投訴次數(shù) 1 那么: 流失概率 45%是整體平均水平(8%)的5.6倍這種規(guī)則可以直接交給客服團(tuán)隊做針對性話術(shù)設(shè)計。比如看到“入網(wǎng)時長短話費驟降有過投訴”這三個條件客服就知道這是個新用戶因為資費或者網(wǎng)絡(luò)問題不滿已經(jīng)明顯減少消費了需要盡快聯(lián)系、給出優(yōu)惠方案。樹的每一層都在自動做客戶分群分群結(jié)果就是運營策略的輸入。5. 業(yè)務(wù)落地與策略優(yōu)化模型不只是給個概率5.1 流失預(yù)警名單的分層運營模型輸出結(jié)果之后我不會直接把所有高概率用戶打包給運營而是先做分層。分層維度不是概率本身而是“概率”和“客戶價值”的組合高價值高風(fēng)險優(yōu)先挽留用高成本手段專屬客服、優(yōu)惠套餐調(diào)整、免費贈送流量包。低價值高風(fēng)險低成本手段短信推送、App彈窗優(yōu)惠預(yù)算有限時甚至可以放棄。高價值低風(fēng)險維持服務(wù)不主動打擾提前布局續(xù)約方案。低價值低風(fēng)險常規(guī)觸達(dá)即可。客戶價值可以用近三個月的ARPU每用戶平均收入或套餐檔位來定義。把模型輸出的風(fēng)險分?jǐn)?shù)和價值分?jǐn)?shù)交叉成一個2x2矩陣運營就很容易執(zhí)行了。5.2 從決策樹抽取規(guī)則指導(dǎo)挽留動作決策樹還能支持一個非常有價值的輸出按葉節(jié)點提煉客戶畫像。我把訓(xùn)練后的樹的每個葉子都統(tǒng)計一遍輸出以下信息該葉節(jié)點覆蓋的客戶數(shù)量、流失率、平均月消費、平均在網(wǎng)時長、主要套餐類型。然后從這些結(jié)果中挑選出“覆蓋人數(shù)多且流失率顯著偏高”的節(jié)點作為重點運營對象。實際項目中我們找到了一個這樣的葉子月消費150到200元、合約快到期、最近三個月流量使用率超過120%且投訴過流量計費問題。這組用戶占了全量用戶的3%但流失率高達(dá)32%。運營對這個群體設(shè)計了專屬的流量升級包推送后整體流失率下降了6個百分點。這就是決策樹從“模型輸出”到“業(yè)務(wù)策略”的完整閉環(huán)。5.3 模型上線后的監(jiān)控與更新模型上線后不是一勞永逸。電信客戶的消費行為會隨時間變化比如套餐結(jié)構(gòu)調(diào)整、資費政策變化、競爭對手活動都會讓老模型逐漸失效。我建議至少每月監(jiān)控一次模型的穩(wěn)定性。常用做法是計算特征分布的PSI群體穩(wěn)定性指標(biāo)如果PSI超過0.2說明入模特征的分布已經(jīng)發(fā)生顯著漂移需要重新訓(xùn)練。同時還要關(guān)注命中名單的實際流失率是否保持在預(yù)期水平如果實際轉(zhuǎn)化率明顯低于訓(xùn)練時的預(yù)估優(yōu)先檢查是不是業(yè)務(wù)環(huán)境變化導(dǎo)致概念漂移。數(shù)據(jù)集建議月度更新。流失預(yù)測不是一次性的項目而是周期性運行的流程每月拉取上月數(shù)據(jù)重新跑一遍特征工程重新訓(xùn)練模型更新輸出名單。6. 實操中的典型問題與排查心得6.1 數(shù)據(jù)泄漏隱藏最深的坑我在第一次完整跑通流程后得到的AUC是0.96當(dāng)時還挺興奮后來逐一排查特征才發(fā)現(xiàn)數(shù)據(jù)表里有一個字段叫“狀態(tài)”其中包含了“已銷戶”這類當(dāng)前狀態(tài)值。這個字段本身就是流失結(jié)果模型相當(dāng)于直接拿到了答案。排查數(shù)據(jù)泄漏的方法是對每個特征問一句“這個字段在預(yù)測時間點是否已知”。如果答案是“不一定”就堅決去掉。6.2 類別不平衡的處理邊界不要機械地為了平衡而平衡。有一次我用SMOTE過采樣到1:1AUC反而掉了0.03原因是合成樣本把決策邊界搞得過于復(fù)雜。復(fù)盤后確認(rèn)樹模型對不平衡有一定魯棒性對不平衡更敏感的是評估指標(biāo)和分類閾值。對于決策樹優(yōu)先調(diào)閾值、評估用召回率和P-R曲線只有當(dāng)召回率確實不夠時才考慮過采樣或欠采樣。6.3 參數(shù)過擬合驗證集的教訓(xùn)做網(wǎng)格搜索時我一度同時調(diào)6個參數(shù)結(jié)果驗證集分?jǐn)?shù)越來越高測試集分?jǐn)?shù)卻一般。后來改成按“先結(jié)構(gòu)參數(shù)再剪枝參數(shù)”的順序分步調(diào)反而更穩(wěn)。具體順序建議先定max_depth和min_samples_leaf再調(diào)min_samples_split最后調(diào)ccp_alpha。每次只動一個方向其他參數(shù)保持經(jīng)驗?zāi)J(rèn)值調(diào)出來的模型泛化能力明顯更好。6.4 常見問題速查表問題現(xiàn)象可能原因排查與解決AUC接近1特征泄漏模型看到了未來信息逐特征檢查“預(yù)測時點是否已知”刪除可疑字段召回率極低精確率很高分類閾值過高模型偏向多數(shù)類用P-R曲線重新選擇閾值下調(diào)分類閾值訓(xùn)練集分?jǐn)?shù)高、驗證集分?jǐn)?shù)低樹過深、葉子樣本太少增大min_samples_leaf降低max_depth使用ccp_alpha剪枝特征重要度不符合業(yè)務(wù)常識編碼方式問題或噪聲特征干擾檢查類別編碼嘗試分箱處理后再建模線上效果衰減特征分布漂移或業(yè)務(wù)政策變化月度監(jiān)控PSI觸發(fā)閾值即重新訓(xùn)練特征工程之后AUC反而下降引入了冗余特征或分箱過于粗糙執(zhí)行特征篩選復(fù)核分箱邊界是否符合業(yè)務(wù)邏輯7. 最后分享一點個人體會把整個項目做完回頭看決策樹這套方案在電信流失預(yù)測場景里最大的價值不在于把AUC從0.78提高到0.8而在于讓模型結(jié)果能被業(yè)務(wù)團(tuán)隊真正用起來。我反復(fù)跟團(tuán)隊強調(diào)這句話一個能解釋但準(zhǔn)確率稍低的模型勝過一個準(zhǔn)確率高但說不清道理的模型。因為運營執(zhí)行者只有理解了規(guī)則才會信任名單才會根據(jù)名單優(yōu)化話術(shù)和策略。模型效果再好如果業(yè)務(wù)方不信、不用那就只是一個學(xué)術(shù)練習(xí)。踩過幾次坑之后我現(xiàn)在做這類項目會先跑一棵淺樹看變量規(guī)律再用交叉驗證調(diào)參最后才評估完整效果。這個習(xí)慣幫我擋掉了很多“看上去很美”的問題。如果這篇文章能幫你在做決策樹項目時少踩一個坑那就不算白寫。