《机器学习实战》——决策树

原理(ID3):

依次选定每个特征,计算信息增益(基本信息熵-当前信息熵),选择信息增益最大的一个作为最佳特征;

以该特征作为树的根节点,以该最佳特征的每一个值作为分支,建立子树;

重复上述过程,直到:1) 所有类别一致 2) 特征用尽

优点:

简单容易理解;

可处理有缺失值的特征、非数值型数据;

与训练数据拟合很好,复杂度小

缺点:

选择特征时候需要多次扫描与排序,适合常驻内存的小数据集;

容易过拟合;

改进:

ID3算法偏向取值较多的特征(宽且浅的树),适合离散型数据,难处理连续型数据。香农熵里面概率的统计根本上是在统计不同分类的概率。

C4.5用信息增益比筛选特征,分母为-∑p*log(p), p为: 特征A某个取值包含的数据行数/总数据行数,可处理缺失值和连续型数据

CART用Gini系数筛选特征。同时是二叉决策树,能处理离散特征、连续特征、分类问题、回归问题。

Gini系数(杂质度量法):Gini(A)=1-∑(Pk)2. Pk表示观测点中k类的概率,当Gini(A)=0时只有一类,当所有类同概率出现时最大Gini(A)=(C-1)C/2。

如果目标变量是标称的,并且是具有两个以上的类别,则CART可能考虑将目标类别合并成两个超类别(双化);
如果目标变量是连续的,则CART算法找出一组基于树的回归方程来预测目标变量。

事后剪枝,停止条件是:1) 样本个数小于预定阀值 2) 样本的Gini系数小于预定阀值 3)没有更多特征

代码:

 1 #coding: utf-8
 2 from __future__ import division
 3 from numpy import *
 4
 5
 6 class myClass(object):
 7     def __init__(self):
 8         group, labels = self.loadData()
 9         myTree = self.createTree(group, labels)
10         print myTree
11
12     def loadData(self):
13         group = [[1,1,"yes"],
14                 [1,1,"yes"],
15                 [1,0,"no"],
16                 [0,1,"no"],
17                 [0,1,"no"],
18                 ]
19         labels = ["no surfacing", "flippers"]     # 表示特征的含义:海洋生物不露出水面是否可以生存,是否有脚蹼
20         return group, labels
21
22     def calShannonEnt(self, group):
23         numEntrories = len(group)
24         labelCount = dict()
25         for feaVec in group:
26             currentLabel = feaVec[-1]
27             labelCount[currentLabel] = labelCount.get(currentLabel, 0) + 1
28         shannonEnt = 0.0                            # 用之前定义
29         for key in labelCount.keys():
30             prob = labelCount[key]/numEntrories
31             shannonEnt -= prob * log(prob)
32         return shannonEnt
33
34     def splitDataSet(self, group, axis, value):     # 特征所有取值的信息熵之和才有意义,这里只计算条件熵。
35         retDataSet = []
36         for feaVec in group:
37             if feaVec[axis] == value:
38                 retDataSet.append(feaVec[:axis] + feaVec[axis+1:])
39         return retDataSet
40
41     def chooseBestFeature(self, group):
42         numFeatures = len(group[0]) - 1
43         baseEntrory = self.calShannonEnt(group)
44         bestInfoGain = 0.0; bestFeature = -1
45         for i in range(numFeatures):
46             uniqueVals = set([it[i] for it in group])
47             newEntrory = 0.0
48             for value in uniqueVals:
49                 subGroup = self.splitDataSet(group, i, value)
50                 prob = len(subGroup)/len(group)
51                 newEntrory += prob * self.calShannonEnt(subGroup)
52             infoGain = baseEntrory - newEntrory
53             if (infoGain > bestInfoGain):
54                 bestInfoGain = infoGain; bestFeature = i
55         return bestFeature
56
57     def majority(self, classList):
58         classCountDict = {}
59         for vote in classList:
60             classCountDict[vote] = classCountDict.get(vote, 0) + 1
61         return sorted(classCountDict.items(), key = lambda x:x[1], reverse = True)[0][0]
62
63     def createTree(self, myGroup, labels):
64         # 1.两个终止条件; 2.建立根树(求得最佳根特征)并从labels中删除根标签(取得根标签); 3.根据根特征的每个值建立子树(取得唯一特征值)
65         classList = [it[-1] for it in myGroup]
66         if classList.count(classList[0]) == len(classList):
67             return classList[0]
68         if len(myGroup[0]) == 1:
69             return self.majorityCnt(classList)
70         rootFeature = self.chooseBestFeature(myGroup)
71         rootLabel = labels[rootFeature]
72         myTree = {rootLabel:{}}
73         del(labels[rootFeature])
74         uniqueVals = set([it[rootFeature] for it in myGroup])
75         for val in uniqueVals:      # 开始递归创建子树
76             subLabels = labels[:]   # 每次都要定义新的subLabels
77             myTree[rootLabel][val] = self.createTree(self.splitDataSet(myGroup, rootFeature, val), subLabels)  # 函数作为参数传入
78         return myTree
79
80
81 if __name__ == ‘__main__‘:
82     A = myClass()
时间: 2024-10-22 13:48:18

