感谢Jack-Cui大佬的知识分享

机器学习专栏点击这里

目录

  • 感谢Jack-Cui大佬的知识分享
  • 0. 概述
  • 1. 使用决策树做预测需要以下过程:
  • 2. 决策树构建步骤
    • 2.1 特征选择
      • 2.1.1 熵(香农熵)
      • 2.1.2 代码:计算经验熵
      • 2.1.3 信息增益
      • 2.1.4 代码:计算信息增益
      • Series标签索引演示
    • 2.2 构建决策树---ID3算法
      • 2.2.1 代码构建决策树
    • 2.3 决策树存储和读取
    • 2.4 分类测试
  • 完整代码
  • 传送门
    • 代码相关

0. 概述

决策树(Decision Tree)是一种基本的分类与回归方法,其模型呈树状结构,在分类问题中,表示基于特征对实例进行分类的过程。本质上,决策树模型就是一个定义在特征空间与类空间上的 条件概率分布。决策树由 节点(node)和有向边(directed edge) 组成。节点有两种类型:内部节点(internal node)和叶节点(leaf node),内部节点表示一个特征或属性,叶节点表示一个类

利用决策树进行分类,从根节点开始,对实例的某一特征进行测试,根据测试结果将实例分配到其子节点;这时,每一个子节点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶节点。最后将实例分到叶节点的类中

可以把决策树看成一个if-then规则的集合,将 决策树转换成if-then规则的过程是 这样的:

  • 由决策树的根结点(root node)到叶结点(leaf node)的每一条路径构建一条规则;
  • 路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论。
  • 决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备。这就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。这里所覆盖是指实例的特征与路径上的特征一致或实例满足规则的条件。

1. 使用决策树做预测需要以下过程:

  • 收集数据:可以使用任何方法。比如想构建一个相亲系统,我们可以从媒婆那里,或者通过参访相亲对象获取数据。根据他们考虑的因素和最终的选择结果,就可以得到一些供我们利用的数据了。
  • 准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理。
  • 分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期
  • 训练算法:这个过程也就是构造决策树,同样也可以说是决策树学习,就是构造一个决策树的数据结构。
  • 测试算法:使用经验树计算错误率。当错误率达到了可接收范围,这个决策树就可以投放使用了。
  • 使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义

2. 决策树构建步骤

决策树学习(构建)通常包括三个步骤:特征选择、决策树的生成和决策树的修剪
构造决策树的数据必须要充足特征较少的数据集可能会导致决策树的正确率偏低。若数据特征充足但不会选择特征也会影响决策树的正确率。

2.1 特征选择

特征选择即决定用数据集中哪一个特征划分特征空间,主要在于选取对训练数据具有 分类能力的特征。不论一个数据集有多少特征,每次划分数据集时只能选一个特征,那么 第一次选择 哪个特征作为划分的参考属性才能将数据更快的分类呢?通常特征选择的标准是 信息增益(information gain)或信息增益比,信息增益越大,对应的特征其分类效果越好

2.1.1 熵(香农熵)

在计算信息增益之前,需要先知道"熵"这个概念。熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量,一句通俗的话讲就是这个体系的混乱程度是如何的。
假设有一个样本为N的数据集,第 i 类样本为 xi,如果待分类的事务可能划分在 多个分类 之中,则符号 xi的信息 定义为

其中 p(xi)是选择该分类的概率。通过改变 i 的值即可获得数据集中所有类别的信息。

为了 计算熵,我们需要计算所有类别所有可能值包含的信息期望值(数学期望),通过下面的公式得到:

熵越高,变量的不确定性越大,也就是数据的混合程度越高

当熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵称为 经验熵(empirical entropy)

2.1.2 代码:计算经验熵

