使用Python中从头开始构建决策树算法

这篇具有很好参考价值的文章主要介绍了使用Python中从头开始构建决策树算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

决策树(Decision Tree)是一种常见的机器学习算法,被广泛应用于分类和回归任务中。并且再其之上的随机森林和提升树等算法一直是表格领域的最佳模型,所以本文将介绍理解其数学概念,并在Python中动手实现,这可以作为了解这类算法的基础知识。

使用Python中从头开始构建决策树算法,算法,python,决策树,机器学习

在深入研究代码之前,我们先要了解支撑决策树的数学概念:熵和信息增益

熵:杂质的量度

熵作为度量来量化数据集中的杂质或无序。特别是对于决策树,熵有助于衡量与一组标签相关的不确定性。数学上,数据集S的熵用以下公式计算:

 Entropy(S) = -p_pos * log2(p_pos) - p_neg * log2(p_neg)

P_pos表示数据集中正标签的比例,P_neg表示数据集中负标签的比例。

更高的熵意味着更大的不确定性或杂质,而更低的熵意味着更均匀的数据集。

信息增益:通过拆分提升知识

信息增益是评估通过基于特定属性划分数据集所获得的熵的减少。也就是说它衡量的是执行分割后标签确定性的增加。

数学上,对数据集S中属性a进行分割的信息增益计算如下:

 Information Gain(S, A) = Entropy(S) - ∑ (|S_v| / |S|) * Entropy(S_v)

S 表示原始数据集,A表示要拆分的属性。S_v表示属性A保存值v的S的子集。

目标是通过选择使信息增益最大化的属性,在决策树中创建信息量最大的分割。

在Python中实现决策树算法

有了以上的基础,就可以使用Python从头开始编写Decision Tree算法。

首先导入基本的numpy库,它将有助于我们的算法实现。

 import numpy as np

创建DecisionTree类

 class DecisionTree:
     def __init__(self, max_depth=None):
         self.max_depth = max_depth

定义了DecisionTree类来封装决策树。max_depth参数是树的最大深度,以防止过拟合。

 def fit(self, X, y, depth=0):
         n_samples, n_features = X.shape
         unique_classes = np.unique(y)
         
         # Base cases
         if (self.max_depth is not None and depth >= self.max_depth) or len(unique_classes) == 1:
             self.label = unique_classes[np.argmax(np.bincount(y))]
             return

拟合方法是决策树算法的核心。它需要训练数据X和相应的标签,以及一个可选的深度参数来跟踪树的深度。我们以最简单的方式处理树的生长:达到最大深度或者遇到纯类。

确定最佳分割属性,循环遍历所有属性以找到信息增益最大化的属性。_information_gain方法(稍后解释)帮助计算每个属性的信息增益。

 best_attribute = None
 best_info_gain = -1
 for feature in range(n_features):
             info_gain = self._information_gain(X, y, feature)
             if info_gain > best_info_gain:
                 best_info_gain = info_gain
                 best_attribute = feature

处理不分割属性,如果没有属性产生正的信息增益,则将类标签分配为节点的标签。

 if best_attribute is None:
             self.label = unique_classes[np.argmax(np.bincount(y))]
             return

分割和递归调用,下面代码确定了分割的最佳属性,并创建两个子节点。根据属性的阈值将数据集划分为左右两个子集。

 self.attribute = best_attribute
 self.threshold = np.median(X[:, best_attribute])
 
 left_indices = X[:, best_attribute] <= self.threshold
     right_indices = ~left_indices
 
     self.left = DecisionTree(max_depth=self.max_depth)
     self.right = DecisionTree(max_depth=self.max_depth)
 
     self.left.fit(X[left_indices], y[left_indices], depth + 1)
     self.right.fit(X[right_indices], y[right_indices], depth + 1)

并且通过递归调用左子集和右子集的fit方法来构建子树。

预测方法使用训练好的决策树进行预测。如果到达一个叶节点(带有标签的节点),它将叶节点的标签分配给X中的所有数据点。

 def predict(self, X):
         if hasattr(self, 'label'):
             return np.array([self.label] * X.shape[0])

当遇到非叶节点时,predict方法根据属性阈值递归遍历树的左子树和右子树。来自双方的预测被连接起来形成最终的预测数组。

 is_left = X[:, self.attribute] <= self.threshold
         left_predictions = self.left.predict(X[is_left])
         right_predictions = self.right.predict(X[~is_left])
         
         return np.concatenate((left_predictions, right_predictions))

下面两个方法是决策树的核心代码,并且可以使用不同的算法来进行计算,比如ID3 算法使用信息增益作为特征选择的标准,该标准度量了将某特征用于划分数据后,对分类结果的不确定性减少的程度。算法通过递归地选择信息增益最大的特征来构建决策树,也就是我们现在要演示的算法。

_information_gain方法计算给定属性的信息增益。它计算分裂后子熵的加权平均值,并从父熵中减去它。

 def _information_gain(self, X, y, feature):
         parent_entropy = self._entropy(y)
         
         unique_values = np.unique(X[:, feature])
         weighted_child_entropy = 0
         
         for value in unique_values:
             is_value = X[:, feature] == value
             child_entropy = self._entropy(y[is_value])
             weighted_child_entropy += (np.sum(is_value) / len(y)) * child_entropy
         
         return parent_entropy - weighted_child_entropy

