决策树Decision Tree

决策树的三种算法:

举个栗子:

熵entropy的概念:

信息熵越大,不确定性越大。信息熵越小,不确定性越小。

其实就是排列组合之中的概率,概率相乘得到其中一个组合,我们想把乘号换成加号,则加一个log,(log(ab)=loga+logb)因为连乘一般不会得到很好的结果,特别是数据非常多的时候。
骰子计算结果:

ID3算法(根据信息熵来决定):

选择根节点ID3算法:
首先以结果buys_computer来计算总的信息熵D。
然后计算年龄的信息熵,只看年龄的部分,年轻的5/14,然后查看年龄中的buys_computer,2/5是yes,3/5是no;中年的4/14,中年中买的,和不买的。再查看老年,老年中买的和不买的;他们的和即是总的信息熵。
信息增益就是D的熵减去年龄的熵。

连续变量的处理:

两列数据,左边是一列,右边是一列。右边是两个数之间的平均值。
这里的每一个中间值,如果都切一刀,那么每一个值都可以计算一次信息增益。
那一个节点的信息增益计算出来越大,那么就将这个节点作为分界点,大于23为一类,小于23为一个分类。把连续型数据处理成离散数据。

C4.5算法

C4.5偏爱取值数目少的属性。
ID3算法(信息增益)会出现一个问题:
往往会选择分叉比较多的那一个作为节点。

实例:

数据文件:

注意:当制作数据时,不要直接再xls的后缀中直接修改为csv这样会导致编码错误,需要另存为csv文件。

