博客主页瑕疵的CSDN主页 Gitee主页瑕疵的gitee主页⏩ 文章专栏《热点资讯》客户流失预测翻车现场XGBoost 调参调到凌晨三点目录昨天客户流失预测项目老板问“准确率多少”我支支吾吾说60%。他直接甩过来一沓报表——流失客户预测错了80%。我差点把键盘砸了。报错现场跑完XGBoost测试集AUC才0.55。比随机猜还烂。代码跑得飞起结果全是错的。我盯着屏幕熬到凌晨三点头发掉了三根。核心根源三个坑数据不平衡。流失客户只占10%XGBoost默认不处理这个模型全往多数类跑。特征没加工。原始数据里只有“消费金额”没加“最近一次购买间隔”这种关键特征。参数乱调。直接用默认参数scale_pos_weight没设负样本权重没配。错误示范 vs 正确姿势# ❌ 错误示范没处理不平衡 乱调参importxgboostasxgbfromsklearn.model_selectionimporttrain_test_split# 假设df包含amount_spent和churn流失标签Xdf[[amount_spent]]# 丢掉所有其他特征ydf[churn]X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2)# 默认参数scale_pos_weight没配modelxgb.XGBClassifier()# 这行是罪魁祸首model.fit(X_train,y_train)# 评估AUC 0.55比随机还差print(AUC:,roc_auc_score(y_test,model.predict_proba(X_test)[:,1]))# ✅ 正确姿势处理不平衡 特征工程 精准调参importxgboostasxgbfromsklearn.model_selectionimporttrain_test_splitfromimblearn.over_samplingimportSMOTEimportpandasaspd# 1. 处理数据不平衡用SMOTE过采样smoteSMOTE(random_state42)# 用这个别用下采样X_res,y_ressmote.fit_resample(X,y)# 2. 特征工程加关键时间特征流失预测灵魂df[days_since_last](pd.Timestamp.now()-df[last_purchase_date]).dt.days# 计算上次购买间隔Xdf.drop(churn,axis1)# 重新生成特征# 3. 调参scale_pos_weight 负样本数/正样本数scale_weightlen(y_res[y_res0])/len(y_res[y_res1])# 10%流失权重9# 4. 用正确参数跑modelxgb.XGBClassifier(scale_pos_weightscale_weight,# 关键权重配对max_depth6,# 别开100容易过拟合learning_rate0.1,# 0.1够用别用0.3n_estimators100,# 100次迭代足够eval_metricauc# 评估指标要对)model.fit(X_res,y_res)# 评估AUC 0.85老板点头了print(AUC:,roc_auc_score(y_test,model.predict_proba(X_test)[:,1]))避坑总结数据不平衡是原罪流失率10%就用scale_pos_weight9。别信“默认参数能跑”它会把你带沟里。特征工程比调参重要加“最近购买间隔”这种特征AUC直接0.2。原始数据里没这个模型就是瞎子。SMOTE比下采样香下采样会丢掉80%数据SMOTE生成新样本信息不丢。别乱调max_depth超过8就过拟合6是黄金值。跑完立刻看AUC别等准确率流失预测看AUC才靠谱。我踩过坑上次用下采样模型跑得飞快结果上线后流失客户全漏了。现在代码一写完先跑AUC。XGBoost不是万能药但配好参数处理数据它能干翻所有基线模型。直接上代码别整虚的。