Cart决策树案例实战:从数据清洗到模型调优的全流程解析

1次阅读
没有评论

共计 2245 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

1. 背景与业务痛点

在电商用户分群场景中,我们常遇到以下典型问题:

Cart 决策树案例实战:从数据清洗到模型调优的全流程解析

  • 类别型特征处理困难:用户地域、设备类型等文本特征需转化为数值
  • 样本量级差异大:高价值用户占比通常不足 5%
  • 特征间多重共线性:如浏览时长与页面访问量存在强相关性
  • 模型解释性要求:运营部门需要可理解的用户分层规则

以某跨境电商的 30000 条用户行为数据为例,正样本(月消费 >1000 元)仅占 4.7%,直接训练会导致模型偏向预测负样本。

2. 算法选择依据

2.1 决策树家族对比

算法 分裂标准 特征类型支持 输出类型
ID3 信息增益 仅类别型 分类
C4.5 信息增益比 类别型 + 连续 分类
CART 基尼系数 类别型 + 连续 分类 / 回归

2.2 为什么选择 CART

  1. 计算效率:基尼系数计算不涉及对数运算(相比信息增益)
  2. 二叉树结构:比多叉树更易解释和可视化
  3. 回归支持:可预测连续值(如用户生命周期价值)

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 过拟合预防

  1. 预剪枝
  2. 设置 min_samples_split=50
  3. 限制 max_leaf_nodes=20
  4. 后剪枝
    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 思考题

  1. 如何处理 ” 用户最近购买时间 ” 这类时序特征?
  2. 当特征重要性显示某个数值型特征主导时,应该检查什么?

6. 效果验证

在测试集上达到如下指标:

指标 基准模型 CART 调优后
AUC 0.712 0.803
召回率 @Top20% 31% 58%

通过限制树深度为 5,模型输出了如下可解释规则:

if 最近 30 天访问次数 > 12 
   and 平均停留时长 > 8 分钟
   and 设备类型 = iPhone:
   then 分类为高价值用户

这种结构化规则可直接用于运营策略制定。后续可尝试梯度提升树 (GBDT) 进行效果对比,但需注意模型复杂度的提升。

正文完
 0
评论(没有评论)