Python中如何为决策树模型的观测样本设置差异化权重
Python树类模型按保单存续期加权的实现方案
完全可以实现,主流Python树模型库都原生支持样本加权能力,不需要修改模型底层的分裂、计算逻辑。
核心原理
树模型的样本加权逻辑非常直接:训练过程中计算节点分裂的信息增益/基尼系数/平方误差、计算叶节点输出值时,会按照你传入的权重给每个样本的贡献做加权,权重越高的样本对模型规则生成的影响越大,完全匹配你“长存续期保单优先级更高”的需求。
你只需要提前把每份保单对应的权重计算好——最简单的方式就是直接用保单存续天数作为权重,也可以根据业务需求做缩放调整,训练时把权重数组传入模型即可。
具体调用方法
以下是Python生态最常用的树模型的加权实现,覆盖单决策树和各类集成树:
scikit-learn 单决策树/随机森林/GBDT
所有树类估计器的fit()方法都自带sample_weight参数,直接传入和样本等长的权重数组即可,示例代码:from sklearn.tree import DecisionTreeClassifier import pandas as pd import numpy as np # df为你的保单数据集,X为模型输入特征,y为预测目标,duration列存储每份保单的存续天数 X = df.drop(columns=['is_churn', 'duration']) y = df['is_churn'] # 权重计算:直接用存续天数,若极差过大可做对数/归一化缩放 # 例:归一化到0.1~10区间,避免极值样本过度影响模型 min_dur, max_dur = df['duration'].min(), df['duration'].max() sample_weight = (df['duration'] - min_dur) / (max_dur - min_dur) * 9.9 + 0.1 # 初始化并训练模型,传入样本权重 clf = DecisionTreeClassifier(max_depth=5, random_state=42) clf.fit(X, y, sample_weight=sample_weight)随机森林、梯度提升树的调用逻辑完全一致,都是在
fit()阶段传入sample_weight即可。主流GBDT类实现(XGBoost/LightGBM/CatBoost)
三类工业界常用的树集成模型全部原生支持样本权重:- XGBoost:构造
DMatrix时传入weight=sample_weight,或直接在fit()方法中传入sample_weight=sample_weight - LightGBM:构造
Dataset时传入weight=sample_weight即可 - CatBoost:在
fit()方法中传入sample_weight=sample_weight参数
- XGBoost:构造
注意事项
- 不要混淆权重和特征:存续天数作为权重是用来调整模型对样本的重视程度,不要直接把它和普通输入特征混为一谈,二者作用逻辑完全不同。
- 权重缩放建议:如果你的保单存续天数极差非常大(比如最短1天,最长超过10年),建议先对存续天数做对数变换或者区间归一化,避免极少数超长存续期的样本过度主导模型分裂规则,具体缩放范围可以根据验证集效果调整。
- 验证集加权:如果训练时用了早停机制,验证集也要按照完全相同的规则计算权重传入,否则早停的评估指标会出现偏差。
内容的提问来源于stack exchange,提问作者Christina
相关产品推荐
相关产品推荐

