共计 2073 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
决策树是机器学习中最直观且易于解释的算法之一,广泛应用于分类和回归问题。它的核心优势在于:
- 非参数特性:不需要严格的数据分布假设
- 可解释性:决策过程可直观呈现为树状结构
- 自动特征选择:通过信息增益等指标筛选重要特征
在金融风控、医疗诊断等需要模型解释性的场景中,决策树往往是首选算法。
核心概念:关键参数解析
决策树的性能很大程度上取决于以下参数:
- max_depth:树的最大深度
- 值越小模型越简单,可能欠拟合
-
值过大容易过拟合,推荐范围 3 -10
-
min_samples_split:节点分裂所需最小样本数
- 较大的值限制树生长,防止过拟合
-
典型设置为 2 -20
-
criterion:分裂标准
- ‘gini’:基尼不纯度(默认)
- ‘entropy’:信息增益
实战演示
环境准备
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
数据预处理
# 示例使用鸢尾花数据集
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
基础模型训练
# 创建默认参数的决策树
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)
# 评估测试集准确率
preds = clf.predict(X_test)
print(f'基础模型准确率: {accuracy_score(y_test, preds):.2f}')
参数对比实验
max_depth 影响测试
depths = range(1, 11)
accuracies = []
for d in depths:
model = DecisionTreeClassifier(max_depth=d, random_state=42)
model.fit(X_train, y_train)
acc = model.score(X_test, y_test)
accuracies.append(acc)
plt.plot(depths, accuracies)
plt.xlabel('Max Depth')
plt.ylabel('Test Accuracy')
plt.show()

min_samples_split 对比
splits = [2, 5, 10, 15, 20]
split_acc = []
for s in splits:
model = DecisionTreeClassifier(min_samples_split=s, random_state=42)
model.fit(X_train, y_train)
split_acc.append(model.score(X_test, y_test))
plt.bar(range(len(splits)), split_acc)
plt.xticks(range(len(splits)), splits)
plt.xlabel('min_samples_split')
plt.ylabel('Accuracy')
plt.show()
避坑指南
- 过拟合问题
- 现象:训练集准确率高但测试集差
-
解决方案:
- 设置 max_depth
- 增加 min_samples_split
- 使用剪枝(ccp_alpha 参数)
-
特征重要性评估
- 使用 feature_importances_属性
-
剔除重要性 <0.05 的特征
-
类别不平衡处理
- 设置 class_weight=’balanced’
- 采用过采样 / 欠采样
进阶建议
- 何时升级到随机森林
- 当单一决策树准确率无法提升时
-
需要更稳定的预测结果时
-
其他评估指标
- 分类问题:F1-score(适用于不平衡数据)
-
二分类:ROC-AUC(需要概率预测)
-
可视化决策路径
from sklearn.tree import plot_tree plt.figure(figsize=(12,8)) plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True) plt.show()
思考题
- 当 max_depth 增加到 15 时,为什么测试准确率反而下降?
- 如何用决策树处理连续型特征的分箱问题?
- 比较 gini 和 entropy 准则在实际数据集上的表现差异
通过本实验可以明显看出,max_depth= 3 时模型达到最佳平衡点,继续增加深度会导致过拟合。而 min_samples_split 在 5 -10 区间效果最好,过大值会导致欠拟合。建议在实际项目中通过网格搜索寻找最优参数组合。
正文完
