【案例】使用sklearn构造决策树模型

包括决策树原理简介,剪枝策略,集成算法及使用sklearn实现

这里只是简单的记录,详细参考:https://www.cnblogs.com/wangleBlogs/p/11131505.html

原理简介

熵,N为类别个数

信息增益

信息增益率

 基尼系数

分类

回归

1.对决策树的理解

决策树是一种判别式模型,目的是为了让模型的不确定性降低的越快越好(能够从样本数据的特征属性中,通过简单的决策规则预测目标变量的值),过程包括特征选择、决策树生成、决策树剪枝。三种决策树算法:ID3,C4.5,CART

2.三种决策树算法对比

ID3

算法核心:最大信息增益

缺点:

  • ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。
  • 对倾向于可取值数目较多的属性。
  • ID3算法对于缺失值的情况没有做考虑。
  • 没有考虑过拟合的问题

C4.5

算法核心:最大信息增益比

缺点:

  • 在树构造过程中,C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算,需要对数据集进行多次的顺序扫描和排序,因而导致算法效率降低。
  • C4.5算法只适用于能够驻留于内存的数据集,当训练集大于内存容量时,程序则无法运行。
  • C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率

CART

算法核心:最小化不纯度

特点

支持连续值处理

支持缺失值处理

支持剪枝

3.决策树优缺点

优点

  • 不需要预处理,不需要提前归一化,处理缺失值;
  • 既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值;
  • 简单直观,生成的决策树很直观;
  • 使用决策树预测的代价是O(log2m)O(log2m)。 m为样本数;
  • 可以处理多维度输出的分类问题;
  • 相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释;
  • 可以交叉验证的剪枝来选择模型,从而提高泛化能力;
  • 对于异常点的容错能力好,健壮性高。

缺点

  • 决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进;
  • 决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决;
  • 寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善;
  • 有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决;
  • 如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

4.CART树递归实现过程

https://blog.csdn.net/qq_43468807/article/details/105969232

  1. 对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。
  2. 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
  3. 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数,对于离散值和连续值的处理方法和基尼系数的计算见第二节。缺失值的处理方法和上篇的C4.5算法里描述的相同。
  4. 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2。
  5. 对左右的子节点递归的调用1-4步,生成决策树。

5.CART树参数

https://blog.csdn.net/qq_40195360/article/details/87605676

在这里插入图片描述

6.过拟合出现的原因及措施

原因

  1. 在决策树构建的过程中,没有对生长进行限制(剪枝)
  2. 样本中有一些噪声数据,噪声数据对决策树的构建的干扰很多,没有对噪声数据进行有效的剔除。

措施

  1. 选择合理的参数进行剪枝,可以分为预剪枝后剪枝,我们一般用后剪枝的方法来做
  2. K-folds交叉验证
  3. 减少特征,减少相关性较高的特征

7.决策树与逻辑回归的区别

  1. 逻辑回归着眼于对整体数据的拟合,在整体结构上优于决策树; 但是决策树采用分割的方法,深入到数据内部,对局部结构的分析是优于逻辑回归;
  2. 逻辑回归对线性问题把握较好,因此我们在建立分类算法的时候也是优先选择逻辑回归算法,决策树对非线性问题的把握较好;
  3. 从本质来考虑,决策树算法假设每一次决策边界都是和特征相互平行或垂直的,因此会将特征空间划分为矩形,因而决策树会产生复杂的方程式,这样会造成过拟合现象;逻辑回归只是一条平滑的边界曲线,不容易出现过拟合现象。

8.预剪枝与后剪枝

