美文网首页
机器学习-决策树

机器学习-决策树

作者: 阿凡提说AI | 来源:发表于2024-10-01 01:57 被阅读0次

决策树详解

决策树是一种监督学习算法,它通过学习一组数据来构建一个树形结构,以用于预测新数据的类别或值。它类似于人类进行决策的过程,通过一系列的判断问题,最终得到结论。

1. 决策树的结构

决策树由以下部分组成:

  • 根节点 (Root Node): 树的最顶端节点,代表所有数据样本。
  • 内部节点 (Internal Node): 除根节点和叶子节点外的节点,代表一个属性或特征,用于划分数据。
  • 分支 (Branch): 连接内部节点和子节点的线,代表属性取值的不同结果。
  • 叶子节点 (Leaf Node): 树的末端节点,代表预测结果的类别或值。

2. 决策树的构建过程

决策树的构建过程主要包含以下步骤:

  • 选择最佳划分属性: 选择一个属性来划分数据,将数据分成若干个子集。
  • 递归划分: 对每个子集重复步骤 1,直到满足停止条件。
  • 生成叶子节点: 当所有样本属于同一类别或满足其他停止条件时,生成叶子节点。

3. 选择最佳划分属性的标准

常用的属性选择标准有以下几种:

  • 信息增益 (Information Gain): 衡量属性划分后信息量减少的程度,选择信息增益最大的属性作为划分属性。
  • 基尼指数 (Gini Index): 衡量数据集中不纯度的程度,选择基尼指数最小的属性作为划分属性。
  • 熵 (Entropy): 衡量数据集中随机性的程度,选择熵值最小的属性作为划分属性。

4. 停止条件

常用的停止条件有以下几种:

  • 所有样本属于同一类别。
  • 所有属性都被使用。
  • 达到预定的树深度。
  • 样本数量小于预设阈值。

5. 决策树的优点

  • 易于理解和解释:决策树的结构清晰直观,易于理解和解释。
  • 对缺失值不敏感:决策树可以处理缺失值,不需要进行数据预处理。
  • 可以处理混合数据类型:决策树可以处理数值型和分类型数据。

6. 决策树的缺点

  • 对噪声数据敏感:决策树容易过拟合,对噪声数据比较敏感。
  • 对连续型属性处理不佳:决策树对连续型属性的处理方式比较简单,可能会导致信息损失。
  • 不稳定性:对训练数据的小变化,决策树可能会产生很大的变化。

7. 决策树的应用场景

决策树被广泛应用于各种机器学习任务中,例如:

  • 分类: 垃圾邮件过滤、情感分析、疾病诊断等。
  • 回归: 房价预测、股票价格预测等。
  • 数据挖掘: 客户细分、异常检测等。

8. 常用的决策树算法

  • ID3 (Iterative Dichotomiser 3): 使用信息增益作为属性选择标准。
  • C4.5: 使用信息增益率作为属性选择标准。
  • CART (Classification and Regression Trees): 使用基尼指数或熵作为属性选择标准。

9. 决策树的优缺点总结

优点 缺点
易于理解和解释 对噪声数据敏感
对缺失值不敏感 对连续型属性处理不佳
可以处理混合数据类型 不稳定性

总而言之,决策树是一种简单但有效的监督学习算法,它可以用于解决各种分类和回归问题。选择合适的属性选择标准和停止条件,以及使用剪枝技术来防止过拟合,可以提高决策树的性能。
下面是用 Python 实现决策树算法的代码,并包含注释解释。

import numpy as np
from collections import Counter

