决策树的实现和调优(sklearn,GridSearchCV)

前言

上一篇讲了决策树的详细的原理。并手写了ID3的实现。
desision-tree详细原理介绍
本篇就从利用现有sklearn的包,实现决策树

决策树实现

决策树模型简单描述

sklearn提供了两种决策树模型
DecisionTreeClassifier --分类决策树,用于分类任务
DecisionTreeRegressor --回归决策树,用于回归任务

参数介绍

DecisionTreeClassifier 参数
class sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0)[source]
  1. criterion
    前一篇讲了决策树其实就是在节点分裂上选择最优特征的最优值,进而让划分后的数据集的混乱程度降低,讲了三种分裂节点的标准,分别是信息增益信息增益比gini系数
    criterion有两个可选值:
参数解释
entropy表示最终节点分裂标准用的是信息增益或者信息增益比,因为他们在公式计算上都是基于entropy交叉熵的
gini表示最终节点分裂标准用的是gini系数

通常情况下,信息增益和信息增益比对混乱程度的惩罚很大,也就是对数据更敏感,所以如果数据是高维或者数据噪声比较大时,如果使用entropy 就更容易过拟合,所以通常情况下都喜欢用gini系数

  1. splitter
    决策树是通过在每个节点上寻找最优,进而让整棵树达到最优,但是往往并不是节点最优就代表整棵树最优,所以随之想到就是一次性生成很多棵树,在生成的所有树中找到最优的。

这种生成多棵树的模式下,在树的节点分裂的时候,并不会让所有的特征都参与,而是随机的抽取部分特征来进行选择分裂点,然后,这时候就用到了spllitter,默认为best

best表示对这部分的特征进行分裂的时候,依旧是选择让纯度最低的进行划分(gini指标或者是entropy )
random表示对这部分的特征进行分裂的时候,并不考虑什么纯度指标,而是真的随机划分
  1. random_state
    默认为None,表示树分裂时是随机的,具体我还不太明白

通过以上的参数我们其实已经可以通过模型来生成树模型了

from sklearn import tree
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter="random")

-------------插播----------------
现在问题在于,树已经生成了,树可能存在过拟合和欠拟合等情况,所以就需要考虑剪枝等操作了,也就是需要一些参数来限制我生成的这棵树合适才能停止生长

  1. max_depth
    限制树的最大深度,大于这个深度的,全部剪掉

  2. min_samples_leaf
    在节点分支时,表示分支后的节点至少要含有至少min_samples_leaf 个样本,否则这个节点就不分

  3. min_samples_split
    在节点分支时,表示这个节点本身必须含有至少min_samples_split个样本,否则这个节点就不分,注意和上面一个参数区分,上面是讲这个节点分支后的节点的含有样本最小个数,而这个参数是将这个节点还没分之前自己本身所含有的样本最小个数

  4. max_features
    在节点分裂时,考虑的最大的特征数量,也就是在每一个节点分支划分时,并不是所有的都特征都考虑,而是考虑一部分,大于max_features 的特征都将被舍弃。

  5. min_impurity_decrease
    在节点分支划分时,如果你的criterion用的是entropy ,也就是信息增益或者信息增益比,这个参数就表示信息增益或者信息增益比小于min_impurity_decrease时,节点将不进行划分。

  6. class_weight & min_weight_fraction_leaf
    这两个主要是考虑到样本不平衡,比如正负样本是1:99的时候,这时候就需要将正样本的权重设置得很大,也就说将正样本的影响长度设置大一些。就用到这两个参数。

基于以上,我们就可以建立一颗剪枝后的最优树了

clf = tree.DecisionTreeClassifier(criterion="gini"
                                  ,random_state=10
                                  ,max_depth=30
                                  ,splitter="random"
                                  ,min_samples_leaf=10
                                  ,min_samples_split=10
                                 )
clf = clf.fit(Xtrain,Ytrain)

以上已经介绍清楚了每个参数的意义,这些参数都是超参数,我们是可以自己调节的,那到底该这些参数该选多大呢。自然暴力的办法肯定是把逐个参数都设置一遍,然后比较每个模型的的score情况,高的就是最优模型,那组参数就是我们想要的,但是这样很累。
sklearn提供了一种方法,来帮我们来找出这组参数,那就是GridSearch

网格搜索GridSearch

网格搜索是用于选取模型最优参数组合的一种方法,他由sklearn提供。在使用过程中,我们只需要把我们使用的模型的实例,以及模型待待调试的参数给他,他就可以给我得出一组最优的参数组合。

sklearn.model_selection.GridSearchCV(
estimator, 
param_grid, 
scoring=None,
 n_jobs=None,
 iid=’warn’, 
refit=True, 
cv=’warn’, 
verbose=0, 
pre_dispatch=2*n_jobs’, 
error_score=raise-deprecating’, 
return_train_score=False)

