cap6 决策树

本文探讨了CART决策树在分类和回归任务中的应用。通过鸢尾花数据集展示了决策树的训练和可视化过程。内容包括估算类别概率、CART训练算法、基尼不纯度与信息熵的比较,以及正则化超参数的作用。在回归问题中,CART通过最小化MSE来构建树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

决策树可以实现分类或者回归,也是随机森林的基本预测器。

决策树训练和可视化

在鸢尾花数据集上训练一个决策树:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris=load_iris()
x=iris.data[:,2:] 
y=iris.target

tree_clf=DecisionTreeClassifier(max_depth=2)
tree_clf.fit(x,y)

特征值选择的是鸢尾花第2列及后面所有列(花瓣长度和宽度)。
可视化:使用export_graphviz库

#可视化决策树
from sklearn.tree import export_graphviz
export_graphviz(
    tree_clf,
    out_file=image_path('iris_tree.dot'),
    feature_names=iris.feature_names[2:],
    class_names=iris.target_names,
    rounded=True,
    filled=True
)

定义image_path方法:


from __future__ import division, print_function, unicode_literals

import numpy as np
import os

# to make this notebook's output stable across runs
np.random.seed(42)

# To plot pretty figures
# %matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)

# Where to save the figures
PROJECT_ROOT_DIR = "."

def image_path(fig_id):
    return os.path.join(PROJECT_ROOT_DIR, "images", fig_id)

def save_fig(fig_id, tight_layout=True):
    print("Saving figure", fig_id)
    if tight_layout:
        plt.tight_layout()
    plt.savefig(image_path(fig_id) + ".png", format='png', dpi=300)

运行以上代码,会在“…\images”文件夹下产生iris_tree.dot文件,打开命令行模式并且工作目录移动到此文件夹下,输入:

dot -Tpng iris_tree.dot -o iris_tree.png

将iris_tree.dot转换为:iris_tree.png
打开iris_tree.png文件:
鸢尾花决策树
注:决策树不需要特征缩放或集中(归一化)。
基尼不存度:如果所有实例都是同一个类型的,则是纯的,用来衡量当前数据集的混乱度,类似于信息熵。
G i = 1 − ∑ k = 1 n p i , k 2 G_i=1-\sum_{k=1}^{n}p_{i,k}^2 Gi=1k=1npi,k2

估算类别概率

决策树可以估算某个实例属于特定类别 k k k的概率:首先,跟随决策树找到该实例的叶节点,然后返回该叶节中点类别 k k k的训练实例占比。也就是说,特定叶节点上,所有实例属于类别 k k k的概率都相同。

CART训练算法:生成决策树的过程中如何选择特征及阈值?产生出最纯子集的特征和阈值就是经算法搜索确定的特征和阈值

cart分类成本函数:
J ( k , t k ) = m l e f t m G l e f t + m r i g h t m G r i g h t J(k,t_k)=\frac{m_{left}}{m}G_{left}+\frac{m_{right}}{m}G_{right} J(k,tk)=mmleftGleft+mmrightGright
其中, G l e f t G_{left} Gleft是左子集的不纯度, m l e f t m_{left} mleft是左子集的实例数量。
CART是贪婪算法,每次执行都会选择当前最好的特征和阈值,不一定能得到全局最优值。

基尼不纯度还是信息熵

都可以衡量信息的不纯度。
不同:基尼不纯度倾向于从树枝中分裂出最常见的类别,而信息熵则倾向于生产更平衡的树。

正则化超参数

防止过拟合。在训练过程中降低决策树的自由度。
min_samples_split(节点在被分裂之前必须具有的最小样本数),min_samples_leaf(叶节点必须具有的最小样本数),min_weight_fraction_leaf(和min_samples_leaf相同,但表示为加权总数的一小部分实例),max_leaf_nodes(叶节点的最大数量)和max_features(在每个节点被评估是否分裂的时候,具有的最大特征数量)。增加超参数min_* 或者减少max_* 会使模型正则化。

回归

使用含有高斯噪声的二次函数训练一个回归树:

from sklearn.tree import DecisionTreeRegressor
tree_reg=DecisionTreeRegressor(max_depth=2)
import numpy as np
i=2*np.random.rand(100,1)
j=4+3*i+np.random.randn(100,1)
tree_reg.fit(i,j)
export_graphviz(
    tree_reg,
    out_file=image_path('Tree_reg.dot'),
    feature_names='i',
    class_names='j',
    rounded=True,
    filled=True
)

可视化决策树:
在这里插入图片描述
这里仍然使用了CART算法,不同的是,它分裂训练集的方式不是最小化不纯度,而是最小化MSE。
CART回归成本函数:
J ( k , t k ) = m l e f t m M S E l e f t + m r i g h t m M S E r i g h t J(k,t_k)=\frac{m_{left}}{m}MSE_{left}+\frac{m_{right}}{m}MSE_{right} J(k,tk)=mmleftMSEleft+mmrightMSEright

### 吴恩达机器学习课程中的决策树教程 #### 构建决策树的过程 构建决策树的过程中,核心在于如何选择最优的特征用于分裂节点。这涉及到几个重要的概念和技术: - **熵 (Entropy)** 的计算是衡量数据集纯度的重要指标[^3]。对于给定的数据分布,可以通过特定公式来量化其不确定性程度。 - **信息增益 (Information Gain)** 是评估某个属性作为划分依据的有效性的关键参数。它表示通过引入某一条件减少了多少混乱度或不确定因素。具体来说,在考虑某一分割方案时,会先求得父节点以及各子节点各自的熵值;接着利用这些数值推导出整个分割操作所带来的平均信息量变化——即所谓的“信息增益”。最终选取能使整体信息增益最大的那个维度来进行实际切割[^4]。 - **递归建立子树** 当选定好当前层面上的最佳切分点之后,则需针对新产生的两个部分分别执行相同的操作流程直至达到预设终止条件为止(比如设定的最大深度限制)。此过程中涉及到了`build_tree_recursive()` 函数的应用实例[^1]。 ```python def build_tree_recursive(X_train, y_train, indices, node_name, max_depth, current_depth): # 基础情况处理:如果已经达到了指定的最大深度或者没有更多样本可以用来训练... if current_depth >= max_depth or len(indices) <= 1: leaf_value = calculate_leaf_value(y_train[indices]) return {'node': f'{node_name}={leaf_value}'} best_split_index, best_threshold = get_best_split(X_train, y_train, indices) left_indices = X_train.iloc[indices][best_split_index] <= best_threshold right_indices = ~left_indices tree_structure = { 'feature': best_split_index, 'threshold': best_threshold, 'left_child': None, 'right_child': None } tree_structure['left_child'] = build_tree_recursive( X_train, y_train, np.where(left_indices)[0], f"{node_name}_L", max_depth, current_depth + 1 ) tree_structure['right_child'] = build_tree_recursive( X_train, y_train, np.where(right_indices)[0], f"{node_name}_R", max_depth, current_depth + 1 ) return tree_structure ``` 上述代码片段展示了如何基于输入数据集 `X_train`, `y_train` 和初始索引列表 `root_indices` 来启动递归式的决策树构造过程,并指定了最大允许深度为2。 #### 实际案例分析 以判断蘑菇是否可食为例,假设存在四个二元分类变量:“菌盖颜色(Cap Color)”、“柄形状(Stalk Shape)”、“单生(Solitary)” 及 “可食用性(Edible)”,其中前三个是用来预测目标标签“可食用性”的特征向量[^5]。通过对不同组合下的信息增益进行比较,能够找到最有利于区分两类结果的关键要素并以此为基础逐步建立起完整的决策路径结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值