机器学习——决策树(Decision Tree)

目录

前言

一、决策树原理

二、决策树步骤

三、特征选择

1.信息熵

2.信息增益

3.基尼指数

四、剪枝优化

1.预剪枝

2.后剪枝

五、代码实现

总结


前言

决策树是一种常见的机器学习算法,用于解决分类和回归问题。它模仿了人类在做决策时的思维过程,通过构建一个树状结构来表示决策规则和预测结果。

决策树由节点和边组成。每个节点代表一个特征属性或一个判断条件,边表示不同的可能性。根节点是最开始的节点,表示整个数据集或子集。通过对特征属性进行测试,决策树将数据根据测试结果分割成不同的分支,直到达到叶节点,即最终的分类结果或回归值。

决策树的构建过程可以通过不同的算法实现,比如ID3、C4.5和CART等。这些算法会计算不同特征属性的信息增益或基尼指数,并选择最佳的属性作为划分依据。通过递归地构建决策树,可以得到一个具有预测能力的模型。

一、决策树原理

决策树是一种基于树形结构的分类和回归模型,它可以用来对数据进行分类或预测数值型变量的值。决策树的构建过程就是将原始数据集递归地划分成多个子集,直到所有子集都属于同一类别或不能再进行划分。

在构建决策树时,我们需要从所有的属性中选择一个最优的属性作为根节点,并将数据集按照这个属性进行划分成多个子集。然后对每个子集递归执行相同的操作,直到所有的子集都被划分到同一类别或不能再进行划分。这样就构建出了一棵决策树。

选择哪个属性作为根节点是一个重要的问题。我们通常采用信息熵、信息增益、基尼指数等指标来评估属性的重要性。信息熵是衡量数据的不确定性或混乱程度的指标,信息增益则是衡量使用某个属性作为划分依据能带来多少信息量的指标,基尼指数则是衡量数据的纯度或同一性的指标。选择哪个指标作为评估标准,取决于具体的应用场景。

二、决策树步骤

  1. 数据准备:首先,收集并准备用于构建决策树的数据集。确保数据集包含目标变量和与目标变量相关的特征属性。

  2. 特征选择:通过计算各个特征属性的指标(如信息熵、信息增益或基尼指数),选择最佳的特征作为根节点。这个特征应具有最大的信息增益或最小的基尼指数。

  3. 构建节点:将选定的特征作为根节点,并根据该特征的取值划分数据集为多个子集。

  4. 递归划分:对每个子集,重复步骤2和3,选择最佳的特征作为子集的根节点,并继续划分子集,直到达到停止条件。停止条件可以是子集属于同一类别、无法再进行划分或达到预定的树深度。

  5. 构建叶节点:当达到停止条件时,将子集划分成叶节点,即最终的分类结果或回归值。

  6. 剪枝优化:为了避免过拟合,可以对决策树进行剪枝操作。剪枝可以通过合并相邻的叶节点或删除一些不必要的分支来实现。剪枝操作可以基于验证集的性能指标进行选择。

  7. 预测与评估:使用构建好的决策树对新样本进行分类或回归预测,并评估模型的性能指标,比如准确率、召回率、均方误差等。

三、特征选择

1.信息熵

信息熵是信息论中的一个概念,用于衡量一组数据或信息的不确定性或混乱程度。它是由克劳德·香农在1948年提出的。

信息熵的计算公式为:

其中,H(X)表示随机变量X的信息熵,P(x)表示取值为x的概率。

信息熵的单位通常是比特(bit),表示对信息的平均压缩长度。当熵值越大时,数据集合的不确定性就越高,信息量也就越大。相反,当熵值越小时,数据集合的不确定性就越低,信息量也就越小。

决策树的每个节点都需要选择一个最佳的特征来进行分割。信息熵可以用来衡量每个特征的不确定性或混乱程度。通过计算每个特征的信息熵,可以选择信息熵减少最大的特征作为分割点,使得决策树能够更好地区分不同类别的数据。

2.信息增益

在构建决策树时,信息增益用来衡量一个特征对于分类任务的贡献程度,帮助选择最佳的特征作为分裂点。

信息增益是基于信息熵的概念而来的。信息熵用来衡量数据的不确定性或混乱程度,信息增益则用来衡量一个特征对于降低数据不确定性所带来的收益。

具体来说,假设有一个分类问题,数据集D包含n个样本,其中p个属于类别C1,n-p个属于类别C2。对于某个特征A,它的取值可以将数据集D划分为m个子集D1, D2, ..., Dm。每个子集Di包含ni个样本,其中pi个属于类别C1,ni-pi个属于类别C2。

则特征A对数据集D的信息增益Gain(A)定义如下:

其中,H(D)表示数据集D的信息熵,H(Di)表示子集Di的信息熵。

信息增益越大,说明特征A对于分类任务的贡献越大,选择该特征作为分裂点会使得决策树的分类性能更好。

3.基尼指数

