决策树、随机森林、GDBT模型笔记


一、决策树

1 算法思想

经典的十大数据挖掘算法1之一,是一种类似于流程图的树结构,其规则就是IF…THEN…的思想
可以用于数值型因变量的预测和离散型因变量的分类2

2 算法特点

  • 算法简单直观、通俗易懂
  • 算法的结果输出具有很强的解释性

3 节点字段的选择

3.1 信息增益

  • 思想:在根节点或中间节点的变量选择过程中,就是挑选出各自变量下因变量的信息增益最大的。信息增益计算公式:
    G a i n A ( D ) = H ( D ) − H ( D ∣ A ) Gain_A(D)=H(D)-H(D|A) GainA(D)=H(D)H(DA)
  • 指标缺点:信息增益会偏向于取值较多的字段。

3.2 信息增益率

  • 思想:在信息增益的基础上进行相应的惩罚。信息增益率的公式可以表示为:
    G a i n − R a t i o A ( D ) = G a i n A ( D ) H A Gain-Ratio_A(D) = \frac{Gain_A(D)}{H_A} GainRatioA(D)=HAGainA(D)
  • 如果用于分类的数据集中各离散型自变量的取值个数没有太大差异,那么信息增益指标与信息增益率指标在选择变量过程中并没有太大的差异

3.3 基尼指数

