共计 2245 个字符,预计需要花费 6 分钟才能阅读完成。
1. 背景与业务痛点
在电商用户分群场景中,我们常遇到以下典型问题:

- 类别型特征处理困难:用户地域、设备类型等文本特征需转化为数值
- 样本量级差异大:高价值用户占比通常不足 5%
- 特征间多重共线性:如浏览时长与页面访问量存在强相关性
- 模型解释性要求:运营部门需要可理解的用户分层规则
以某跨境电商的 30000 条用户行为数据为例,正样本(月消费 >1000 元)仅占 4.7%,直接训练会导致模型偏向预测负样本。
2. 算法选择依据
2.1 决策树家族对比
| 算法 | 分裂标准 | 特征类型支持 | 输出类型 |
|---|---|---|---|
| ID3 | 信息增益 | 仅类别型 | 分类 |
| C4.5 | 信息增益比 | 类别型 + 连续 | 分类 |
| CART | 基尼系数 | 类别型 + 连续 | 分类 / 回归 |
2.2 为什么选择 CART
- 计算效率:基尼系数计算不涉及对数运算(相比信息增益)
- 二叉树结构:比多叉树更易解释和可视化
- 回归支持:可预测连续值(如用户生命周期价值)
3. 完整实现流程
3.1 数据预处理
# 类别型特征编码
from sklearn.preprocessing import OneHotEncoder
cat_features = ['device_type', 'user_region']
ohe = OneHotEncoder(drop='first', sparse=False)
X_cat = ohe.fit_transform(df[cat_features])
# 数值型特征标准化
from sklearn.preprocessing import StandardScaler
num_features = ['session_count', 'avg_duration']
scaler = StandardScaler()
X_num = scaler.fit_transform(df[num_features])
# 处理样本不均衡
from sklearn.utils import class_weight
weights = class_weight.compute_sample_weight('balanced', y)
3.2 关键参数解析
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(
criterion='gini', # 分裂标准
max_depth=5, # 树的最大深度
min_samples_leaf=10, # 叶节点最小样本数
ccp_alpha=0.01, # 代价复杂度剪枝系数
class_weight='balanced' # 自动调整类别权重
)
3.3 模型评估与调优
# 网格搜索示例
from sklearn.model_selection import GridSearchCV
param_grid = {'max_depth': [3, 5, 7],
'min_samples_leaf': [5, 10, 20],
'ccp_alpha': [0, 0.01, 0.1]
}
grid_search = GridSearchCV(model, param_grid, scoring='roc_auc', cv=5)
grid_search.fit(X, y)
print(f'最佳参数:{grid_search.best_params_}')
print(f'验证集 AUC:{grid_search.best_score_:.3f}')
3.4 特征重要性分析
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.barh(range(len(features)), model.feature_importances_, align='center')
plt.yticks(range(len(features)), features)
plt.xlabel('特征重要性')
plt.title('CART 特征重要性排序')
plt.tight_layout()
plt.show()
4. 生产环境实践建议
4.1 可解释性保障
- 限制 max_depth≤5 以保证可读性
- 输出决策路径:
from sklearn.tree import export_text print(export_text(model, feature_names=features))
4.2 过拟合预防
- 预剪枝:
- 设置 min_samples_split=50
- 限制 max_leaf_nodes=20
- 后剪枝:
path = model.cost_complexity_pruning_path(X_train, y_train) ccp_alphas = path.ccp_alphas
4.3 特殊特征处理
- 时序特征:转化为统计量(最近 7 天活跃天数)
- 高基数类别:按目标编码(Target Encoding)
5. 练习与思考
5.1 练习数据集
- UCI 成人收入数据集:https://archive.ics.uci.edu/ml/datasets/adult
- 包含年龄、教育程度等 14 个特征
5.2 思考题
- 如何处理 ” 用户最近购买时间 ” 这类时序特征?
- 当特征重要性显示某个数值型特征主导时,应该检查什么?
6. 效果验证
在测试集上达到如下指标:
| 指标 | 基准模型 | CART 调优后 |
|---|---|---|
| AUC | 0.712 | 0.803 |
| 召回率 @Top20% | 31% | 58% |
通过限制树深度为 5,模型输出了如下可解释规则:
if 最近 30 天访问次数 > 12
and 平均停留时长 > 8 分钟
and 设备类型 = iPhone:
then 分类为高价值用户
这种结构化规则可直接用于运营策略制定。后续可尝试梯度提升树 (GBDT) 进行效果对比,但需注意模型复杂度的提升。
正文完