import numpy as np
import pandas as pd
"""
函数说明: 创建数据集
Parameters:无
Returns:DataSet -- 表格型数据集年龄:0代表青年,1代表中年,2代表老年;有工作:0代表否,1代表是;有自己的房子:0代表否,1代表是;信贷情况:0代表一般,1代表好,2代表非常好;类别(是否给贷款):no代表否,yes代表是。
"""
def CreatDataset():dataSet = [[0, 0, 0, 0, 'no'],         #数据集[0, 0, 0, 1, 'no'],[0, 1, 0, 1, 'yes'],[0, 1, 1, 0, 'yes'],[0, 0, 0, 0, 'no'],[1, 0, 0, 0, 'no'],[1, 0, 0, 1, 'no'],[1, 1, 1, 1, 'yes'],[1, 0, 1, 2, 'yes'],[1, 0, 1, 2, 'yes'],[2, 0, 1, 2, 'yes'],[2, 0, 1, 1, 'yes'],[2, 1, 0, 1, 'yes'],[2, 1, 0, 2, 'yes'],[2, 0, 0, 0, 'no']]labels = ['年龄', '有工作', '有自己的房子', '信贷情况','是否给贷款']     #分类属性#矩阵转化DataframeDataSet = pd.DataFrame(dataSet,columns=labels)return DataSet
"""
函数说明:计算给定数据集的经验熵(香农熵)Parameters:DataSet - 数据集
Returns:Ent - 经验熵(香农熵)
"""
def calcShannonEnt(DataSet):# Series 线性的数据结构, series是一个一维数组Loan_type = DataSet['是否给贷款'].value_counts()  # type:<class 'pandas.core.series.Series'># print(Loan_type[0]) # yes    9 ;no     6  # 实质就是[9,6]#获取样本个数Nums = DataSet.shape[0] #  (15, 5)#每个分类的概率,即 P(xi)P = Loan_type/Nums#计算熵值Ent = (-P*np.log2(P)).sum()return Entdef main():DataSet=CreatDataset()print(DataSet)Ent=calcShannonEnt(DataSet)print('经验熵H(D):%f' % Ent)if __name__ == "__main__":main()

运行结果:

2.1.3 信息增益

由介绍已知,根据信息增益选择特征。也就是说,信息增益是相对于特征而言的,信息增益越大,特征对最终的分类结果影响也就越大,我们就应该选择对最终分类结果影响最大的那个特征作为我们的初始分类特征。

信息增益的计算 就是将父节点的熵减去其下所有子节点的熵之和,并且在求和时,由于类别比重不同,需要对其实现加权平均。

在讲解信息增益定义之前,我们还需要明确一个概念:条件熵
条件熵 H(Y|X) 表示在已知随机变量X的条件下随机变量Y的不确定性,随机变量X给定的条件下随机变量Y的条件熵(conditional entropy) H(Y|X),定义X给定条件下 Y的条件概率分布的熵 对X 的数学期望:

当熵和条件熵中的概率由极大似然估计得到时,所对应的熵和条件熵分别称为检验熵(empirical entropy)和经验条件熵(empirical conditional entropy).

熵可以用来表示数据集的不确定性,熵越大,则数据集的不确定性越大。因此使用划分前后数据集熵的差值度量使用当前特征对于数据集进行划分的效果(类似于深度学习的代价函数)。对于待划分的数据集D,其划分前的数据集的熵是一定的 H(D),但是划分之后的熵 H(D|A) 是不定的,H(D|A) 越小说明使用此特征划分得到的子集的不确定性越小(也就是纯度越高)。因此 H(D)-H(D|A) 越大,说明使用当前特征划分数据集时,纯度上升的更快

2.1.4 代码:计算信息增益

'''
函数说明:按照给定特征划分数据集Parameters:DataSet -- 数据集col -- 选择需要分割的特征axis -- 分割特征值
Returns:ReData -- 分割后的数据集
'''
def Split(DataSet,col,axis):ReData=DataSet[DataSet.iloc[:,col]==axis]return ReData
'''
函数说明:根据各特征的信息增益,选择最优初始特征Parameters:DataSet:数据集
Returns:Bestfeature:增益最大的(最优)特征的索引值
'''
def ChooseBestFeature(DataSet):Nums = DataSet.shape[1] #  (15, 5)# 用于存放各特征的信息熵H=np.zeros(Nums-1)# 1.计算经验熵(香农熵)AllEnt=calcShannonEnt(DataSet,-1)for col in range(Nums-1): ent=0for axis in range(3):# 2.按特征分割数据:创建函数 Split() redata=Split(DataSet,col,axis)if len(redata.values) == 0: # 判断返回的数据是否为空breakelse:# 统计特征的各类别的个数Loan_type = DataSet.iloc[:,col].value_counts()# print(Loan_type[1])ent += Loan_type[axis]/sum(Loan_type)*calcShannonEnt(redata,-1)# 3.计算各特征的信息熵H[col]=AllEnt-ent  Bestfeature = np.argmax(H)print('各特征信息增益: ',H)print('最优特征索引值: %d' % np.argmax(H))print('对应特征为: ',DataSet.columns[Bestfeature])return Bestfeature

运行结果

Series标签索引演示


2.2 构建决策树—ID3算法

ID3算法的核心是在决策树各个结点上根据对应 信息增益准则 选择特征,递归地构建决策树
具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。

根据上部分求得的结果,由于特征A3(有自己的房子)的信息增益值最大,所以选择特征A3作为根结点的特征。它将训练集D划分为两个 子集D1(A3取值为”是”)和D2(A3取值为”否”) 。由于D1只有同一类的样本点,所以它成为一个叶结点,结点的类标记为“是”,信息如下:可以发现有房子就可以贷款,即不用继续向下分

对D2则需要从特征A1(年龄),A2(有工作)和A4(信贷情况)中选择新的特征,计算各个特征的信息增益:

  • g(D2,A1) = H(D2) - H(D2 | A1) = 0.251
  • g(D2,A2) = H(D2) - H(D2 | A2) = 0.918
  • g(D2,A3) = H(D2) - H(D2 | A3) = 0.474

根据计算,选择信息增益最大的特征A2(有工作)作为结点的特征。由于A2有两个可能取值,从这一结点引出两个子结点:一个对应”是”(有工作)的子结点,包含3个样本,它们属于同一类,所以这是一个叶结点,类标记为”是”;另一个是对应”否”(无工作)的子结点,包含6个样本,它们也属于同一类,所以这也是一个叶结点,类标记为”否”。 这样就生成了一个决策树,该决策树只用了两个特征(有两个内部结点),生成的决策树如下图所示。

2.2.1 代码构建决策树

我们 使用字典存储决策树的结构,比如上小节我们分析出来的决策树,用字典可以表示为:

{'有自己的房子': {0: {'有工作': {0: 'no', 1: 'yes'}}, 1: 'yes'}}

在构造决策树之前,先回顾一下前几个子模块的工作原理:先获取原始数据集,然后基于最优特征划分数据集,当数据集特征大于两个时,第一次划分之后,数据将被向下传递至树的下一个节点,在这个节点上,在此划分数据, 此过程是利用递归原理处理数据集。什么时候划分结束呢? 当程序遍历完所有划分数据集的属性,或者 每个分支下所有实例分类一致 时代表划分数据集结束。而构造决策树的过程就是将每一次划分出的数据填入一个字典中,当数据集划分结束时,向字典中填充数据也结束,此过程也是一个递归过程,至此决策树的构造完成。

创建 函数majorityCnt统计classList中出现此处最多的元素(类标签),创建函数createTree用来递归构建决策树。编写代码如下:

'''
函数说明: 创建决策树Parameters:DataSet -- 数据集
Returns:Tree -- 决策树(字典形式)
'''
def CreateTree(DataSet):# featurelabels=[] # 用于存放最优特征# 获取所有特征标签index_list = list(DataSet.columns) # ['年龄', '有工作', '有自己的房子', '信贷情况', '是否给贷款']# 获取最后一列(分类标签)的类别# value_counts () 返回的序列默认是降序的label_series = DataSet.iloc[:,-1].value_counts()  # yes:9 , no: 6# 判断是否继续可分:# 1、判断类别标签(最多一个)是否等于数据样本数 # 2、数据集是否只有一列 if label_series[0]==DataSet.shape[0] or DataSet.shape[1] == 1:return label_series.index[0] #返回类标签 # 选择最优特征和最优特征标签bestfeatureindex,bestfeaturelabel= ChooseBestFeature(DataSet)# featurelabels.append(bestfeaturelabel)Tree={bestfeaturelabel:{}}# 删除已经使用特征标签del(index_list[bestfeatureindex]) # 得到训练集中所有最优特征的属性值value_list = set(DataSet.iloc[:,bestfeatureindex])# 遍历特征,创建决策树for value in value_list:newdataset=Split(DataSet,bestfeatureindex,value)Tree[bestfeaturelabel][value] = CreateTree(newdataset)return Tree

运行结果:

{'有自己的房子': {0: {'有工作': {0: 'no', 1: 'yes'}}, 1: 'yes'}}

2.3 决策树存储和读取

构造决策树是很耗时的任务,即使处理很小的数据集,如前面的样本数据,也要花费几秒的时间,如果数据集很大,将会耗费很多计算时间。然而用创建好的决策树解决分类问题,则可以很快完成。因此,为了节省计算时间,最好能够在每次执行分类时调用已经构造好的决策树。为了解决这个问题,需要使用Python模块pickle序列化对象。序列化对象可以在磁盘上保存对象,并在需要的时候读取出来。

"""
函数说明:存储决策树Parameters:inputTree - 已经生成的决策树filepath - 决策树的存储文件路径
Returns:无
"""
def StoreTree(inputTree, filepath):with open(filepath, 'wb') as fw:pickle.dump(inputTree, fw)
"""
函数说明:读取决策树Parameters:filepath- 决策树的存储文件名
Returns:pickle.load(fr) - 决策树字典
"""
def GrabTree(filepath):fr = open(filepath, 'rb')return pickle.load(fr)

2.4 分类测试

依靠训练数据构造了决策树之后,我们可以将它用于实际数据的分类。在执行数据分类时,需要决策树以及用于构造树的标签向量。然后,程序比较测试数据与决策树上的数值,递归执行该过程直到进入叶子结点;最后将测试数据定义为叶子结点所属的类型。
在构建决策树的代码,可以看到,有个 featLabels参数。它是用来干什么的?它就是用来记录各个分类结点的,在用决策树做预测的时候,我们按顺序输入需要的分类结点的属性值即可
举个例子,比如我用上述已经训练好的决策树做分类,那么我只需要提供这个人是否有房子,是否有工作这两个信息即可,无需提供冗余的信息。

'''
函数说明: 决策树分类Parameters:mytree --决策树featLabels -- 最优特征标签testVec -- 测试数据
Returns:result -- 分类结果
'''
def Classify(mytree,featLabels,testVec):# 获取根节点# iter 将 dic 转换成 迭代器(iterator),迭代器有 next 方法root_node = next(iter(mytree)) # 取下一个节点(子节点):字典形式 secondDict = mytree[root_node]  # {0: {'有工作': {0: 'no', 1: 'yes'}}, 1: 'yes'}featIndex = featLabels.index(root_node) # 0# 遍历字典中的 key : 0 1                                              for key in secondDict.keys():# 判断特征,选择流向if testVec[featIndex] == key: # 判断是否到达叶节点if type(secondDict[key]).__name__ == 'dict': result = Classify(secondDict[key], featLabels, testVec)else: result = secondDict[key]return result

结果:放贷

完整代码

import numpy as np
import pandas as pd
from math import log # 默认底数为e
import pickle"""
函数说明:存储决策树Parameters:inputTree - 已经生成的决策树filepath - 决策树的存储文件路径
Returns:无
"""
def StoreTree(inputTree, filepath):with open(filepath, 'wb') as fw:pickle.dump(inputTree, fw)
"""
函数说明:读取决策树Parameters:filepath - 决策树的存储文件名
Returns:pickle.load(fr) - 决策树字典
"""
def GrabTree(filepath):fr = open(filepath, 'rb')return pickle.load(fr)
"""
函数说明: 创建数据集
Parameters:无
Returns:DataSet -- 表格型数据集年龄:0代表青年,1代表中年,2代表老年;有工作:0代表否,1代表是;有自己的房子:0代表否,1代表是;信贷情况:0代表一般,1代表好,2代表非常好;类别(是否给贷款):no代表否,yes代表是。
"""
def CreatDataset():dataSet = [[0, 0, 0, 0, 'no'],         #数据集[0, 0, 0, 1, 'no'],[0, 1, 0, 1, 'yes'],[0, 1, 1, 0, 'yes'],[0, 0, 0, 0, 'no'],[1, 0, 0, 0, 'no'],[1, 0, 0, 1, 'no'],[1, 1, 1, 1, 'yes'],[1, 0, 1, 2, 'yes'],[1, 0, 1, 2, 'yes'],[2, 0, 1, 2, 'yes'],[2, 0, 1, 1, 'yes'],[2, 1, 0, 1, 'yes'],[2, 1, 0, 2, 'yes'],[2, 0, 0, 0, 'no']]labels = ['年龄', '有工作', '有自己的房子', '信贷情况','是否给贷款']     #分类属性#矩阵转化DataframeDataSet = pd.DataFrame(dataSet,columns=labels)return DataSet
"""
函数说明:计算给定数据集的经验熵(香农熵)Parameters:DataSet - 数据集i -- 特征索引值
Returns:Ent - 经验熵(香农熵)
"""
def calcShannonEnt(DataSet,i):# Series 线性的数据结构, series是一个一维数组Loan_type = DataSet.iloc[:,i].value_counts()  # type:<class 'pandas.core.series.Series'># print(Loan_type[0]) # yes    9 ;no     6  # 实质就是[9,6]#获取样本个数Nums = DataSet.shape[0] #  (15, 5)#每个分类的概率,即 P(xi)P = Loan_type/Nums#计算熵值Ent = (-P*np.log2(P)).sum()return Ent
'''
函数说明:按照给定特征划分数据集Parameters:DataSet -- 数据集col -- 选择需要分割的特征axis -- 分割特征值
Returns:ReData -- 分割后的数据集
'''
def Split(DataSet,col,axis):ReData=DataSet[DataSet.iloc[:,col]==axis]return ReData
'''
函数说明:根据各特征的信息增益,选择最优初始特征Parameters:DataSet:数据集
Returns:BestfeatureIndex:增益最大的(最优)特征的索引值BestfeatureLabel:最优特征标签
'''
def ChooseBestFeature(DataSet):Nums = DataSet.shape[1] #  (15, 5)# 用于存放各特征的信息熵H=np.zeros(Nums-1)# 计算经验熵(香农熵)AllEnt=calcShannonEnt(DataSet,-1)#print(AllEnt)for col in range(Nums-1): ent=0for axis in range(3):# 按特征分割数据:创建函数 Split() redata=Split(DataSet,col,axis)if len(redata.values) == 0: # 判断返回的数据是否为空breakelse:# print(DataSet.columns[col],'\n',redata)# 统计特征的各类别的个数Loan_type = DataSet.iloc[:,col].value_counts()# print(Loan_type[1])ent += Loan_type[axis]/sum(Loan_type)*calcShannonEnt(redata,-1)# 3.计算各特征的信息熵H[col]=AllEnt-ent  BestfeatureIndex = np.argmax(H)BestfeatureLabel = DataSet.columns[BestfeatureIndex]# print('各特征信息增益: ',H)# print('最优特征索引值: %d' % np.argmax(H))# print('对应特征为: ',DataSet.columns[Bestfeature])return BestfeatureIndex,BestfeatureLabel
'''
函数说明: 创建决策树Parameters:DataSet -- 数据集
Returns:Tree -- 决策树(字典形式)
'''
def CreateTree(DataSet,featurelabels):# 获取所有特征标签index_list = list(DataSet.columns) # ['年龄', '有工作', '有自己的房子', '信贷情况', '是否给贷款']# 获取最后一列(分类标签)的类别# value_counts () 返回的序列默认是降序的label_series = DataSet.iloc[:,-1].value_counts()  # yes:9 , no: 6# 判断是否继续可分:# 1、判断类别标签(最多一个)是否等于数据样本数 # 2、数据集是否只有一个特征if label_series[0]==DataSet.shape[0] or DataSet.shape[1] == 1:return label_series.index[0] #返回类标签 # 最优特征索引值bestfeatureindex,bestfeaturelabel= ChooseBestFeature(DataSet)# 最优特征标签featurelabels.append(bestfeaturelabel)# 决策树形式Tree={bestfeaturelabel:{}}# 删除已经使用特征标签del(index_list[bestfeatureindex]) # 得到训练集中所有最优特征的属性值value_list = set(DataSet.iloc[:,bestfeatureindex])# 遍历特征,创建决策树for value in value_list:newdataset=Split(DataSet,bestfeatureindex,value)Tree[bestfeaturelabel][value] = CreateTree(newdataset,featurelabels)return Tree
'''
函数说明: 决策树分类Parameters:mytree --决策树featLabels -- 最优特征标签testVec -- 测试数据
Returns:result -- 分类结果
'''
def Classify(mytree,featLabels,testVec):# 获取根节点# iter 将 dic 转换成 迭代器(iterator),迭代器有 next 方法root_node = next(iter(mytree)) # 取下一个节点(子节点):字典形式 secondDict = mytree[root_node]  # {0: {'有工作': {0: 'no', 1: 'yes'}}, 1: 'yes'}featIndex = featLabels.index(root_node) # 0# 遍历字典中的 key : 0 1                                              for key in secondDict.keys():# 判断特征,选择流向if testVec[featIndex] == key: # 判断是否到达叶节点if type(secondDict[key]).__name__ == 'dict': result = Classify(secondDict[key], featLabels, testVec)else: result = secondDict[key]return resultdef main():save_path='classifierStorage.txt' # 根据个人情况设置路径# 用于存放最优特征,即分类所需特征featurelabels=[]   # 用于对应测试数据索引DataSet=CreatDataset()# Ent=calcShannonEnt(DataSet,-1) # -1 取最后一列,即分类结果# bestfeature=ChooseBestFeature(DataSet)Tree=CreateTree(DataSet,featurelabels)# 存储决策树# StoreTree(Tree,save_path)# mytree=GrabTree(save_path)result=Classify(Tree,featurelabels,[0,1])if result == 'yes':print('放贷')if result == 'no':print('不放贷')if __name__ == "__main__":main()

传送门

决策树(Decision Tree)
机器学习笔记(三)——搞懂决策树必备的信息增益
机器学习笔记(四)——决策树的构建及可视化
决策树ID3的实现-python

代码相关

Pandas-DataFrame基础知识点总结
python数据分析之pandas里的Series
Series下标索引、标签索引、切片索引、布尔型索引
python中count()、values_counts()、size()函数
Pandas | 频数统计很简单,但这5 种技巧你使用过吗?-- .value_counts()
python获得list或numpy数组中最大元素对应的索引
Python中的next()\iter()函数详解

机器学习----监督学习算法之决策树(Decision Tree)相关推荐

  1. 【机器学习实验二】决策树(Decision Tree)及其在图像识别任务上的应用

    经典有监督学习算法:决策树(Decision Tree) --本篇博客的决策树算法以及实验仅针对分类问题 文章目录 经典有监督学习算法:决策树(Decision Tree) 1.算法简介 2.算法思想 ...

  2. 算法杂货铺——分类算法之决策树(Decision tree)

    算法杂货铺--分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 88978 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别 ...

  3. 算法杂货铺——分类算法之决策树(Decision tree) - T2噬菌体

    3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法.这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断.在这一篇文章中,将讨论另一种被广泛使用的分类算 ...

  4. 机器学习算法实践:决策树 (Decision Tree)(转载)

    前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...

  5. [机器学习笔记] (四)决策树 Decision Tree

    (四)决策树 Decision Tree 基本概念 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性 ...

  6. Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)

    Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...

  7. 决策树分类python代码_分类算法-决策树 Decision Tree

    决策树(Decision Tree)是一个非参数的监督式学习方法,决策树又称为判定树,是运用于分类的一种树结构,其中的每个内部节点代表对某一属性的一次测试,每条边代表一个测试结果,叶节点代表某个类或类 ...

  8. 决策树Decision Tree+ID3+C4.5算法实战

    决策树Decision Tree 决策树的三种算法: 举个栗子: 熵entropy的概念: 信息熵越大,不确定性越大.信息熵越小,不确定性越小. 其实就是排列组合之中的概率,概率相乘得到其中一个组合, ...

  9. 第六章.决策树(Decision Tree)—CART算法

    第六章.决策树(Decision Tree) 6.2 CART算法 CART决策树的生成就是递归地构建二叉决策树的过程.CART用基尼(Gini)系数最小化准则来进行特征选择,生成二叉树. 1.Gin ...

最新文章

  1. 能详细地讲讲stm32该怎么学吗?
  2. 一键清理 Nexus 中无用的 Docker 镜像
  3. sw运行很卡怎么办_windows10系统SolidWorks运行速度很慢如何解决
  4. 作业 20181016-10 每周例行报告
  5. 康托展开式---我排第几+逆康托展开
  6. openpyxl 绘制饼形图_openpyxl3.0官方文档(13)—— 饼图
  7. java bean jsp_JavaBean与Jsp
  8. java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象
  9. jquery无法找到其他父级子集解决方法
  10. linux在生活中的应用例子,LINUX操作系统在教师学生日常生活中的应用(全).docx
  11. 大学计算机应用基础模拟试题,《大学计算机应用基础》模拟试题.doc
  12. matlab中输出汉字的函数,matlab中的输出显示函数
  13. 计算机 运行新ie 命令,怎样修复ie浏览器-运行什么命令可以修复IE浏览器,请说的详细 – 手机爱问...
  14. word行首空格下划线_word空格处加下划线 word空格处下划线
  15. 用C语言:由键盘输入一个点的坐标,要求编程判断该点是否在单位圆上,如果在单位圆上则输出Y,不在单位圆上则输出N。使用小数点后3位精度进行判断。
  16. 6.9对一个工作簿中的所有工作表分别求和并将求和结果写入固定单元格
  17. Unreal Engine蓝图编程学习(四)
  18. OpenGLES 3.0
  19. 解决 chrome 37 之后 flash 版本过低问题
  20. javaweb出现HTTP500的可能问题的解决方案

热门文章

  1. cxf-2.4.1 webservice客户端调用代码
  2. 【转】[FPGA博客大赛](updated)在xilinx的FPGA系统中scanf函数的使用
  3. 数据库系统原理教程-作业
  4. Q73:蒙特•卡罗积分(Monte Carlo Integration)
  5. 7-2 搜索树判断 (25 分)
  6. MVC和MTV初步认识+django的一个简单应用(萌新交流互动,欢迎大家指出错误)
  7. python字符串常用函数-Python字符串常用函数详解
  8. Python爬虫之(二)工具的使用
  9. 聚类 | Map-Equation多级网络聚类模型——InfoMap
  10. Django数据库连接丢失问题