决策树---ID3算法、C4.5算法、CART算法

目录

 决策树学习的步骤

决策树优缺点

对例题代码生成决策树 


决策树是一种树形结构,它每一个内部节点都表示一个属性的判断,每一个分支表示的是一种结果的输出,最后的叶子节点是代表一种分类的结果。

决策树比较适合分析离散数据,如果是连续数据要先转成离散数据然后再进行分析。下面以一个例题来分析:

RID age income student credit_rating Class:buys_computer
1 youth high no fair no
2 youth high no excellent no
3 middle_aged high no fair yes
4 senior medium no fair yes
5 senior low yes fair yes
6 senior low yes excellent no
7 middle_aged low yes excellent yes
8 youth medium no fair no
9 youth low yes fair yes
10 senior medium yes fair yes
11 youth medium yes excellent yes
12 middle_aged medium no excellent yes
13 middle_aged high yes fair yes
14 senior medium no excellent no

根据上边的表格,我们假设决策树为二叉树,如下图,当然,我们可以训练出很多决策树,下边这个是其中一种情况。

决策树---ID3算法、C4.5算法、CART算法_第1张图片

 决策树学习的步骤

  • 特征的选择:特征选择主要是用来决定用那些特征来做判断,每个样本可能会有很多属性,例如我们的例题,我们通过特征来选择相关度高的属性,简单来说就是选择比较容易分类的属性。选择特征的准则:信息增益

ID3算法:信息增益计算公式

决策树---ID3算法、C4.5算法、CART算法_第2张图片

C4.5算法:信息增益的算法倾向于首先选择因子数较多的变量,改进为增益率,公式如下:

决策树---ID3算法、C4.5算法、CART算法_第3张图片

 CART算法:CART决策树的生成就是递归的构建二叉决策树的过程,CART用基尼系数最小化准则来进行特征选择,生成二叉树。基尼系数计算:

决策树---ID3算法、C4.5算法、CART算法_第4张图片

  •  决策树生成:特征选择好后,从根节点出发,对节点计算所有的信息增益,选择最大的信息增益作为节点特征,根据该特征的不同取值建立子节点,使用相同的办法选择该节点的子节点,直到信息增益很小或者没有特征可以选取为止。
  • 剪枝操作:剪枝操作主要是为了防止过拟合产生,决策树很容易会导致过拟合。

决策树优缺点

优点

  • 决策树易于理解和解释,可以可视化分析,容易提取出规则;
  • 可以同时处理标称型和数值型数据;
  • 比较适合处理有缺失属性的样本;
  • 能够处理不相关的特征;
  • 测试数据集时,运行速度比较快;
  • 在相对短的时间内能够对大型数据源做出可行且效果良好的结果。

缺点

  • 容易发生过拟合;
  • 容易忽略数据集中属性的相互关联;
  • 对于那些各类别样本数量不一致的数据,在决策树中,进行属性划分时,不同的判定准则会带来不同的属性选择倾向;信息增益准则对可取数目较多的属性有所偏好(典型代表ID3算法),而增益率准则(CART)则对可取数目较少的属性有所偏好,但CART进行属性划分时候不再简单地直接利用增益率尽心划分,而是采用一种启发式规则)(只要是使用了信息增益,都有这个缺点)。
  • ID3算法计算信息增益时结果偏向数值比较多的特征。

对例题代码生成决策树 

#导入包
from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
from sklearn import preprocessing
import csv

#读入数据
Dtree = open('AllElectronics.csv','r')
reader = csv.reader(Dtree)

#获取第一行数据
headers = reader.__next__()
#print(headers)

#定义两个列表
featureList = []
labelList = []

for row in reader:
    #把label存入list
    labelList.append(row[-1])
    rowDict = {}
    for i in range(1,len(row)-1):
        rowDict[headers[i]] = row[i] #建立一个数据字典          
    featureList.append(rowDict) #把数据字典存入list

因为我们的数据都是字符,所以在这里,我们要对数据进行处理,将它转换成0-1格式

#把数据转换成0-1表示
vec = DictVectorizer()
x_data = vec.fit_transform(featureList).toarray()
print("x_data:"+str(x_data))

#打印属性名称
print(vec.get_feature_names())
print("labelList:"+str(labelList))

#把标签转换成0-1表示
lb = preprocessing.LabelBinarizer()
y_data = lb.fit_transform(labelList)
print("y_data:"+str(y_data))

转换后的代码如下,1代表的属于此属性,0代表不属于此属性,结果如下图:

决策树---ID3算法、C4.5算法、CART算法_第5张图片 

#创建决策树模型
model = tree.DecisionTreeClassifier(criterion ='entropy') #criterion默认为基尼系数,在这里#我设置为熵,也就是用ID3算法
#输入数据建立模型
model.fit(x_data,y_data)

 这个时候模型建立完成,其实代码实现已经完成了,我们需要将决策树打印出来,如下代码

在完成代码前需要完成两个工作

  1. 先打开命令提示符输入:pip install graphviz
  2. 需要下载画图安装包: Graphviz
  3.  根据自己电脑的操作系统进行下载安装,完成后,我们需要将安装好的文件下的bin目录添加到环境变量里边,操作如下:

先找到该路径,复制该路径: 

进入此电脑,右击选择属性:

决策树---ID3算法、C4.5算法、CART算法_第6张图片

 决策树---ID3算法、C4.5算法、CART算法_第7张图片

 决策树---ID3算法、C4.5算法、CART算法_第8张图片

 完成后,就可以运行下边的代码了,要还是出错,可以重新启动编辑代码的软件。

import graphviz

dot_data = tree.export_graphviz(model,
                               out_file = None,
                               feature_names = vec.get_feature_names,
                               class_names = lb.classes_,
                               filled = True,
                               rounded = True,
                               special_character = True)
graph = graphviz.Source(dot_data)
graph.render('computer')

结果如下图所示,就是生成的决策树: 

决策树---ID3算法、C4.5算法、CART算法_第9张图片

你可能感兴趣的:(机器学习,决策树,算法,机器学习)