from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
from sklearn import preprocessing
import csv#读入数据,用csv来读数据,是专门来读取该文件的,这个方式可以读取各式各样的字符。
Dtree = open(r'All.csv','r')
reader = csv.reader(Dtree)#获取第一行数据,即为表头。
headers = reader.__next__()#定义两个列表,保存特征和标签
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]#把数据字典存入listfeatureList.append(rowDict)#把数据转换成01表示
#把所有属性的所有情况写出来,依次排列,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))
#把标签换成01表示
lb = preprocessing.LabelBinarizer()
y_data = lb.fit_transform(labelList)
print("y_data:"+str(y_data))#创建决策树模型,算法使用C4.5entropy
model = tree.DecisionTreeClassifier(criterion='entropy')
#输入要建立的模型
model.fit(x_data,y_data)#测试
x_test = x_data[0]#选一个样本作为测试数据
print("x_test:"+str(x_test))predict = model.predict(x_test.reshape(1,-1))#将x_test变成一个二维的数据
print("predict:"+str(predict))#画图
import graphvizdot_data = tree.export_graphviz(model,out_file=None,#特征的名字,要设置feature_names = vec.get_feature_names(),class_names=lb.classes_,filled=True,rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render('computer')

所显示的决策树。决策树一般是二叉树的样子,左边默认True,右边为False

决策树CART算法

首先确定划分节点的节点类。

举个栗子:
是否有房这个节点的基尼指数 =
gini{总的是否拖欠贷款} - 是否有房中有房的概率 * gini{有房} - 是否有房子无房的概率 * gini{无房}
gini{有房} = 1- 有房中拖欠贷款概率的平方 - 有房中未拖欠贷款概率的平方
gini{无房} = 1 - 无房中拖欠贷款概率的平方 - 无房中未拖欠贷款概率的平方

根据婚姻状况来划分,因为基尼指数只能进行二分类,所以三种情况下的话就定一类情况为主,而另外两种合并,看作一种情况;再计算定的那一类的基尼指数。分别定三种情况为三个主类,计算三次各个情况的基尼指数。

计算年收入情况。要将连续型数据化为离散型,计算每两个值之间的平均值,把每一个中点作为它的分割点来计算它的基尼指数:在65这里切一刀,大于65为一种情况,小于65为一种情况。最后找所有情况中的最大值作为分割点。


最后创建的决策树:

决策树的剪枝

为了减少决策树的复杂度。

预剪枝:根据经验自己判断,把觉得没有用的属性先去掉,边构建,边剪枝(防止过拟合风险)

后剪枝:构建完决策树之后,我们再砍掉一部分。在判断条件几乎不影响分类时,比如100个样本,有90个样本都属于一类,而10个属于另一类。10个的类可能还会继续判断,那么就把这个10类别直接减掉,判断全部为90的类。

决策树优缺点:

实战

from sklearn import tree
import numpy as np#载入数据
data = np.genfromtxt("cart.csv",delimiter=",")
x_data = data[1:,1:-1]
y_data = data[1:,-1]#创建决策树模型,不传任何参数,就是默认使用基尼系数来计算
model = tree.DecisionTreeClassifier()
#输入数据建立模型
model.fit(x_data,y_data)#导出决策树
import graphvizdot_data = tree.export_graphviz(model,out_file=None,#特征的名字,要设置feature_names = ['house_yes','house_no','single','married','divorced','income'],class_names=['no','yes'],filled=True,rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render('cart')

如果算出来基尼指数出现相同的值时,就会出现不同的结果,因为基尼指数相同时,它时随机选择其中一个作为一个节点。

决策树Decision Tree+ID3+C4.5算法实战相关推荐

  1. 机器学习:决策树(Decision Tree)--ID3算法

    决策树的主要算法 构建决策树的关键:按照什么样的次序来选择变量(属性/特征)作为分类依据. 根据不同的目标函数,建立决策树主要有以下三种算法 ID3(J.Ross Quinlan-1975) 核心:信 ...

  2. Data Minig --- Decision Tree ID3 C4.5 Gini Index

    一.决策树学习(适用于"属性-值"实例且输出值离散) 决策树学习是一种逼近离散值目标函数的方法,这个方法学到的函数称为一棵决策树.学到的决策树可表示为多个if-then过程以提高可 ...

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

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

  4. 决策树(Decision Tree)理解及参数介绍

    1.算法过程 决策树的生成是一个递归过程. 1.1递归返回 叶节点生成过程 当前节点样本全属于同一类,无需划分 当前属性集为空或者所有样本在所有属性上取值相同,无法划分,并设置为所含样本最多的类别 当 ...

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

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

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

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

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

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

  8. 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现

    ID3/C4.5算法分类决策树 import numpy as np import math class Node:def __init__(self,feature_index=None,value ...

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

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

最新文章

  1. [C# 开发技巧系列]如何动态设置屏幕分辨率
  2. 论文参考文献的组织(latex)
  3. python docx 合并文档 图片_不再为处理PDF烦恼,python处理操作PDF全攻略
  4. 《工具癖》Mac与Windows获取文件绝对路径的快捷键
  5. ubuntu 1604搭建hdp2.4 Hadoop
  6. 新闻页面_页面加载功能设计总结
  7. 使用file_get_contents下载图片
  8. Bailian2757 最长上升子序列【DP】
  9. OpenCV_Find Basis F-Matrix and computeCorrespondEpilines(获取一对图像的基础矩阵及对应极线)
  10. Retinex 算法
  11. Cisco Packet Tracer思科模拟器中无线网络的基本配置
  12. windows下Tomcat详细安装配置教程
  13. go语言反汇编linux,Go语言函数的底层实现
  14. Winform实现确认取消框
  15. 转载:MATLAB中怎么表示对数函数及e
  16. Android Studio记录一个错误:解析软件包时出现问题
  17. Echarts绘制Tree树图的涟漪效果effectScatter
  18. 在桌面上显示当前的IP地址和电脑名称
  19. python程序设计实用教程清华大学出版社_清华大学出版社-图书详情-《Python程序设计简明教程》...
  20. c语言if语句知识点总结,c语言中if语句知识点总结.docx

热门文章

  1. ZendStudio操作技巧
  2. 朋友圈的尖子生--自序有感
  3. 关于系统中使用多个PropertyPlaceholderConfigurer的配置(不错)
  4. 窗体应用程序:四则运算
  5. Java高级架构师(一)第05节:TortoiseGit的本地使用
  6. 自定义session,cookie
  7. textContent和innerText属性的区别
  8. [c/c++] programming之路(12)、循环结构
  9. Centos7下搭建LAMP平台环境
  10. Financial Managemen