class DecisionTree:
    def __init__(self, criterion="gini", max_depth=None, min_samples_split=2):
        """
        初始化决策树模型。

        参数:
            criterion: 划分标准,可选 "gini" 或 "entropy",默认为 "gini"
            max_depth: 最大树深度,默认为 None (不限制)
            min_samples_split: 划分节点所需的最小样本数,默认为 2
        """
        self.criterion = criterion
        self.max_depth = max_depth
        self.min_samples_split = min_samples_split
        self.tree = None  # 存储决策树结构

    def fit(self, X, y):
        """
        训练决策树模型。

        参数:
            X: 训练数据特征,numpy 数组,形状为 (n_samples, n_features)
            y: 训练数据标签,numpy 数组,形状为 (n_samples,)
        """
        self.tree = self._build_tree(X, y)

    def predict(self, X):
        """
        对新数据进行预测。

        参数:
            X: 测试数据特征,numpy 数组,形状为 (n_samples, n_features)

        返回值:
            预测标签,numpy 数组,形状为 (n_samples,)
        """
        predictions = []
        for sample in X:
            prediction = self._predict_sample(sample, self.tree)
            predictions.append(prediction)
        return np.array(predictions)

    def _build_tree(self, X, y, depth=0):
        """
        递归构建决策树。

        参数:
            X: 当前节点的训练数据特征
            y: 当前节点的训练数据标签
            depth: 当前节点的深度

        返回值:
            决策树节点
        """

        # 停止条件
        if len(np.unique(y)) == 1 or depth == self.max_depth or len(y) < self.min_samples_split:
            return {"label": Counter(y).most_common(1)[0][0]}

        # 选择最佳划分属性
        best_feature = self._find_best_split(X, y)

        # 创建节点
        node = {"feature": best_feature}

        # 根据最佳划分属性划分数据
        for value in np.unique(X[:, best_feature]):
            X_subset = X[X[:, best_feature] == value]
            y_subset = y[X[:, best_feature] == value]
            node[value] = self._build_tree(X_subset, y_subset, depth + 1)

        return node

    def _find_best_split(self, X, y):
        """
        找到最佳划分属性。

        参数:
            X: 当前节点的训练数据特征
            y: 当前节点的训练数据标签

        返回值:
            最佳划分属性的索引
        """

        best_feature = None
        best_score = float("inf") if self.criterion == "gini" else float("-inf")

        # 遍历所有特征
        for feature in range(X.shape[1]):
            # 计算当前特征的划分分数
            score = self._calculate_split_score(X[:, feature], y)

            # 更新最佳划分属性和分数
            if (self.criterion == "gini" and score < best_score) or (self.criterion == "entropy" and score > best_score):
                best_feature = feature
                best_score = score

        return best_feature

    def _calculate_split_score(self, feature_values, y):
        """
        计算划分分数。

        参数:
            feature_values: 当前特征的值
            y: 当前节点的训练数据标签

        返回值:
            划分分数
        """

        if self.criterion == "gini":
            return self._gini_impurity(y) - self._weighted_gini_impurity(feature_values, y)
        else:
            return self._entropy(y) - self._weighted_entropy(feature_values, y)

    def _gini_impurity(self, y):
        """
        计算基尼不纯度。

        参数:
            y: 当前节点的训练数据标签

        返回值:
            基尼不纯度
        """

        counts = Counter(y)
        impurity = 1
        for count in counts.values():
            probability = count / len(y)
            impurity -= probability ** 2
        return impurity

    def _weighted_gini_impurity(self, feature_values, y):
        """
        计算加权基尼不纯度。

        参数:
            feature_values: 当前特征的值
            y: 当前节点的训练数据标签

        返回值:
            加权基尼不纯度
        """

        weighted_impurity = 0
        for value in np.unique(feature_values):
            y_subset = y[feature_values == value]
            weight = len(y_subset) / len(y)
            weighted_impurity += weight * self._gini_impurity(y_subset)
        return weighted_impurity

    def _entropy(self, y):
        """
        计算熵。

        参数:
            y: 当前节点的训练数据标签

        返回值:
            熵
        """

        counts = Counter(y)
        entropy = 0
        for count in counts.values():
            probability = count / len(y)
            entropy -= probability * np.log2(probability)
        return entropy

    def _weighted_entropy(self, feature_values, y):
        """
        计算加权熵。

        参数:
            feature_values: 当前特征的值
            y: 当前节点的训练数据标签

        返回值:
            加权熵
        """

        weighted_entropy = 0
        for value in np.unique(feature_values):
            y_subset = y[feature_values == value]
            weight = len(y_subset) / len(y)
            weighted_entropy += weight * self._entropy(y_subset)
        return weighted_entropy

    def _predict_sample(self, sample, node):
        """
        预测单个样本的类别。

        参数:
            sample: 测试样本特征
            node: 决策树节点

        返回值:
            预测类别
        """

        # 如果是叶子节点,返回类别
        if "label" in node:
            return node["label"]

        # 递归遍历决策树
        feature_value = sample[node["feature"]]
        return self._predict_sample(sample, node[feature_value])

