百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

决策树一种像人脑一样工作的算法

toyiye 2024-06-21 12:24 10 浏览 0 评论

决策树是机器学习中最常用的算法之一,主要用于分类,也用于回归问题。每当我们在做出决定之前问自己一个问题时,我们的大脑就像决策树一样工作。例如:外面是阴天吗?如果是的话,我会带一把雨伞。

当训练数据集对变量进行分类时,决策树的思想是根据某个特征值将数据划分为更小的数据集,直到目标变量都属于一个类别。当人类的大脑决定根据经验(比如多云的天空)来选择“分裂特征”时,计算机根据最大的信息增益来分割数据集。让我们定义一个简单的问题,并进入一些计算,看看这到底意味着什么!

猫和狗数据集

假设我们想建立一个决策树来根据体重和身高来决定宠物是猫还是狗。我们可以根据这两个特征之一的某些值来划分这些数据点,例如:对于超过15磅的体重,我确信宠物是一只狗,至少根据这个非常简单的数据集。但是如果权重小于这个值,我的子集将包含两只猫和一只狗,所以我需要再次分割子集,直到只剩下一个类。换句话说,直到所有的子集都是pure。实际上,我为这些数据值绘制了一个决策树,如下所示:

决策树示例

每棵树都以一个根节点开始,即第一个分割。在不考虑太多的情况下,我们可以轻松地提出不同类型的根节点,以便在相同数量的步骤中将数据分成一个解决方案。但是计算机如何决定如何定义节点?当然,它会寻找最有效的方式,为了理解这是什么,我们需要引入Gini:“最常用的不等式测量”。该不等式是指节点后的每个子集中的目标类。因此,可以在每次拆分后计算,并且根据节点之后不等式的变化,我们也可以定义“信息增益”。

Gini的定义

为了计算Gini,我们考虑在节点之后找到每个类的概率,我们将这些值的平方加起来,然后从1中减去这个值。因此,当一个子集是pure(即它中只有一个类) ,基尼将为0,因为找到该类的概率确实是1!在那种情况下,我们说我们已经达到了叶子,因为在我们实现目标时不再需要分裂。但是如果我们看一下上面的图片,在False情况下的根节点之后,我们有一个包含3个观察的子集,其中2个是猫,1个是狗。如果我们想要计算该子集的基尼,我们有:

可用于计算类不等式的另一个度量标准是Entopy,而不是Gini。它们具有相同的目的,但熵的变化幅度略有不同; 但是,为此我们只会使用基尼。

根据我们选择的拆分策略,我们将为每个子集提供不同的Gini值,并且根据节点后的Gini值,我们可以定义信息增益:

信息增益的定义

这被定义为父母的基尼系数和孩子的基尼系数的加权平均值之间的差值。如果我们参考上面的例子,知道初始数据集的基尼系数仅应用定义就等于0.48,我们可以计算根节点后的信息增益(以15磅的权值分割):

根节点后的信息增益

然后,决策树将考虑所有可能的分裂并选择具有最高信息增益的分裂。事实上,让我们做一些编码,看看根据Python的决策树是什么!

通过运行下面的代码,我们从头开始构建数据框,并仅在几行中拟合模型。

注意:在训练模型之前训练/测试分裂是很好的做法,以防止过度拟合并且还要仔细检查这种模型对看不见的数据的执行情况。在这种情况下,我跳过了这一步,因为数据帧只包含少量观察。

Python代码如下:

from sklearn.tree import DecisionTreeClassifier
import pandas as pd
 
# create a matrix including the data
data = [[8,8,'dog'],[50,40,'dog'],[8,9,'cat'],[15,12,'dog'],[9,9.8,'cat']]
 
# generating a dataframe from the matrix 
df = pd.DataFrame(data, columns = ['weight','height','label'])
 
# defining predictors
X = df[['weight','height']]
 
# definig the target variable and mapping it to 1 for dog and 0 for cat
y = df['label'].replace({'dog':1, 'cat':0})
 
# instantiating the model
tree = DecisionTreeClassifier() 
 
# fitting the model
model = tree.fit(X,y)

重要的是要指出,在实例化时DecisionTreeClassifier,我没有在括号中指定任何参数。在处理非常大的数据集时,为了防止Tree失去控制和过度拟合,查看max_depth指定树的最大分割级别数非常有用。此外,设置max_features一个参数可以限制在搜索最佳拆分时要查看的预测变量的数量。此外,如果您希望树基于Entropy而不是Gini进行优化,则只需在实例化对象时进行编写criterion = 'entropy'。

我们建造了我们的模型 但那究竟是什么意思呢?决策树的美妙之处在于它易于解释,所以让我们绘制它!要运行下面的Python代码段,您可能需要先!pip install pydotplus pydot2在notebook中运行 。

from sklearn.externals.six import StringIO 
from sklearn.tree import export_graphviz
import pydotplus
from IPython.display import Image
 
 
dot_data = StringIO() 
 
export_graphviz(
 model, 
 out_file = dot_data, 
 filled=True, rounded=True, proportion=False,
 special_characters=True, 
 feature_names=X.columns,
 class_names=["cat", "dog"]
) 
 
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 
 
Image(graph.create_png()) 

这段Python代码的输出将是下图

在上面的“手工”决策树中,我选择了15磅的权重作为根节点,而算法决定在相同的变量上进行拆分,但值为12。这就创建了一个只有狗的叶子(对于重量大于12的,我们实际上有,gini = 0),根节点后的真实条件生成的子集在高度变量上进一步分裂为8.5。最后一次拆分生成了两个带有空gini值的纯子集。

以下是优缺点的简要列表:

优点

  • 这是可以解释的,特别是如果我们需要将我们的发现传达给非技术观众
  • 它可以很好地处理嘈杂或不完整的数据
  • 它可以用于回归和分类问题

缺点

  • 它可能不稳定,这意味着数据的微小变化可能会导致模型发生重大变化
  • 它倾向于过度拟合,这意味着低偏差但是方差很大:即使在训练数据得分很高的情况下,对看不见的数据也可能表现不佳

幸运的是,有许多技术可以处理过度拟合。通过使用bagging或boosting方法,我们可以从决策树的概念开始,通过使用随机森林分类器或AdaBoostClassifier等模型来开发更精确的分析。这两种都是ensamble方法,但是Random Forest通过boostrapping生成许多“新数据集”(即用替换对原始dataframe进行采样);它适用于每一个新的dataframe的树,并通过平均森林中的所有树来预测。Ada Boost是一种自适应树,它通过调整不正确的分类实例,同时始终使用相同的dataframe,从而从自身学习。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码