机器学习 第4章 决策树

基本流程

决策树的基本流程如下:

数据准备:收集并整理数据集,包括特征和目标变量。
选择划分特征:根据某种标准选择最优特征进行划分。
生成子树:对每个划分后的子集递归地重复上述步骤,直到满足停止条件(如所有样本属于同一类、达到最大深度、没有特征可用等)。
剪枝处理:对生成的决策树进行剪枝,以减少过拟合。
模型评估:使用测试集评估模型性能。

对于西瓜问题的一颗决策树,如下表示
在这里插入图片描述
从上至下依次判断某个西瓜的色泽、根蒂、敲声,若这三个属性都符合标准,则为好瓜,若任意一个属性不符合标准,则不是好瓜。
一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。
决策树遵循如下“分而自治”的流程策略
在这里插入图片描述

划分选择

信息增益:衡量通过某特征划分数据集后信息的不确定性减少。
I G ( D , A ) = H ( D ) − H ( D ∣ A ) IG(D, A) = H(D) - H(D|A) IG(D,A)=H(D)H(DA)其中,H(D)是是数据集D的熵,H(D|A) ) 是在特征A条件下的熵。
信息增益比:信息增益在特征的固有熵上的归一化,避免偏向于多值特征。
基尼指数:用于衡量数据集的不纯度,值越小表示数据集越纯。
G i n i ( D ) = 1 − ∑ i = 1 C p i 2 Gini(D) = 1 - \sum_{i=1}^{C} p_i^2 Gini(D)=1i=1Cpi2其中, p i p_i pi是类 ( i ) 在数据集 ( D ) 中的比例。

以下是使用 Python 的 sklearn 库构建决策树的示例:

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import matplotlib.pyplot as plt

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建决策树分类器
clf = DecisionTreeClassifier(criterion='gini')  # 可以选择'entropy'或'gini'
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 可视化决策树
plt.figure(figsize=(10, 8))
tree.plot_tree(clf, filled=True)
plt.title("Decision Tree Visualization")
plt.show()

决策树如下:
在这里插入图片描述

剪枝处理

剪枝是减少决策树复杂度的过程,主要分为两种类型:预剪枝和后剪枝

预剪枝

预剪枝:在树构建过程中,如果某个节点的划分不再显著提高模型性能,则停止划分。

后剪枝

后剪枝:先构建完整的决策树,然后通过交叉验证等方法去除不必要的节点。

对上面决策树进行后剪枝操作之后如下

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

# 创建完整的决策树
full_tree = DecisionTreeClassifier()
full_tree.fit(X_train, y_train)

# 交叉验证评估
scores = cross_val_score(full_tree, X, y, cv=5)
print("Cross-validated scores:", scores)

# 剪枝
pruned_tree = DecisionTreeClassifier(max_depth=3)  # 限制树的深度
pruned_tree.fit(X_train, y_train)

# 评估剪枝后的树
pruned_scores = cross_val_score(pruned_tree, X, y, cv=5)
print("Pruned tree cross-validated scores:", pruned_scores)

结果为:
在这里插入图片描述

连续与缺失值

连续值处理

决策树能够处理连续值特征,方法是寻找最佳的切分点。例如,将特征值分为两部分(小于某个值和大于等于某个值)。

缺失值处理

决策树可以通过以下几种方式处理缺失值:

忽略缺失值:在计算信息增益时忽略缺失值。
使用众数或平均值填充:在划分前用特征的众数或平均值填充缺失值。
分支处理:为缺失值单独创建一个分支。

多变量决策树

多变量决策树是指在每个节点上使用多个特征进行划分,而不仅仅是单一特征。这种方法可以在某些情况下提高模型的性能,但也可能导致更复杂的树结构。
在这里插入图片描述
对于上述在西瓜数据集2.0α上基于信息增益生成的决策树来说, 将它作为训练集可学得图4.10所示的决策树,这棵树所对应的分类边界如图 4.11所示。
在这里插入图片描述
在这里插入图片描述
以下是使用 sklearn 的 DecisionTreeClassifier,并通过 max_features 参数来实现多变量划分:

# 创建多变量决策树
multi_var_tree = DecisionTreeClassifier(max_features=2)  # 使用两个特征进行划分
multi_var_tree.fit(X_train, y_train)

# 预测与评估
multi_var_pred = multi_var_tree.predict(X_test)
multi_var_score = multi_var_tree.score(X_test, y_test)

print("Multi-variable Decision Tree Accuracy:", multi_var_score)

# 可视化多变量决策树
plt.figure(figsize=(10, 8))
tree.plot_tree(multi_var_tree, filled=True)
plt.title("Multi-variable Decision Tree Visualization")
plt.show()

结果如下:
在这里插入图片描述

总结

决策树是一种强大的模型,适用于分类和回归任务。通过选择合适的划分标准、剪枝策略以及处理连续和缺失值的方法,可以有效提升模型的性能。多变量决策树提供了一种灵活的方式来利用多个特征进行划分,从而提高预测能力。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值