使用方法:

# 导入必要的库
import numpy as np

# 创建训练数据
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
y = np.array([0, 0, 1, 1])

# 创建决策树分类器
dt_classifier = DecisionTree(criterion="gini", max_depth=2)

# 训练分类器
dt_classifier.fit(X, y)

# 创建测试数据
X_test = np.array([[1, 2, 3], [10, 11, 12]])

# 对测试数据进行预测
predictions = dt_classifier.predict(X_test)

# 打印预测结果
print(predictions)  # 输出:[0 1]

解释:

  • 代码首先定义了一个 DecisionTree 类,它包含了训练和预测决策树模型的方法。
  • fit 方法用于训练决策树模型,并使用 _build_tree 方法递归构建树结构。
  • _build_tree 方法会根据选择的划分标准递归地划分数据,直到满足停止条件。
  • predict 方法用于对新数据进行预测,使用 _predict_sample 方法递归遍历树结构,最终返回预测类别。
  • 代码中的示例展示了如何使用 DecisionTree 类进行训练和预测。

注意:

  • 该代码示例使用的是简单的数据集,实际应用中需要根据数据的具体情况进行调整。
  • 可以根据数据的类型选择不同的划分标准,例如信息增益、基尼指数、熵等。
  • 可以根据实际情况设置最大树深度、最小样本数等参数来防止过拟合。

相关文章

  • [机器学习]决策树

    决策树 @(技术博客)[机器学习, 决策树, python] 学习决策树首先要搞清楚决策树是什么(what),在弄...

  • 6.machine_learning_Decision_Tree

    1 机器学习决策树 1.1机器学习中的决策树模型 ① 树模型不用做scaling ② 树模型不太需要做离散化 ③ ...

  • 机器学习 | 决策树及若干基础问题

    决策树 1.构造决策树 学习决策树就是学习一系列if/else问题,是我们能够以最快的速度得到正确答案。在机器学习...

  • ID3、C4.5、CART决策树生成算法总结

    简介 决策树模型是最常见的机器学习方法之一,也是入门机器学习必须掌握的知识。决策树模型呈现树形结构,在分类问题中,...

  • 机器学习之决策树(Decision Tree)及其Python

    机器学习之决策树(Decision Tree)及其Python代码实现

  • 机器学习笔记(6):决策树

    本文来自之前在Udacity上自学机器学习的系列笔记。这是第6篇,介绍了监督学习中的决策树模型。 决策树 决策树是...

  • python决策树(二叉树、树)的可视化

    问题描述 在我学习机器学习实战-决策树部分,欲可视化决策树结构。最终可视化结果: 解决方案 决策树由嵌套字典组成,...

  • 决策树算法

    决策树 决策树也是经常使用的数据挖掘算法,其不用了解机器学习的知识,就能搞明白决策树是如何工作的。 决策树算法能够...

  • 决策树算法及python实现

    决策树算法是机器学习中的经典算法 1.决策树(decision tree) 决策树是一种树形结构,其中每个内部节点...

  • XGBoost算法

    吴恩达的机器学习视频已经不能满足我了,断断续续又学了一些其他常见的机器学习算法,这里整理出来 决策树 决策树(De...

网友评论

      本文标题:机器学习-决策树

      本文链接:https://www.haomeiwen.com/subject/jlelrjtx.html