0、前言:
决策树可以做分类也可以做回归,决策树容易过拟合 决策树算法的基本原理是依据信息学熵的概念设计的(Logistic回归和贝叶斯是基于概率论),熵最早起源于物理学,在信息学当中表示不确定性的度量,熵值越大表示不确定性越大。 ID3算法就是一种通过熵的变化,构造决策树的算法,其基本公式如下: ID3算法举例: 1、计算信息熵:在target中,总共有10个结果,其中yes有7个,no有3个,通过信息熵计算公式,得到如下结果: 2、计算样本熵: 对于特征1:s有3个对应比例为0.3(这3个s对应的target中yes有1个,no有2个),m有4个对应比例为0.4(这4个m对应的target中yes有3个,no有1个),l有3个对应比例为0.3(这3个l对应的target中yes有3个,no有0个),则特征1通过样本熵的计算公式如下: 其余两个特征计算样本熵的方法和特征一一致。 3、计算信息增益:通过公式(info(D) - info_D_L)计算出所有样本的信息增益,然后比较他们的信息增益,选最大的作为第一个决策树节点,然后根据节点划分子节点,如果子节点信息确定则设置为叶子节点,如果子节点存在不同选择,就要重新通过上面的步骤选择新的子节点。上面计算结果中特征2的信息增益最大,因此得到如下决策树,然后继续对target和特征1和特征3重复上面步骤,选择第二个节点。 ID4.5:改进了ID3算法中不重复特征(例如序号列)熵增益过大的缺点,方法就是给每个ID3算法得到的结果除以对应特征的“信息熵”,因此就需要给每个特征通过“信息熵”公式再计算一次它对应的信息熵。(info(D) - info_D_L)/E(A) CART算法(gini):改进了ID3算法中需要大量对数运算导致运算速度较慢的缺点,用基尼代替了熵的概念,核心公式如下,相当于用下面的核心公式替代了求信息熵的公式,其余计算过程和ID3算法一致。也是先求target,然后再求其余特征。 对数计算和平方计算对比情况如下: 计算过程: 首先求target: 再求特征1(特征2、特征3类似) 最后求信息增益(特征2、特征3类似):gini_D - gini_D_L
1、决策树算法参数说明:
2、决策树算法的应用:
1、鸢尾花分类任务(不同参数值分类结果) 2、sin函数回归任务:
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn. tree import DecisionTreeRegressor
x = np. linspace( 1 , 5 , 100 )
y = np. sin( x)
plt. figure( figsize= ( 10 , 5 ) )
plt. scatter( x, y, c= 'r' )
y[ : : 5 ] += np. random. randn( 20 ) * 0.1
plt. figure( figsize= ( 10 , 5 ) )
plt. scatter( x, y, c= 'r' )
x = x. reshape( - 1 , 1 )
x. shape
Dt = DecisionTreeRegressor( max_depth= 7 )
Dt. fit( x, y)
Dt. score( x, y)
x_p = np. linspace( 3.5 , 5 , 100 )
x_p = x_p. reshape( - 1 , 1 )
x_p. shape
pre_y = Dt. predict( x)
plt. scatter( x, y, c= 'r' )
plt. scatter( x_p, pre_y, c= 'b' )
3、随机森林算法:
原理:随机森林是决策树的升级版本,随机说的是每个树都是随机生成的,每个数都不相同。在构建随机森林时,会从训练数据中有放回的随机选取一部分样本,同样也会随机选取数据样本的部分特征进行训练。每棵树使用的样本和特征都不相同,训练结果也各不相同。 使用随机森林的原因:训练最初我们并不知道哪些是异常样本,也不知道哪些特征对结果影响较大,随机的过程就能降低这两个问题的影响,随机森林的输出结果由投票决定,大部分决策树的结果就决定了最终结果。 优点:可以同时训练,不容易过拟合,能处理特征较多的高维数据,不知道使用什么方法时,先试试随机森林。因为随机森林属于多模型组合学习,这些模型之间都是独立学习预测的。 导入随机森林分类库:from sklearn.ensemble import RandomForestClassifier 重要参数: n_estimators:决策树的数量,默认是100个
4、总结:
不论是决策树还是随机森林都有一个属性:feature_importances_,通过这个属性就可以在模型训练结束之后看到每个特征的重要性。其他属性可以通过训练好的模型后面加“.”代码的自动补全就会显示。 决策树当中的一些重要参数: