共计 1610 个字符,预计需要花费 5 分钟才能阅读完成。
业务场景与核心挑战
在电商用户分群场景中,我们常遇到以下典型问题:

- 用户特征包含大量类别型变量(如地域、设备类型),传统数值编码会引入虚假的序关系
- 高价值用户占比不足 5%,直接训练会导致模型偏向多数类
- 业务方需要清晰的规则解释用户分层逻辑
算法选型:为什么选择 Cart
与 ID3/C4.5 相比,Cart 决策树的优势体现在:
- 使用基尼系数作为分裂标准,计算效率比信息熵提升约 30%
- 支持连续值和类别型特征的混合处理
- 默认生成二叉树结构,规则解释性更强
测试对比显示,在相同数据集上:
| 算法 | 训练时间(s) | 测试集 AUC |
|---|---|---|
| ID3 | 12.7 | 0.81 |
| Cart | 8.2 | 0.83 |
完整实现流程
数据预处理关键步骤
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
# 定义类别型特征转换器
preprocessor = ColumnTransformer(
transformers=[('cat', OneHotEncoder(handle_unknown='ignore'), ['city', 'device_type'])
],
remainder='passthrough'
)
# 处理样本不均衡
from sklearn.utils import class_weight
weights = class_weight.compute_sample_weight('balanced', y_train)
模型训练与调参
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
# 定义参数搜索空间
param_grid = {'max_depth': [3, 5, 7],
'min_samples_leaf': [10, 20, 50],
'ccp_alpha': [0.0, 0.01, 0.1] # 代价复杂度剪枝参数
}
grid_search = GridSearchCV(DecisionTreeClassifier(criterion='gini'),
param_grid,
scoring='roc_auc',
cv=5
)
grid_search.fit(X_train_processed, y_train, sample_weight=weights)
可视化分析
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(15,10))
plot_tree(
grid_search.best_estimator_,
feature_names=feature_names,
class_names=['普通用户', '高价值用户'],
filled=True,
rounded=True
)
plt.show()
# 特征重要性分析
pd.Series(
grid_search.best_estimator_.feature_importances_,
index=feature_names
).sort_values().plot.barh()
生产环境注意事项
- 金融风控应用:
- 通过
export_text方法输出 if-then 规则 -
限制树深度不超过 5 层以保证可解释性
-
过拟合预防:
- 监控训练集与验证集 AUC 差异(建议阈值 <0.15)
- 启用
min_impurity_decrease提前终止分裂
实践资源与延伸思考
- 练习数据集:UCI Bank Marketing Dataset(包含客户时序行为特征)
- 进阶挑战:
- 如何用
tsfresh库提取时序特征? - 当特征超过 100 维时,应该采用哪些优化策略?
实际项目中,我们通过上述方法将用户分群准确率提升了 22%,同时将模型推理时间控制在 50ms 以内。建议读者重点关注特征工程与剪枝策略的组合优化。
正文完
