决策树算法本质上是通过一系列"如果-那么"规则对数据进行递归划分。想象一下医生诊断病人的过程:先测体温,如果发烧再检查喉咙,如果喉咙发红则考虑流感...这种层层递进的判断逻辑正是决策树的核心思想。
信息熵是理解决策树的关键概念。举个生活中的例子:你面前有两个不透明盒子,第一个盒子有99个红球和1个蓝球,第二个盒子红蓝球各50个。显然第一个盒子的"不确定性"更低——这就是信息熵的直观体现。在决策树中,我们通过计算每个特征对信息熵的减少程度(即信息增益)来选择最佳划分特征。
三种主流划分标准各有特点:
python复制# 计算信息增益示例
import numpy as np
def entropy(p):
return -p * np.log2(p) - (1-p) * np.log2(1-p)
# 原始数据熵
ent_D = entropy(0.5) # 假设正负样本各半
# 按某特征划分后的条件熵
ent_condition = 0.7*entropy(0.6) + 0.3*entropy(0.2)
gain = ent_D - ent_condition # 信息增益
在实际项目中,原始特征往往需要加工才能发挥最大价值。我曾在一个银行客户分群项目中,将"最近一次交易金额"和"交易频率"组合成"客户活跃度指数",这个合成特征的信息增益比原始特征高出40%。
特征选择的实用技巧:
三大经典算法的适用场景:
python复制# sklearn中的决策树实现
from sklearn.tree import DecisionTreeClassifier
# 金融风控常用参数
model = DecisionTreeClassifier(
criterion='gini', # 基尼指数
max_depth=5, # 预剪枝
min_samples_leaf=50 # 防止过拟合
)
在树生长过程中就进行控制,好比园丁修剪盆栽时保留主干。关键参数:
max_depth:树的最大深度min_samples_split:节点继续分裂的最小样本数min_impurity_decrease:分裂需要的最小纯度提升我在电商推荐系统项目中发现,将max_depth设为6,min_samples_leaf设为100时,模型在测试集的准确率比不限制时提高了12%。
先让树完全生长再修剪,就像雕塑家的精修过程。CCP(Cost Complexity Pruning)是常用方法:
python复制# 后剪枝示例
path = model.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas = path.ccp_alphas
# 交叉验证选择最佳alpha
from sklearn.model_selection import cross_val_score
scores = [
cross_val_score(
DecisionTreeClassifier(ccp_alpha=alpha),
X_train, y_train, cv=5
).mean()
for alpha in ccp_alphas
]
best_alpha = ccp_alphas[np.argmax(scores)]
在信用卡欺诈检测中,决策树需要特殊处理类别不平衡问题。我的经验是:
class_weight='balanced'参数零售行业需要可解释的分群规则,可以通过:
export_text输出业务规则python复制# 输出可解释的业务规则
from sklearn.tree import export_text
rules = export_text(
model,
feature_names=['年龄','收入','消费频率'],
spacing=3
)
print(rules)
决策树在实际应用中最大的优势不是绝对精度,而是它能生成业务人员看得懂的逻辑规则。我曾用决策树帮银行反欺诈团队减少了60%的误判投诉,关键就是把复杂的数学公式转化成了"如果转账金额>5万且收款方是新客户,则需人工审核"这样的业务规则。