[学习笔记]机器学习——算法及模型(三):决策树

传统算法(三)

决策树

一、决策树思想

(一)树模型

决策树,顾名思义可以大概猜到是根本的思想是根据参数条件(节点)来划分类,会有很多的节点,从根节点开始一步步走到叶子节点(决策),最后所有的数据最终都会落到叶子节点。
所以决策树算法既可以做分类也可以做回归

举例:
对一家成员来区分(判断),是否要玩电脑游戏:

  1. 根节点:age小于15;
    2.子节点:是否是男生;

在这里插入图片描述

(二)树组成

一个决策树模型中,重要的几个点如下:

  • 根节点:第一个选择点
  • 非叶子节点与分支:中间过程
  • 叶子节点:最终的决策结果
(三)决策树的训练与测试

对新的问题,用决策树模型来处理时,一般会有两个阶段:训练阶段测试阶段

  • 训练阶段:从给定的训练集构造出来一棵树(从跟节点开始选择特征, 如何进行特征切分)
  • 测试阶段:根据构造出来的树模型从上到下去走一遍,来验证模型;

那么主要难点在哪?
难点就在于如何构造出来一颗树,根节点的选择该用哪个特征呢?以及如何切分做决策呢?
我们可以想到,根节点的选择非常重要,中间的分支和非叶子节点都是在根节点的基础上,再进一步来划分,那要怎么来衡量来选择重要的根节点呢?——引入“熵”的概念


二、衡量标准-熵

熵的概念:
熵是表示随机变量不确定性的度量 。

说白了就是物体内部的混乱程度;比如杂货市场里面有非常多的品牌、种类,就很混乱,而专卖店里面只卖一个牌子的那就稳定多啦。

计算熵的公式:
H ( X ) = − ∑ p i ∗ l o g p i ( i = 1 , 2 , 3 ⋯ n ) H(X)=-\sum p_i*logp_i(i=1,2,3\cdots n) H(X)=pilogpi(i=1,2,3n)log一般取2为底数

图像显示如下:
在这里插入图片描述
通过图像我们可以知道:

  • p = 0 p=0 p=0 p = 1 p=1 p=1时, H ( p ) = 0 H(p)=0 H(p)=0,随机变量完全没有不确定性
  • p = 0.5 p=0.5 p=0.5时, H ( p ) = 1 H(p)=1 H(p)=1,此时随机变量的不确定性最大

所以,不确定性越大,得到的熵值也就越大,我们当然希望熵值越小越好

但是这样我们也并不能知道如何决策一个节点的选择; 这个时候,我们可以用“信息增益”来做这个决策;

信息增益:表示特征X使得类Y的不确定性减少的程度。

举例进行计算一下:

  • 数据:14天打球情况
  • 特征:4种环境变化
  • 目标:构造决策树
weathertemperaturehumiditywindyplay
sunnyhothighfalseno
sunnyhothightrueno
overcasthothighfalseyes
rainymildhighfalseyes
rainycoolnormalfalseyes
rainycoolnormaltrueno
overcastcoolnormaltrueyes
sunnymildhighfalseno
sunnycoolnormalfalseyes
rainymildnormalfalseyes
sunnymildnormaltrueyes
overcastmildhightrueyes
overcasthotnormalfalseyes
rainymildhightrueno