参数介绍
  1. estimator,
    模型的分类器,我们如果是要找决策树的最优参数,则输入的就是我们创建的决策树实例。
  2. param_grid
    一组需要优化的参数取值,必须是字典类型传入,比如
param = [{'criterion':['gini'],'max_depth':[30,50,60,100],'min_samples_leaf':[2,3,5,10],'min_impurity_decrease':[0.1,0.2,0.5]},
         {'criterion':['gini','entropy']},
         {'max_depth': [30,60,100], 'min_impurity_decrease':[0.1,0.2,0.5]}]

模型就会在这些可取的值中,找到一组最优的给我们。

  1. scoring=None
    模型评价标准所选模型不同,评价准则不同。比如scoring=”accuracy”。
    如果不写,或者为None,则默认使用estimator的误差估计函数
  2. n_jobs
    所用到的进程数
  3. refit
    默认为True,表示模型将采用交叉验证的模式来找到最优参数
  4. cv
    交叉验证参数,默认None,使用三折交叉验证。
  5. verbose
    是否打印日志,0打印,1偶尔打印,大于1则实时打印。

介绍完了决策树和网格搜索只有,下面举个例子,来完整演示调优过程。

决策实例

  1. 导入头文件
    有时间再写吧。
  • 10
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据挖掘是指从数据库中抽取隐含的、具有潜在使用价值信息的 过程,是一种新型的数据分析技术,已被广泛应用于金融、保险、政 府、教育、运输以及国防等领域。 数据分类是数据挖掘中一个重要的内容。分类存在很多方法,其 中决策树算法是以实例为基础的归纳学习算法,以其易于提取显式规 则、计算量相对较小、可以显示重要的决策属性和较高的分类准确率 等优点而得到广泛的应用。据统计,目前决策树算法是利用最广泛的 数据挖掘算法之一。 然而在实际应用过程中,现存的决策树算法也存在着很多不足之 处,如计算效率低下、多值偏向等。因此,进一步改进决策树,提高 决策树的性能,使其更加适合数据挖掘技术的应用要求具有重要的理 论和实际意义。 本文针对上述数据库知识发现的不足,进行深入的研究,探索数 据挖掘中决策树分类的组合优化算法,以便更好地提高分类的准确 性。应用于实际工作中,主要研究工作如下: 首先,从宏观上介绍了数据挖掘和分类技术的理论基础,并重点 对决策树算法进行了分析和比较。 然后,提出了一种新的适合于高维数据库的组合优化决策树算 法。相比于传统的分类算法,该算法从降维、属性选择、可扩展性和 剪枝等方面进行了改进。其中最主要是提出基于加权属性协调度并结 合简化预剪枝策略的决策树算法一DTBAC算法,以及加强算法可扩 展性的FAVC集。 最后,着重介绍了所研发的组合优化决策树分类器系统。它以 DTBAC算法为核心算法生成分类器,并应用到医学领域对病人进行 分类。通过对比分析发现,DTBAC算法在总体性能上要优于目前被 广泛采用的ID3算法。
决策树模型的参数调优可以通过网格搜索(Grid Search)或随机搜索(Random Search)来实现。这里以网格搜索为例进行说明。 网搜索是一种穷的方法,可以对指定的参数组合进行全排列搜索,找到最佳的参数组合,并返回最佳的模型。 具体步骤如下: 1. 导入需要的库和数据集 ``` python import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import GridSearchCV from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` 2. 定义模型 ``` python dt = DecisionTreeClassifier() ``` 3. 定义参数组合搜索空间 ``` python param_grid = {'max_depth': [3, 4, 5, 6, 7, 8], 'min_samples_split': [2, 3, 4, 5, 6, 7, 8, 9, 10], 'min_samples_leaf': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]} ``` 4. 进行网格搜索 ``` python grid_search = GridSearchCV(dt, param_grid, cv=10, scoring='accuracy') grid_search.fit(X, y) ``` 5. 输出最佳参数组合和最佳模型 ``` python print("Best parameters: {}".format(grid_search.best_params_)) print("Best cross-validation score: {:.2f}".format(grid_search.best_score_)) print("Best estimator:\n{}".format(grid_search.best_estimator_)) ``` 这里,我们定义了三个参数 max_depth、min_samples_split、min_samples_leaf 的搜索空间,然后通过 GridSearchCV 函数对决策树模型进行了网格搜索。其中,cv 指定了交叉验证的次数,scoring 指定了评估指标,这里使用准确率。 最后,输出了最佳参数组合、最佳交叉验证得分和最佳模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值