决策树算法详解(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文件
打开之后可以看到我们的决策树
这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 社保卡电话错误怎么办 没住过酒店怎么办 上海合规网约车证件怎么办 取票没有身份证怎么办 买车票没有身份证怎么办 登机身份证丢了怎么办 飞机没带身份证怎么办 上飞机没带身份证怎么办 机场没带身份证怎么办 儿童坐飞机没有户口本怎么办 不需要行李托运化妆品怎么办 坐飞机被限制了怎么办 坐飞机没买保险怎么办 飞机起飞时难受怎么办 婴儿坐飞机没座位怎么办 转机行李不直达怎么办 儿童自己坐飞机怎么办手续 两岁宝宝发烧怎么办 网上购票待核验怎么办 老人坐飞机找不到登机口怎么办 儿童不能值机怎么办 飞机上旅客刁难怎么办 飞机上婴儿哭闹怎么办 飞机上婴儿啼哭怎么办 飞机儿童陪护手续怎么办 孕妇感冒鼻子堵怎么办 孕妇用了眼药水怎么办 孕妇用眼药水了怎么办 错过了登机时间怎么办 过了登机时间怎么办 孩子不喜欢做作业怎么办 宝宝腿不一样粗怎么办 一个小腿肿了怎么办 左右小腿不一样粗怎么办 小孩不敢自己睡怎么办 小孩不一个人睡怎么办 晚上一个人睡觉害怕怎么办 孩子自己睡害怕怎么办 小孩晚上睡觉怕怎么办 小孩分房睡害怕怎么办 坐飞机不认识字怎么办