明显我们可以根据4个特征,划分出4种节点:
在这里插入图片描述
确定节点:
1、整体的熵值计算:
在历史数据中(14天)有9天打球,5天不打球,所以此时的熵应为:
− 9 14 l o g 2 9 14 + ( − 5 14 l o g 2 5 14 ) = 0.94 -\dfrac{9}{14}log_2\dfrac{9}{14}+\left(-\dfrac{5}{14}log_2\dfrac{5}{14}\right)=0.94 149log2149+(145log2145)=0.94
2、对4个特征逐一进行熵值的计算,以weather为例:

  • weather = sunny时,有5天是sunny的天气,其中有2天是打球,3天不打球;那么,熵值为 − 2 5 l o g 2 2 5 + ( − 3 5 l o g 2 3 5 ) = 0.971 -\dfrac{2}{5}log_2\dfrac{2}{5}+\left(-\dfrac{3}{5}log_2\dfrac{3}{5}\right)=0.971 52log252+(53log253)=0.971
  • weather = overcast时,有4天是overcast的天气,4天都是打球;那么,熵值为 − 4 4 l o g 2 4 4 = 0 -\dfrac{4}{4}log_2\dfrac{4}{4}=0 44log244=0
  • weather = rainy时,有5天是rainy的天气,其中有3天是打球,2天不打球;那么,熵值为 − 3 5 l o g 2 3 5 + ( − 2 5 l o g 2 2 5 ) = 0.971 -\dfrac{3}{5}log_2\dfrac{3}{5}+\left(-\dfrac{2}{5}log_2\dfrac{2}{5}\right)=0.971 53log253+(52log252)=0.971
    整体的weather中值为sunny,overcast,rainy的概率分别为: 5/14, 4/14, 5/14;所以我们算出来以weather的计算的整体熵值 5 / 14 ∗ 0.971 + 4 / 14 ∗ 0 + 5 / 14 ∗ 0.971 = 0.693 5/14 * 0.971 + 4/14 * 0 + 5/14 * 0.971 = 0.693 5/140.971+4/140+5/140.971=0.693

3、计算信息增益:
那么此时以weather计算出来的增益值为: 0.940 − 0.693 = 0.247 0.940-0.693=0.247 0.9400.693=0.247,即系统的熵值从原始的0.940下降到了0.693,增益为0.247;
同理,算出来gain(temperature)=0.029、gain(humidity)=0.152、gain(windy)=0.048;
这样我们就找到了第一个根节点weather;接下来就是按照相同的方法继续来决策非叶子节点以及叶子节点了;


三、决策树算法

这里我们在整体介绍三种算法:

  1. ID3(信息增益):也就是刚刚已经提到的方法信息增益,用绝对的增加(减少)的值来评估决策;
  2. C4.5(信息增益率):计算公式为:信息增益/自身的熵值;这个是防止单个特征的绝对增量大而影响决策,用C4.5就可以解决这个问题,同时也考虑到了自身熵的情况;
  3. CART(分类回归树算法):这个是使用GINI系数来当做衡量标准;GINI系数的公式:
    G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2

四、决策树剪枝策略

剪枝策略是什么呢?为什么要剪枝呢?
可以试想一下,如果数据量非常大的情况下,如果可以容忍过拟合的风险,会出现非常多的节点,最后的叶子节点选出来的数据,这样结果也是每个叶子节点不就一个数据。
所以我们要进行剪枝的策略;

剪枝策略:

  • 预剪枝:边建立决策树边进行剪枝的操作(更实用)
    通过设定:限制深度,叶子节点个数,叶子节点样本数,信息增益量等来衡量是否剪枝。
  • 后剪枝:建立完决策树后来进行剪枝操作
    通过一定的衡量标准:
    C α ( T ) = C ( T ) + α ⋅ ∣ T l e a f ∣ C_\alpha(T)=C(T)+\alpha\cdot\mid T_{leaf}\mid Cα(T)=C(T)+αTleaf (叶子节点越多,损失越大)

五、Python代码实例

以下实例为预测加利福尼亚的房产价格

使用sklearn模块中决策树算法的代码:

#coding=utf-8
# write by sz

import matplotlib.pyplot as  plt
import pandas as pd
import numpy as np
import pydotplus
from sklearn.datasets.california_housing import fetch_california_housing
from sklearn import tree

#实例化
cal = fetch_california_housing()

# print(cal)
first_index = cal.feature_names.index('HouseAge')
end_index = cal.feature_names.index('Longitude')

x = cal.data[:,first_index:end_index]
y = cal.target

# print(x)
# print(y)
#模型训练
TR = tree.DecisionTreeRegressor(max_depth=10,min_samples_leaf=2)
TR.fit(x,y)

dot = tree.export_graphviz(TR, out_file=None,
                           feature_names = cal.feature_names[1:7],
                           filled=True,special_characters=True)
#可视化
graph = pydotplus.graph_from_dot_data( dot )
graph.write_pdf('exsample.pdf')
y_predict = TR.predict(x)

print(y_predict)
print(y)
plt.plot(np.arange(len(y)),y,c='r')
plt.plot(np.arange(len(y)),y_predict,c='y')
#
plt.show()

以上,就是本次学习的决策树模型及算法的思想,以及python代码实现的案例;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值