https://blog.csdn.net/u012328159/article/details/79285214/

  • 预剪枝(pre-pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。
  • 后剪枝(post-pruning):后剪枝就是先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛华性能的提升,则把该子树替换为叶结点。

9.bagging和boosting区别

随机森林:

  1. 不容易出现过拟合,因为选择训练样本的时候就不是全部样本。
  2. 可以既可以处理属性为离散值的量,比如ID3算法来构造树,也可以处理属性为连续值的量,比如C4.5算法来构造树。
  3. 对于高维数据集的处理能力令人兴奋,它可以处理成千上万的输入变量,并确定最重要的变量,因此被认为是一个不错的降维方法。此外,该模型能够输出变量的重要性程度,这是一个非常便利的功能。
  4. 分类不平衡的情况时,随机森林能够提供平衡数据集误差的有效方法

Adaboost

  1. 对噪声点敏感,不能并行计算
  2. 可以使用各种方法构造子分类器,Adaboost算法提供的是框架
  3. 简单,不用做特征筛选
  4. 相比较于RF,更不用担心过拟合问题

bagging

  1. 从样本集中有放回的采样n个训练样本
  2. 用着n个样本训练分类器
  3. 得到m个分类器
  4. 将数据放在m个分类器上跑,结果以少数服从多数投票

boosting:更加关注错分的样本

一种迭代算法,针对同一个训练集训练不同的分类器(弱分类器),然后进行分类,对于分类正确的样本权值低,分类错误的样本权值高(通常是边界附近的样本),最后的分类器是很多弱分类器的线性叠加(加权组合),分类器相当简单。实际上就是一个简单的弱分类算法提升(boost)的过程。

决策树/集成学习面试总结 - 知乎

10.GDBT的特点

优点:

(1)预测阶段计算速度快,树与树之间可并行化计算

(2)在分布稠密的数据集上,泛化能力和表达能力都很好,这使得GBDT在Kaggle的众多竞赛中,经常名列榜首

(3)采用决策树作为弱分类器是的GBDT模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的预处理归一化等。

局限性:

(1)GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。

(2)GBDT在处理文本分类特征问题上,相对其他模型的优势不如它在处理数值特征时明显

(3)训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度

剪枝策略

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

后剪枝:通过一定的衡量标准,叶子节点越多,损失越大

集成算法

bagging:随机森林

boosting:AdaBoost,Xgboost

stacking

代码实现

报错InvocationException: GraphViz's executables not found

解决:https://blog.csdn.net/hawk_2016/article/details/82254228

import os
import pandas as pd
import pydotplus
from IPython.display import Image
from sklearn.datasets import fetch_california_housing
from sklearn import tree
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split, GridSearchCV

os.environ["PATH"] += os.pathsep + 'D:\\Program Files\\Graphviz\\bin'
# 导入数据
housing = fetch_california_housing()

# 划分训练测试集
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)
dtr.score(data_test, target_test)
# 决策树可视化
dot_data = tree.export_graphviz(
    dtr,
    out_file=None,
    feature_names=housing.feature_names[6:8],
    filled=True,
    impurity=False,
    rounded=True
)

graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")
Image(graph.create_png())

# 随机森林
rfr = RandomForestRegressor(random_state=42)
rfr.fit(data_train, target_train)
rfr.score(data_test, target_test)

# 网格搜索
tree_param_grid = {'min_samples_split': list((3, 6, 9)), 'n_estimators': list((10, 50, 100))}
grid = GridSearchCV(RandomForestRegressor(), param_grid=tree_param_grid, cv=5)
grid.fit(data_train, target_train)
means = grid.cv_results_['mean_test_score']
params = grid.cv_results_['params']

rfr = RandomForestRegressor(min_samples_split=3, n_estimators=100, random_state=42)
rfr.fit(data_train, target_train)
rfr.score(data_test, target_test)

# 特征重要性排序
pd.Series(rfr.feature_importances_, index=housing.feature_names).sort_values(ascending=False)

树模型参数:

  • 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:要建立树的个数

sklearn是一个Python的机器学习库,里面包含了很多机器学习算法的实现。其决策树是一个常用的分类和回归算法,在sklearn有完整的决策树实现。 使用sklearn决策树案例的步骤如下: 1. 导入必要的库和数据集:首先需要导入sklearn的decisiontree模块,以及其他可能需要的库,如numpy和pandas。然后,将准备好的数据集加载到程序。 2. 数据预处理:对于决策树模型,数据需要进行一定的预处理。这包括对数据进行缺失值处理、特征选择、特征缩放等。可以使用sklearn的preprocessing模块提供的函数进行处理。 3. 构建决策树模型使用sklearn的DecisionTreeClassifier来构建决策树模型。可以设置的深度、最小叶节点数、最小拆分样本数等参数。 4. 拟合模型:将准备好的训练数据传入fit函数进行模型拟合。模型会根据传入的数据进行训练,学习到数据的特征和标签之间的关系。 5. 预测和评估:使用训练好的模型对测试数据进行预测,得到预测结果。可以使用sklearn的predict函数来进行预测。然后,通过与真实标签进行比较,可以使用准确性、精确度、召回率等指标评估模型的性能。 6. 可视化决策树:如果希望可视化决策树,可以使用sklearn的export_graphviz函数生成Graphviz格式的决策树图形,然后使用Graphviz库进行展示。 总结来说,使用sklearn决策树案例需要导入库和数据集、预处理数据、构建模型、拟合模型、预测和评估模型,最后可以选择性地对决策树进行可视化。通过这个过程,我们可以使用决策树算法来解决分类和回归问题,并对模型性能进行评估和可视化展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值