熵的计算

 def _entropy(self, y):
         _, counts = np.unique(y, return_counts=True)
         probabilities = counts / len(y)
         return -np.sum(probabilities * np.log2(probabilities))

_entropy方法计算数据集y的熵,它计算每个类的概率,然后使用前面提到的公式计算熵。

常见的算法还有:

C4.5 是 ID3 的改进版本,C4.5 算法在特征选择时使用信息增益比,这是对信息增益的一种归一化,用于解决信息增益在选择特征时偏向于取值较多的特征的问题。

CART 与 ID3 和 C4.5 算法不同,CART(Classification And Regression Tree)又被称为分类回归树,算法采用基尼不纯度(Gini impurity)来度量节点的不确定性,该不纯度度量了从节点中随机选取两个样本,它们属于不同类别的概率。

ID3、C4.5 和 CART 算法都是基于决策树的经典算法,像Xgboost就是使用的CART 作为基础模型。

总结

以上就是使用Python中构造了一个完整的决策树算法的全部。决策树的核心思想是根据数据的特征逐步进行划分,使得每个子集内的数据尽量属于同一类别或具有相似的数值。在构建决策树时,通常会使用一些算法来选择最佳的特征和分割点,以达到更好的分类或预测效果。

https://avoid.overfit.cn/post/212f6b68e0d441c2b3db40304e637e32

作者:Matteo Possamai文章来源地址https://www.toymoban.com/news/detail-635501.html

到了这里,关于使用Python中从头开始构建决策树算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python机器学习决策树和SVM向量机算法实现红酒分类

    经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本,每个样本有13个特征,可以用于分类任务。 具体每个字段的含义如下: alcohol:酒精含量百分比 malic_acid:苹果酸含量(克/升) ash:灰分含量(克/升) alcalinity_of_ash:灰分碱度(以mEq/L为单位)

    2024年02月08日
    浏览(29)
  • python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

    特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串,将字符串转换为机器可以读懂的数字特征,才能让计算机理解该字符串(特征)表达的意义。 主要分为:字典特征提取(特征离散化)、文本特征提取(文章中特征词汇出现的频次)。 字典特

    2024年02月14日
    浏览(44)
  • 从头开始构建大语言模型(LLM)

    了解如何从头开始构建大语言模型,从而创建、训练和调整大语言模型! LLMs 在“从头开始构建大语言模型”中,你将了解如何从内到外LLMs工作。在这本富有洞察力的书中,畅销书作家塞巴斯蒂安·拉施卡 (Sebastian Raschka) 将指导您逐步创建自己的LLM阶段,并用清晰的文本、

    2024年02月01日
    浏览(30)
  • 机器学习 C4.5算法原理 + 决策树分裂详解(离散属性+连续属性) 附python代码

    一.C4.5算法的简介: C4.5并不是单单一个算法而是 一套算法 ,主要用于对机器学习和数据挖掘中的分类问题。它是一种有监督的学习,也就是说对于该算法我们需要 先给它们提供一个数据集 ,这个数据集包含多个实例,每个实例都包含多个属性,该实例用这些属性描述, 根

    2024年02月08日
    浏览(45)
  • 如何使用Python从零开始构建游戏

    作者:禅与计算机程序设计艺术 游戏开发是一个庞大的领域,其涉及到许多领域如数学、计算机图形学、音视频等等,本文只讨论游戏编程,不涉及到其他相关领域知识。 游戏编程可以分成以下几步: 游戏逻辑 渲染 物理引擎 AI 用户交互 游戏中可能会用到不同的技术或框架

    2024年02月08日
    浏览(32)
  • 从头开始机器学习:逻辑回归

            本篇实现线性回归的先决知识是:基本线性代数,微积分(偏导数)、梯度和、Python (NumPy);从线性方程入手,逐渐理解线性回归预测问题。

    2024年02月07日
    浏览(29)
  • 使用Python实现决策树算法

    决策树是一种常用的机器学习算法,它可以用于分类和回归任务。在本文中,我们将使用Python来实现一个基本的决策树分类器,并介绍其原理和实现过程。 决策树是一种基于树形结构的机器学习算法,它通过对输入数据进行逐步的判断和分割来构建一个预测模型。在决策树中

    2024年04月11日
    浏览(27)
  • python机器学习——分类模型评估 & 分类算法(k近邻,朴素贝叶斯,决策树,随机森林,逻辑回归,svm)

    交叉验证:为了让被评估的模型更加准确可信 交叉验证:将拿到的数据,分为训练和验证集。以下图为例:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。 通常情

    2024年02月03日
    浏览(52)
  • python机器学习(六)决策树(上) 构造树、信息熵的分类和度量、信息增益、CART算法、剪枝

    模拟相亲的过程,通过相亲决策图,男的去相亲,会先选择性别为女的,然后依次根据年龄、长相、收入、职业等信息对相亲的另一方有所了解。 通过决策图可以发现,生活中面临各种各样的选择,基于我们的经验和自身需求进行一些筛选,把判断背后的逻辑整理成结构图,

    2024年02月14日
    浏览(37)
  • Python小知识 - 【Python】如何使用Pytorch构建机器学习模型

    【Python】如何使用Pytorch构建机器学习模型 机器学习是人工智能的一个分支,它的任务是在已有的数据集上学习,最终得到一个能够解决新问题的模型。Pytorch是一个开源的机器学习框架,它可以让我们用更少的代码构建模型,并且可以让模型训练的过程更加简单。 首先,我们

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包