基尼指数(Gini index)是用来衡量决策树中特征选择的标准之一。与信息增益类似,基尼指数也是用来评估一个特征对于分类任务的贡献程度。

基尼指数是在分类问题中使用的一种不纯度度量指标,它用来衡量随机选中的样本被错误分类到其他类别的概率。

对于一个分类问题,假设有K个类别,数据集D中属于第k类的样本的比例为pk(k=1,2,...,K)。则基尼指数Gini(D)的计算公式如下:

基尼指数越小,表示数据集D的纯度越高,即样本被正确分类的概率越大。因此,基尼指数可以作为一个特征对于分类任务的重要性度量。

在决策树算法中,选择基尼指数最小的特征作为分裂点,可以使得决策树的分类性能更好。与信息增益一样,基尼指数也可以用来选择最佳的特征进行分割,构建决策树模型。

四、剪枝优化

剪枝是决策树算法中的一种优化方法,用于避免决策树过拟合。过拟合指的是模型过度拟合训练数据,导致在新数据上的泛化能力下降。

决策树剪枝的目标是通过删除一些节点或子树,降低模型的复杂度,从而提高决策树的泛化能力。剪枝过程可以分为预剪枝和后剪枝两种方式。

1.预剪枝

预剪枝(Pre-pruning):在构建决策树的过程中,在划分节点之前进行剪枝操作。预剪枝通过设定停止条件来限制决策树的生长,如果满足停止条件,则直接将当前节点划分为叶节点,不再进行进一步划分。常见的停止条件包括:达到预定的树深度、样本数量低于阈值、信息增益或基尼指数低于阈值等。预剪枝简单有效,但可能会导致欠拟合,即模型无法充分利用训练数据的特征。

# 预剪枝
def fit(self, X, y, depth=0):
    # 终止条件1:叶节点最小样本数
    if len(y) < self.min_samples_leaf:
        label = Counter(y).most_common(1)[0][0]
        node = Node(label=label)
        return node
    # 终止条件2:达到最大深度
    if self.max_depth is not None and depth == self.max_depth:
        label = Counter(y).most_common(1)[0][0]
        node = Node(label=label)
        return node
    best_feature, best_gain = self.select_feature(X, y)
    # 终止条件3:无法继续降低信息熵
    if best_gain == 0:
        label = Counter(y).most_common(1)[0][0]
        node = Node(label=label)
        return node
    threshold = np.median(X[:, best_feature])
    left_idx = X[:, best_feature] < threshold
    right_idx = X[:, best_feature] >= threshold
    left_X, left_y = X[left_idx], y[left_idx]
    right_X, right_y = X[right_idx], y[right_idx]
    node = Node(feature=best_feature, threshold=threshold)
    node.left = self.fit(left_X, left_y, depth+1)
    node.right = self.fit(right_X, right_y, depth+1)
    self.root = node
    return node

2.后剪枝

后剪枝(Post-pruning):在构建完整的决策树之后,对决策树进行剪枝操作。后剪枝通过递归地从下往上对决策树进行剪枝,将一些节点转化为叶节点或合并相邻叶节点。剪枝操作的选择可以基于验证集的性能指标,如准确率、错误率、交叉熵等。常见的剪枝算法包括代价复杂度剪枝(Cost-Complexity Pruning)和悲观剪枝(Pessimistic Pruning)。后剪枝可以更充分地利用训练数据,但剪枝操作可能会导致局部最优解。

# 后剪枝
    def prune(self, X_val, y_val):
        self._prune(self.root, X_val, y_val)

    def _prune(self, node, X_val, y_val):
        if node.label is None:
            left_pred = self.predict(X_val[node.left])
            right_pred = self.predict(X_val[node.right])
            majority_label = Counter(y_val).most_common(1)[0][0]
            loss_no_prune = np.sum(y_val != majority_label)
            loss_prune = np.sum(y_val[node.left] != left_pred) + np.sum(y_val[node.right] != right_pred)
            if loss_prune <= loss_no_prune:
                node.left = None
                node.right = None
                node.label = majority_label
            else:
                self._prune(node.left, X_val, y_val)
                self._prune(node.right, X_val, y_val)

五、代码实现

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
 
 
iris = load_iris()
 
# 定义决策树模型
clf = DecisionTreeClassifier()
 
# 训练模型
clf.fit(iris.data, iris.target)
 
# 绘制决策树
plt.figure(figsize=(10, 6))
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=list(iris.target_names))
plt.show()

总结

决策树算法是一种基于树形结构的分类和回归方法,它通过构建决策树来预测目标变量的值。在决策树算法中,每个节点都代表一个特征,每个分支代表一个可能的取值,叶子节点代表一个目标变量的值。决策树算法可以处理离散型和连续型数据,并且可以处理缺失数据。决策树算法具有很好的可解释性和可视化性,可以帮助我们理解模型的决策过程。决策树算法容易出现过拟合的问题,需要进行剪枝和其他措施来避免过拟合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值