决策树模型实战:从参数调优到测试集准确率对比

1次阅读
没有评论

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

image.webp

背景介绍

决策树是机器学习中最直观且易于解释的算法之一,广泛应用于分类和回归问题。它的核心优势在于:

  • 非参数特性:不需要严格的数据分布假设
  • 可解释性:决策过程可直观呈现为树状结构
  • 自动特征选择:通过信息增益等指标筛选重要特征

在金融风控、医疗诊断等需要模型解释性的场景中,决策树往往是首选算法。

核心概念:关键参数解析

决策树的性能很大程度上取决于以下参数:

  1. max_depth:树的最大深度
  2. 值越小模型越简单,可能欠拟合
  3. 值过大容易过拟合,推荐范围 3 -10

  4. min_samples_split:节点分裂所需最小样本数

  5. 较大的值限制树生长,防止过拟合
  6. 典型设置为 2 -20

  7. criterion:分裂标准

  8. ‘gini’:基尼不纯度(默认)
  9. ‘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()

避坑指南

  1. 过拟合问题
  2. 现象:训练集准确率高但测试集差
  3. 解决方案:

    • 设置 max_depth
    • 增加 min_samples_split
    • 使用剪枝(ccp_alpha 参数)
  4. 特征重要性评估

  5. 使用 feature_importances_属性
  6. 剔除重要性 <0.05 的特征

  7. 类别不平衡处理

  8. 设置 class_weight=’balanced’
  9. 采用过采样 / 欠采样

进阶建议

  1. 何时升级到随机森林
  2. 当单一决策树准确率无法提升时
  3. 需要更稳定的预测结果时

  4. 其他评估指标

  5. 分类问题:F1-score(适用于不平衡数据)
  6. 二分类:ROC-AUC(需要概率预测)

  7. 可视化决策路径

    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()

思考题

  1. 当 max_depth 增加到 15 时,为什么测试准确率反而下降?
  2. 如何用决策树处理连续型特征的分箱问题?
  3. 比较 gini 和 entropy 准则在实际数据集上的表现差异

通过本实验可以明显看出,max_depth= 3 时模型达到最佳平衡点,继续增加深度会导致过拟合。而 min_samples_split 在 5 -10 区间效果最好,过大值会导致欠拟合。建议在实际项目中通过网格搜索寻找最优参数组合。

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