基尼指数的计算公式:
G i n i ( D ) = ∑ k = 1 K ∣ C k ∣ ∣ D ∣ ( 1 − ∣ C k ∣ ∣ D ∣ ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=\sum_{k=1}^K\frac{|C_k|}{|D|} (1-\frac{|C_k|}{|D|})=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2 Gini(D)=k=1KDCk(1DCk)=1k=1K(DCk)2
其中,|D|表示事件中的所有样本点,|Ck|表示事件的第k个可能值出现的次数.

4 决策树方法

  • 决策树中的ID3算法使用 信息增益 指标实现根节点或中间节点的字段选择。
  • 决策树中的C4.5算法 使用信息增益率指标实现根节点或中间节点的字段选择。
  • 决策树中的CART算法使用的字段选择指标是基尼指数,并且能够让决策树预测连续型的因变量

方法异同

  • C4.5算法ID3算法,都只能针对离散型因变量进行分类
  • CART算法既可以对离散型因变量进行处理,也可以预测连续型的因变量
  • ID3和C4.5都属于多分支的决策树,CART则是二分支的决策树

不管是ID3、C4.5还是CART决策树,在建模过程中都可能存在过拟合的情况,即模型在训练集上有很高的预测精度,但是在测试集上效果却不够理想。
决策树 不对多重共线性敏感,故无须删除某类哑变量中的一个。

5 剪枝技术

决策树的剪枝通常有两类方法:

  • 一类是预剪枝:指在树的生长过程中就对其进行必要的剪枝。
  • 另一类是后剪枝:指决策树在得到充分生长的前提下再对其返工修剪。

5.1 预剪枝

预剪枝对应的主要技术有:

  • 限制树生长的最大深度,即决策树的层数
  • 限制决策树中间节点数
  • 限制叶节点中所包含的最小样本量
  • 限制决策树生成的最多叶节点数量等

5.2 后剪枝

后剪纸对应的常用技术有:

  • 误差降低剪枝法
  • 悲观剪枝法
  • 代价复杂度剪枝法等
5.2.1 误差降低剪枝法

思想:该方法属于一种自底向上的后剪枝方法,剪枝过程中需要结合测试数据集对决策树进行验证,如果某个节点的子孙节点都被剪去后,新的决策树在测试数据集上的误差反而降低了,则表明这个剪枝过程是正确的,否则就不能对其剪枝。

缺点:需要结合测试数据集才能够实现剪枝,因此就可能导致剪枝过度的情况。

5.2.2 悲观剪枝法

该方法的剪枝过程恰好与误差降低剪枝法相反,它是自顶向下的剪枝过程。对比剪枝前后叶节点误判率的标准就是,如果剪枝后叶节点的误判率期望在剪枝前叶节点误判率期望的一个标准差内,则认为剪枝是合理的,否则不能剪枝。

5.2.3 代价复杂度剪枝法

一种基于目标函数的剪枝方法。该剪枝方法涉及两则信息,一则是代价,是指将中间节点替换为叶节点后误判率会上升;另一则是复杂度,是指剪枝后叶节点的个数减少,进而使模型的复杂度下降。

二、随机森林

1 算法思想

算法的核心思想就是采用多棵决策树的投票机制,完成分类或预测问题的解决。

  • 对于分类问题,将多棵树的判断结果用作投票,根据少数服从多数的原则,最终确定样本所属的类型;
  • 对于预测性问题,将多棵树的回归结果进行平均,最终用于样本的预测值。

随机森林的随机性体现在两个方面:

  • 一是每棵树的训练样本是随机的
  • 二是树中每个节点的分裂字段也是随机选择的

2 算法特点

  • 运行速度快
  • 预测准确率高
  • 随机森林不容易陷入过拟合(随机性的引入)

三、绘制决策树图

在绘制决策树图之前,确保电脑中安装了Graphviz工具。读者可以前往 https://graphviz.gitlab.io/_pages/Download/Download_windows.html 下载,然后将解压文件中的bin路径设置到环境变量中,重新启动Python即可.

四、决策树实例

对Titanic数据集进行拟合,该数据集一共包含891个观测和12个变量,其中变量Survived为因变量,1表示存活,0表示未存活。

1 数据预处理

缺失值类别变量进行简单处理。

# 导入第三方模块
import pandas as pd
# 读入数据
Titanic = pd.read_csv(r'Titanic.csv')
# print('数据前3行示例:\n',Titanic.head(3))

# 删除无意义的变量,并检查剩余自字是否含有缺失值
Titanic.drop(['PassengerId','Name','Ticket','Cabin'], axis = 1, inplace = True)
print('数据的缺失情况:\n',Titanic.isnull().sum(axis = 0))

# 对Sex分组,用各组乘客的平均年龄填充各组中的缺失年龄
fillna_Titanic = pd.DataFrame()
for i in Titanic.Sex.unique():
    update =  Titanic.loc[Titanic.Sex == i,:].fillna(value = {'Age': Titanic.Age[Titanic.Sex == i].mean()})  
    fillna_Titanic = pd.concat([fillna_Titanic,update])
    
Titanic = fillna_Titanic
# 使用Embarked变量的众数填充缺失值
Titanic.fillna(value = {'Embarked':Titanic.Embarked.mode()[0]}, inplace=True)


# 将数值型的Pclass转换为类别型,否则无法对其哑变量处理
Titanic.Pclass = Titanic.Pclass.astype('category')
# 哑变量处理
dummy = pd.get_dummies(Titanic[['Sex','Embarked','Pclass']])
# 水平合并Titanic数据集和哑变量的数据集
Titanic = pd.concat([Titanic,dummy], axis = 1)
# 删除原始的Sex、Embarked和Pclass变量
Titanic.drop(['Sex','Embarked','Pclass'], inplace=True, axis = 1)

2 决策树模型

# ------------ 构建决策树模型----------------------------
# 导入第三方包
from sklearn import model_selection
# 取出所有自变量名称
predictors = Titanic.columns[1:]
# 将数据集拆分为训练集和测试集,且测试集的比例为25%
X_train, X_test, y_train, y_test = model_selection.train_test_split(Titanic[predictors], Titanic.Survived, 
                                                                    test_size = 0.25, random_state = 1)

# 网格搜索法 寻找最优参数组合
# 导入第三方模块
from sklearn.model_selection import GridSearchCV
from sklearn import tree

# 预设各参数的不同选项值
max_depth = [2,3,4,5,6]
min_samples_split = [2,4,6,8]
min_samples_leaf = [2,4,8,10,12]
# 将各参数值以字典形式组织起来
parameters = {'max_depth':max_depth, 'min_samples_split':min_samples_split, 'min_samples_leaf':min_samples_leaf}
# 网格搜索法,测试不同的参数值
grid_dtcateg = GridSearchCV(estimator = tree.DecisionTreeClassifier(), param_grid = parameters, cv=10)
# 模型拟合
grid_dtcateg.fit(X_train, y_train)
# 返回最佳组合的参数值
print('最佳组合的参数值:\n',grid_dtcateg.best_params_)

# 导入第三方模块
from sklearn import metrics
# 构建分类决策树
CART_Class = tree.DecisionTreeClassifier(max_depth=grid_dtcateg.best_params_['max_depth'],
                                         min_samples_leaf = grid_dtcateg.best_params_['min_samples_leaf'],
                                         min_samples_split=grid_dtcateg.best_params_['min_samples_split'])
# 模型拟合
decision_tree = CART_Class.fit(X_train, y_train)
# 模型在测试集上的预测
pred = CART_Class.predict(X_test)
# 模型的准确率
print('模型在测试集的预测准确率:\n',metrics.accuracy_score(y_test, pred))

最佳组合的参数值: {‘max_depth’: 6, ‘min_samples_leaf’: 4, ‘min_samples_split’: 4}
模型在测试集的预测准确率: 0.8116591928251121

3 绘制ROC曲线

# 绘制ROC曲线
# 导入第三方包
import matplotlib.pyplot as plt
y_score = CART_Class.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
# plt.show()

在这里插入图片描述

4 绘制决策树图

# 导入第三方模块
from sklearn.tree import export_graphviz
from IPython.display import Image
import pydotplus
from sklearn.externals.six import StringIO
# 绘制决策树
dot_data = StringIO()
export_graphviz(
    decision_tree,
    out_file=dot_data,  
    feature_names=predictors,
    class_names=['Unsurvived','Survived'],  
    # filled=True,
    rounded=True,  
    special_characters=True
)
# 决策树展现
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png()) 

