共计 1955 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么服装推荐需要决策树?
传统协同过滤在服装电商场景中常遇到两个致命问题:

- 冷启动困境:新上架商品没有用户行为数据,无法通过 ” 喜欢这件的人也喜欢 ” 的逻辑推荐
- 特征稀疏性:用户对服装的偏好受多维因素影响(颜色 / 尺码 / 材质等),但单一用户的行为数据往往集中在少数品类
举个例子,某用户历史只购买过黑色 T 恤,协同过滤可能永远无法推荐红色连衣裙——尽管用户可能实际需要。而决策树通过显式建模特征规则(如IF 颜色 = 红色 AND 季节 = 夏季 THEN 推荐连衣裙),能更灵活地处理这类问题。
技术选型:CART 为何胜出?
相比 ID3/C4.5 决策树,CART 有两个显著优势:
- Gini 系数更适合类别特征:
- 服装特征多为离散值(如颜色、尺码)
- Gini 计算简单:$Gini(D)=\sum_{k=1}^K p_k(1-p_k)$
-
相比信息增益,对类别分布不均的特征更敏感(如 ” 限量款 ” 标签)
-
二叉树结构效率更高:
- 每个节点只做二元判断(如 ” 价格≤199?”)
- 在线推理时平均遍历深度更浅
核心实现:从原始数据到决策树
第一步:特征工程实战
服装数据通常需要以下预处理:
# 颜色离散化(示例:RGB 转色系)def color_category(hex):
r, g, b = hex_to_rgb(hex)
if r > 200 and g < 100: return 'red'
elif g > 180: return 'green'
else: return 'neutral'
# 季节特征提取
season_map = {
1: 'winter', 2: 'spring',
3: 'summer', 4: 'autumn'
}
第二步:手写 CART 核心逻辑
def gini_impurity(labels):
# 计算基尼不纯度
_, counts = np.unique(labels, return_counts=True)
prob = counts / len(labels)
return 1 - np.sum(prob**2)
def find_best_split(X, y):
best_gini = float('inf')
best_feature = None
for feature in X.columns:
# 对数值型特征排序
thresholds = sorted(X[feature].unique())
for threshold in thresholds:
left_idx = X[feature] <= threshold
left_gini = gini_impurity(y[left_idx])
right_gini = gini_impurity(y[~left_idx])
# 加权平均
total_gini = (left_gini * sum(left_idx) +
right_gini * sum(~left_idx)) / len(y)
if total_gini < best_gini:
best_gini = total_gini
best_feature = (feature, threshold)
return best_feature
生产环境优化策略
剪枝防过拟合
采用 CCP(Cost Complexity Pruning)方法:
- 计算每个节点的 $\alpha$ 值:
$$\alpha = \frac{R(t)-R(T_t)}{|T_t|-1}$$ - 逐步剪枝 $\alpha$ 最小的节点
特征工程进阶
处理用户点击序列的两种方法:
- 时间衰减加权:最近点击的服装特征权重更高
weight = np.exp(-0.1 * (current_time - click_time)) - 行为类型区分:购买(权重 1.0)、收藏(0.6)、浏览(0.3)
效果验证与部署
A/ B 测试指标设计
| 指标类型 | 具体指标 | 目标值 |
|---|---|---|
| 点击率 | CTR | 提升≥15% |
| 多样性 | 推荐品类数 | ≥8 个 / 用户 |
| 新颖性 | 长尾商品曝光占比 | ≥30% |
PMML 模型部署
使用 sklearn2pmml 转换:
from sklearn2pmml import PMMLPipeline
pipeline = PMMLPipeline([("classifier", DecisionTreeClassifier())
])
sklearn2pmml(pipeline, "model.pmml")
延伸思考:GBDT 增强方案
单棵 CART 树容易受噪声影响,可以通过以下方式改进:
- 梯度提升树(GBDT):
- 用多棵树逐步修正残差
-
代码示例:
from sklearn.ensemble import GradientBoostingClassifier gbdt = GradientBoostingClassifier(n_estimators=100) -
特征交叉组合:
- 自动生成
颜色×风格等组合特征 - 适合处理 ” 夏季 + 棉麻 ” 等隐含偏好
决策树就像服装搭配的基础公式,而实际推荐系统需要像搭配师一样,既懂基本规则又能灵活变通。建议先实现基础版本,再逐步引入更复杂的特征和模型。
正文完
