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