在这里插入图片描述

五、随机森林实例

同第四部分决策树实例数据,在上例数据处理后的基础上,构建随机森林实例。

1 随机森林模型

# --------- 构建随机森林 --------------------
from sklearn import ensemble\

RF_class = ensemble.RandomForestClassifier(n_estimators=200, random_state=1234)
# 随机森林的拟合
RF_class.fit(X_train, y_train)
# 模型在测试集上的预测
RFclass_pred = RF_class.predict(X_test)
# 模型的准确率
print('模型在测试集的预测准确率:\n',metrics.accuracy_score(y_test, RFclass_pred))

模型在测试集的预测准确率: 0.852017937219731

2 绘制ROC曲线

# 绘制ROC曲线
y_score = RF_class.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
roc_auc = metrics.auc(fpr,tpr)
# 绘图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
plt.plot(fpr, tpr, color='black', lw = 1)
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
plt.show()

在这里插入图片描述

3 变量的重要程度

# 变量的重要性程度值
importance = RF_class.feature_importances_
# 构建含序列用于绘图
Impt_Series = pd.Series(importance, index = X_train.columns)
# 对序列排序绘图
Impt_Series.sort_values(ascending = True).plot('barh')
plt.show()

在这里插入图片描述

三、GBDT模型

GBDT(Gradient Boosting Decision Tree,梯度提升树)
随机森林的随机性,会导致树与树之间并没有太多的相关性,往往会导致随机森林算法在拟合效果上遇到瓶颈。


  1. 参考博文:https://blog.csdn.net/qq_36523839/article/details/82383597 ↩︎

  2. 从零开始学Python数据分析与挖掘/刘顺祥著.—北京:清华大学出版社,2018ISBN 978-7-302-50987-5 ↩︎

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步,慕至千里

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值