决策树算法详解(1)
来源:互联网 发布:生产管理者常用数据 编辑:程序博客网 时间:2024/06/03 21:17
使用决策树解决分类问题,例如
年龄在30为分界点第一次选择,第二个决策点是长相,第三个决策点是收入,在收入中等的时候还考虑是否是公务员,这就是一颗决策树
引入熵和基尼系数两个概念
熵其实就是混乱度,混乱度越小越好,越清晰,所以每次划分都要让熵尽可能最小,让信息增益最大。
比如我们有如下的十四条数据,我们利用这些数据来构造决策树
共有4个特征和1个主类别,构造决策树到底要用哪个特征当做根节点呢?
第一步要计算一下最初的熵值,也可叫做经验熵
假设我们要选择有n个输出(所给属性的n个值)的检验,把训练样本集T分区成子集T1,T2,T3….Tn。仅有的指导信息是在T和它的子集Ti中的类的分布。如果S是任意样本集,
设freq(Ci,S)代表S中属于类Ci(k个可能的类中的一个)的样本数量,|S|表示集合S中的样本数量。
集合S熵的计算:
本例中计算方法如下:
接下来介绍一个信息增益的公式:
度量了按照检验X进行分区的T所得到的信息。该增益标准选择了使 Gain(X)最大化的检验X,即此标准选择的事具有最高信息增益的那个属性。
我们的经验熵是0.940
下面选择特征来计算条件熵
图为按照不同特征划分
计算出每一种的条件熵值
outlook=sunny条件熵:
-2/5log2(2/5)-3/5log2(3/5)=0.971
outlook=overcast条件熵:0
outlook=rainy条件熵:0.971
条件熵汇总成信息熵
outlook的信息熵是:
5/14x0.971+4/14x0+5/14x0.971=0.693
信息增益Gain是:Gain=经验熵-信息熵
Gain(outlook)=0.940-0.693=0.247
同理我们求出其他特征的信息增益:
Gain(temperature)=0.029
Gain(humidity)=0.152
Gain(windy)=0.048
Gain(outlook)最大(outlook特征在第一步中使系统的信息熵下降的最快),所以决策树的根节点就取outlook
C4.5信息增益率,因为单纯的信息增益是不靠谱的,比如说用ID来划分的话没有任何意义,所以信息增益率可以消除这种失误。
评价决策树的好坏有评价函数:
评价函数(损失值):C(T)
连续值做离散化处理 可以按照中值切分开
我们希望得到一个高度最矮的决策树
如果树分的特别细致反而不好,因为可能会过拟合,也就是过分地为了匹配而学习,导致在训练数据集上表现很好而测试效果不好。
决策树剪枝策略:预剪枝和后剪枝
预剪枝:
一般可以提前定好树的深度或者节点数
后剪枝:
在树构建好了之后进行剪枝处理
我们认为在损失值基础上叶子结点个数越多也不好
于是新的评价函数(损失函数)
Cα(T)=C(T)+α·|Tleaf|
当α比较大的时候要让Cα(T)小一些,当α小的时候叶子结点的数目没那么重要
随机森林
众多决策树的组合
Bootstraping采样,是又放回采样
随机的含义
随机指的是:数据选择随机,指定随机比例,
选取特征也是随机的
Python代码:
鸢尾花数据集
数据集截图:
import numpy as np import pandas as pda import operatorfilename="iris.csv"dataf=pda.read_csv(filename)x=dataf.iloc[:,0:4].as_matrix()y=dataf.iloc[:,4:5].as_matrix()from sklearn.model_selection import train_test_splitx_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=20)
用到了训练集测试集切分模块
from sklearn.model_selection import train_test_split
测试样本所占比例0.2,随机因子20
from sklearn.tree import DecisionTreeClassifier as DTCdtc=DTC(criterion="entropy")dtc.fit(x_train,y_train)print(dtc.predict(x_test))
用决策树模型训练并进行预测
用到了决策树模块
from sklearn.tree import DecisionTreeClassifier as DTC
预测结果如下图:
还可以更高级一些,把我们的决策树图形界面化
需要电脑安装好graphviz的安装包
from sklearn.tree import export_graphvizfrom sklearn.externals.six import StringIOwith open("tree.dot","w") as file: file=export_graphviz(dtc,feature_names=["huabanchang","huabankuan","huaechang","huaekuan","zhonglei"],out_file=file)
得到tree.dot文件
打开之后可以看到我们的决策树
- 决策树算法详解(1)
- 决策树算法详解(2)
- 决策树算法详解(3)
- 决策树算法详解(ID3)
- 数据挖掘十大算法之决策树详解(1)
- 1-1 决策树算法
- [机器学习]详解分类算法--决策树算法
- [机器学习]详解分类算法--决策树算法
- 详解决策树ID3算法划分数据集
- 决策树之C4.5算法详解
- 分类算法之决策树ID3详解
- 机器学习—CART决策树算法详解
- 机器学习-决策树算法代码详解
- 数据分析算法----1决策树
- 决策树1 -- ID3_C4.5算法
- 1-2 决策树算法应用
- 决策树算法
- 决策树算法
- 视频读取错误状态
- 编译原理与编译构造 由语言构造文法1
- Java 集合框架ArrayList 储存自定义数组
- 简述malloc/free和new/delete区别
- 移动webapp的那些bug
- 决策树算法详解(1)
- 基本概念和Dispatch Queue
- 欢聚时代2017校招笔试题目(JAVA基础类)A卷--8
- html常用代码大全
- Android图片加载框架最全解析(五),Glide强大的图片变换功能
- Python面向对象编程(类和实例 访问限制 继承和多态 获取对象信息 实例属性和类属性)
- JVM内存模型
- Java和Scala学习日记8
- Java程序员成神列表