机器学习之决策树算法

机器学习中决策树算法

树模型

决策树:从根节点开始一步步走到叶子节点(决策)

所有的数据最终都会落到叶子节点,既可以做分类也可以做回归(这里先讲分类树)

机器学习之决策树算法

假如我们需要对是否玩游戏进行分类,我们有两个特征。如上图所示。

决策树的训练与测试

  • 训练阶段:从给定的训练集构造出来一棵树(从根节点开始选择特征,
    如何进行特征切分)

  • 测试阶段:根据构造出来的树模型从上到下去走一遍就好了

  • 一旦构造好了决策树,那么分类或者预测任务就很简单了,只需要走一遍
    就可以了,那么难点就在于如何构造出来一颗树,这就没那么容易了,需
    要考虑的问题还有很多的!

如何切分特征(选择节点):

  • 问题:根节点的选择该用哪个特征呢?接下来呢?如何切分呢?
  • 想象一下:我们的目标应该是根节点就像一个老大似的能更好的切分数据
    (分类的效果更好),根节点下面的节点自然就是二当家了
  • 目标:通过一种衡量标准,来计算通过不同特征进行分支选择后的分类
    情况,找出来最好的那个当成根节点,以此类推。

衡量标准-熵

  • 熵:熵是表示随机变量不确定性的度量(解释:说白了就是物体内部的混乱程度,比如杂货市场里面什么都有,那肯定混乱呀,专卖店里面只卖一个牌子的那就稳定多啦)

  • 公式:
    H(X)=pilogpi,i=1,2,3....n H(X)=-\sum p_i log p_i, i=1,2,3....n

  • 一个栗子:A集合[1,1,1,1,1,1,1,1,2,2]
    ​ B集合[1,2,3,4,5,6,7,8,9,1]

    显然A集合的熵值要低,因为A里面只有两种类别,相对稳定一些
    而B中类别太多了,熵值就会大很多。(在分类任务中我们希望通过
    节点分支后数据类别的熵值大还是小呢?)

  • 如何决策一个节点的选择呢?

    • 信息增益:表示特征X使得类Y的不确定性减少的程度。我们要做的就是使得信息增益最大,分类后的专一性,希望分类后的结果是同类在一起

构造决策树实例

**数据:**14天打球情况

**特征:**4种环境变化

目标:构造决策树

机器学习之决策树算法

划分方式:4种

问题:谁当根节点呢?

**依据:**信息增益

机器学习之决策树算法

在历史数据中(14天)有9天打球,5天不打球,所以此时的熵应为:

机器学习之决策树算法

4个特征逐一分析,先从outlook特征开始:

Outlook = sunny时,熵值为0.971
Outlook = overcast时,熵值为0
Outlook = rainy时,熵值为0.971

根据数据统计,outlook取值分别为sunny,overcast,rainy的概率分别为:5/14, 4/14, 5/14

熵值计算:5/14 * 0.971 + 4/14 * 0 + 5/14 * 0.971 = 0.693
(gain(temperature)=0.029 gain(humidity)=0.152 gain(windy)=0.048)

信息增益:系统的熵值从原始的0.940下降到了0.693,增益为0.24

同样的方式可以计算出其他特征的信息增益,那么我们选择最大的那个就可以啦,相当于是遍历了一遍特征,找出来了大当家,然后再其余的中继续通过信息增益找二当家!

决策树算法

  • ID3:信息增益(有什么问题呢?)

  • C4.5:信息增益率(解决ID3问题,考虑自身熵)

    我们知道信息增益会偏向取值较多的特征,使用信息增益比可以对这一问题进行校正。

    定义:特征A对训练数据集D的信息增益比GainRatio(D,A)定义为其信息增益Gain(D,A)与训练数据集D的经验熵H(D)之比

    机器学习之决策树算法

    信息增益比本质: 是在信息增益的基础之上乘上一个惩罚参数。特征取值个数较多时,惩罚参数较小;特征取值个数较少时,惩罚参数较大。

    机器学习之决策树算法

缺点:信息增益比偏向取值较少的特征

原因: 当特征取值较少时HA(D)的值较小,因此其倒数较大,因而信息增益比较大。因而偏向取值较少的特征。

  • 基尼指数( CART算法 —分类树)

    机器学习之决策树算法

连续值的处理方法

参看链接

决策树的剪枝策略

理论上决策树能把所有的样本区分开,但是这样会有过拟合的风险

常用的策略:

预剪枝:限制深度,叶子节点个数 ,叶子节点样本数,信息增益量等

项目实战:

背景

这里…我们使用的数据集是sklearn 中封装好的加利福尼亚房屋的数据集

机器学习之决策树算法

import matplotlib.pyplot as plt
import pandas as pd

from sklearn.datasets.california_housing import fetch_california_housing
housing = fetch_california_housing()
print(housing.DESCR)

# 建立决策树
from sklearn import tree
dtr = tree.DecisionTreeRegressor(max_depth=2)
dtr.fit(housing.data[:,[6,7]],housing.target)

#要可视化显示 首先需要安装 graphviz   http://www.graphviz.org/Download..php
dot_data = \
    tree.export_graphviz(
        dtr,
        out_file = None,
        feature_names = housing.feature_names[6:8],
        filled = True,
        impurity = False,
        rounded = True
    )

import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")
graph.create_png()
graph.write_png("dtr_white_background.png")

from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test = \
    train_test_split(housing.data, housing.target, test_size = 0.1, random_state = 42)
dtr = tree.DecisionTreeRegressor(random_state = 42)
dtr.fit(data_train, target_train)

print("分数值:",dtr.score(data_test, target_test))
  • 1.criterion gini or entropy

  • 2.splitter best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)

  • 3.max_features None(所有),log2,sqrt,N 特征小于50的时候一般使用所有的

  • 4.max_depth 数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下

  • 5.min_samples_split 如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

  • 6.min_samples_leaf 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值,大些如10W可是尝试下5

  • 7.min_weight_fraction_leaf 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

  • 8.max_leaf_nodes 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。

  • 9.class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。

  • 10.min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。

  • n_estimators:要建立树的个数

    机器学习之决策树算法

参考文章:

【1】Regression Tree 回归树 - 没有名字 - ****博客 https://blog.****.net/weixin_40604987/article/details/79296427

【2】机器学习之-常见决策树算法(ID3、C4.5、CART) | shuwoom的博客 https://shuwoom.com/?p=1452

【3】决策树–信息增益,信息增益比,Geni指数的理解 - 张小呱 - 博客园 https://www.cnblogs.com/muzixi/p/6566803.html

【4】决策树-剪枝算法(二) - DreamFaquir - 博客园 http://www.cnblogs.com/starfire86/p/5749334.html