《机器学习实战》——决策树的相关文章

[机器学习&数据挖掘]机器学习实战决策树plotTree函数完全解析

在看机器学习实战时候,到第三章的对决策树画图的时候,有一段递归函数怎么都看不懂,因为以后想选这个方向为自己的职业导向,抱着精看的态度,对这本树进行地毯式扫描,所以就没跳过,一直卡了一天多,才差不多搞懂,才对那个函数中的plotTree.xOff的取值,以及计算cntrPt的方法搞懂,相信也有人和我一样,希望能够相互交流. 先把代码贴在这里: import matplotlib.pyplot as plt #这里是对绘制是图形属性的一些定义,可以不用管,主要是后面的算法 decisionNode

机器学习实战——决策树

from math import log #以决策为标准计算信息熵 def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCounts = {} for featVec in dataSet: currentLabel = featVec[-1] if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0 labelCounts[currentL

机器学习实战-决策树(ID3)

//==================================================== 决策树的构造: 构造决策树时,需要解决的第一个问题是,当前数据集上那个特征在划分数据是起决定性作用.为了找到决定性特征,我们必须使用某种度量来评估每个特征.完成评估之后,找到决定性特征,使用该特征划分数据,原始的数据集就被划分为几个数据子集.这个子集会发布在第一个决策点的所有分支.如果某个分支下的数据属于同一类型,则当前已经准确划分数据分类.如果数据子集内的数据不属于同一类型,则需要重复

机器学习实战--决策树

决策树概述 决策树利用分层的概念将一个复杂的决策问题分解为多个简单的判断问题,最后逐级得到最大支持度的决策结果. 决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据 缺点:可能产生过度匹配问题 适用数据类型:数值型和标称型 决策树算法原理 决策树概念比较简单,用一个男女相亲的例子来描述决策树原理如下: 示例:使用决策树实现分类器 1. 决策树的构造 在构造决策树时,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类时起决定性作用. (1)信

【读书笔记】机器学习实战-决策树(1)

简述算法 上一章的kNN更像是应用统计知识来进行科学的预测,它可以完成许多分类任务.但是最大的缺点就是无法给出数据的内在含义,而决策树算法数据形式非常便于理解.决策树的结果经常会应用到专家系统当中. 构建一棵决策树的流程: 检测数据集中每一个子祥的属性是否属于同一类 if so return 类标签: else 寻找划分数据集的最好特征 划分数据集 创建分支结点 for 每个划分的子集 调用createBranch并增加返回结果到分支结点中 return 分支结点 决策树的一般流程 收集数据 准

机器学习实战—决策树(二)

#-*-coding:utf-8-*- import ch ch.set_ch() import matplotlib.pyplot as plt decisionNode = dict(boxstyle = "sawtooth",fc="0.8") leafNode = dict(boxstyle="round4",fc = "0.8") arrow_args = dict(arrowstyle = "<-&

决策树代码《机器学习实战》

22:45:17 2017-08-09 KNN算法简单有效,可以解决很多分类问题.但是无法给出数据的含义,就是一顿计算向量距离,然后分类. 决策树就可以解决这个问题,分类之后能够知道是问什么被划分到一个类.用图形画出来就效果更好了,这次没有学哪个画图的,下次. 这里只涉及信息熵的计算,最佳分类特征的提取,决策树的构建.剪枝没有学,这里没有. 1 # -*- oding: itf-8 -*- 2 3 ''' 4 function: <机器学习实战>决策树的代码,画图的部分没有写: 5 note:

机器学习实战读书笔记(三)决策树

3.1 决策树的构造 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配问题. 适用数据类型:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训练算法 5.测试算法 6.使用算法 3.1.1 信息增益 创建数据集 def createDataSet(): dataSet = [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, '

机器学习实战笔记3(决策树)

决策树的优势就在于数据形式非常容易理解,而kNN的最大缺点就是无法给出数据的内在含义. 1:简单概念描述 决策树的类型有很多,有CART.ID3和C4.5等,其中CART是基于基尼不纯度(Gini)的,这里不做详解,而ID3和C4.5都是基于信息熵的,它们两个得到的结果都是一样的,本次定义主要针对ID3算法.下面我们介绍信息熵的定义. 事件ai发生的概率用p(ai)来表示,而-log2(p(ai))表示为事件ai的不确定程度,称为ai的自信息量,sum(p(ai)*I(ai))称为信源S的平均信

机器学习实战之一---简单讲解决策树

机器学习实战之一---简单讲解决策树 https://blog.csdn.net/class_brick/article/details/78855510 前言:本文基于<机器学习实战>一书,采用python语言,对于机器学习当中的常用算法进行说明. 一. 综述 定义:首先来对决策树进行一个定义,决策树是一棵通过事物的特征来进行判断分支后得到该事物所需要的预测的属性的树. 流程:提取特征à计算信息增益à构建决策树à使用决策树进行预测 关键:树的构造,通过信息增益(熵)得到分支点和分支的方式.