Python决策树模型的基本原理和参数调优【附代码】

目录

1、决策树模型的基本原理

(1)决策树模型简介

(2)决策树模型的建树依据       

(3)决策树模型的代码实现

2、案例:员工离职预测模型搭建

1、模型搭建

(1) 数据读取与预处理

(2) 提取特征变量和目标变量

(3) 划分训练集和测试集

(4) 模型训练及搭建

2、模型预测及评估

(1)直接预测是否离职

(2)预测不离职&离职概率

(3)模型预测效果评估

(4) 特征重要性评估

3、决策树模型可视化呈现

3、参数调优-K折交叉验证&GridSearch网络搜索

(1)K折交叉验证

(2)GridSearch网格搜索

1、单参数的参数调优

2、参数调优的效果检验

3、多参数调优

1、决策树模型的基本原理

(1)决策树模型简介

       下图所示为一个典型的决策树模型:员工离职预测模型的简单演示。该决策树首先判断员工满意度是否小于5,答案为“是”则认为该员工会离职,答案为“否”则接着判断其收入是否小于10,000元,答案为“是”则认为该员工会离职,答案为“否”则认为该员工不会离职。

       这里解释几个决策树模型的重要关键词:根节点父节点子节点叶子节点

父节点和子节点是相对的,子节点由父节点根据某一规则分裂而来,然后子节点作为新的父亲节点继续分裂,直至不能分裂为止。
根节点是没有父节点的节点,即初始节点。
叶子节点则是没有子节点的节点,即最后的节点。

(2)决策树模型的建树依据       

       决策树模型的建树依据主要用到一个基尼系数(gini)的概念。基尼系数用于计算一个系统中的失序现象,也即系统的混乱程度。基尼系数越高,系统混乱程度越高,建立决策树模型的目的就是通过合适的分类来降低系统的混乱程度,其计算公式如下:

       其中pi为类别i在样本T中出现的频率,即类别为i的样本占总样本个数的比率。为∑为求和公式,即把所有的pi^2进行求和。

       举例来说,对于一个全部都是违约客户的样本来说,里面只有一个类别:违约客户,其出现的频率是100%,所以该系统基尼系数为1−12=0 1-1^2=0 ,表示该系统没有混乱,或者说该系统的“纯度”很高。如果样本里一半是违约客户,另一半是非违约客户,那么类别个数为2,每个类别出现的频率都为50%,所以其基尼系数为1−(0.52+0.52)=0.5 1-([0.5]^2+[0.5]^2)=0.5 也即其混乱程度很高。

       当引入某个用于进行分类的变量(比如“曾经违约”),则分割后的基尼系数公式为:

       其中S1S2为划分成两类的样本量,gini(T1)gini(T2)为划分后的两类各自的基尼系数。

       可以看到未划分时的基尼系数为0.48,以“满意度<5”为初始节点进行划分后的基尼系数为0.3,而以“收入<10,000”为初始节点进行划分后的基尼系数为0.45。基尼系数越低表示系统的混乱程度越低,区分度越高,能够比较好地作为一个分类预测模型,因此这里选择“满意度<5”作为初始节点。这里演示了如何选择初始节点,初始节点下面的节点也是用类似的方法来进行选择

       同理,对于“收入”这一变量来说,是选择“收入<10,000”还是选择“收入<100,000”进行划分,也是通过计算在这两种情况下划分后的基尼系数来进行判断。若还有其他的变量,如“工龄”、“月工时”等,也是通过类似的手段计算划分后的系统的基尼系数,来看如何进行节点的划分,从而搭建一个较为完善的决策树模型。采用基尼系数进行运算的决策树也称之为CART决策树

(3)决策树模型的代码实现

       决策树模型既可以做分类分析(即预测分类变量值),也可以做回归分析(即预测连续变量值),分别对应的模型为分类决策树模型(DecisionTreeClassifier)及回归决策树模型(DecisionTreeRegressor)。

       分类决策树模型(DecisionTreeClassifier)代码演示如下所示(运行结果为0):

from sklearn.tree import DecisionTreeClassifier
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [1, 0, 0, 1, 1]

model = DecisionTreeClassifier(random_state=0)
model.fit(X, y)

print(model.predict([[5, 5]]))

       如果要同时预测多个数据,则可以写成如下形式:

print(model.predict([[5, 5], [7, 7], [9, 9]]))

       为大家理解,利用决策树可视化技巧将决策树可视化,如下图所示:

       在引入决策树模型的时候,我们设置了random_state随机状态参数,设置这个参数的原因是,决策树模型会优先选择使整个系统基尼系数下降最大的划分方式来进行节点划分,但是有可能(尤其当数据量较少的时候),根据不同的划分方式获得的基尼系数下降是一样的。下图所示为不设置random_state参数时多次运行后获得的不同的决策树:

       为什么模型训练后会产生两颗不同的树呢,哪棵树是正确的呢?其实两颗树都是正确的,出现这种情况的原因,是因为根据“X[1]<=7”或者“X[0]<=6”进行节点划分时产生的基尼系数下降是一样的(都是0.48 - (0.6*0.444 + 0.4*0) = 0.2136),所以无论以哪种形式进行节点划分都是合理的。产生这一现象的原因大程度是因为数据量较少所以容易产生不同划分方式产生的基尼系数下降是一样的情况,当数据量较大时出现该现象的几率则较小。

       回归决策树模型(DecisionTreeRegressor)除了进行分类分析外,决策树还可以进行回归分析,即预测连续变量,此时决策树便被称之为回归决策树,回归决策树模型简单代码如下所示:

from sklearn.tree import DecisionTreeRegressor
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [1, 2, 3, 4, 5]

model = DecisionTreeRegressor(max_depth=2, random_state=0)
model.fit(X, y)

print(model.predict([[9, 9]]))

       回归决策树模型的概念和分类决策树基本一致,最大的不同就是其切分标准不再是信息熵或是基尼系数,而是均方误差MSE,均方误差MSE的计算公式如下所示

       利用决策树可视化技巧将决策树可视化,如下图所示:

       对于根节点,它里面一共有5个数据,这里是将节点中所有数据的均值作为该节点的拟合值,因此对于该节点来说,其拟合值\hat{y}^{i}(1+2+3+4+5)/5=3,因此其均方误差MSE如下所示为数字2,和程序获得的结果是一致的

       这里因为设置了树的最大深度参数max_depth

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值