码迷,mamicode.com
首页 > 其他好文 > 详细

sklearn中的决策树

时间:2020-12-29 11:00:43      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:min   没有   inf   功能   索引   legend   定义   mod   影响   

一、sklearn中的决策树模块:sklearn.tree

1、sklearn中决策树的类都在‘tree’这个模块之下。这个模块 总共包含五个类:

技术图片

2、sklearn的基本建模流程

技术图片

3、下面对sklearn.tree这个模块之下的决策树类进行逐个说明:

3.1、分类树:tree.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, min_impurity_split=None,
class_weight=None, presort=False)

重要参数:

(1)criterion:

Criterion这个参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:
1)输入”entropy“,使用信息熵(Entropy)
2)输入”gini“,使用基尼系数(Gini Impurity)

(2)random_state & splitter:

       random_state用来设置分枝中的随机模式的参数,默认为None,设置的话,是为了保证每次随机生成的数是一致的(即使是随机的);

如果不设置,那么每次生成的随机数都是不同的,也就是说决策树其实是随机的(可以通过多运行几次score测试下)。

  splitter也是用来控制决策树中的随机选项的,有两种输入值:

    1)输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝。重要性可以通过属性feature_importances_查看。

    2)输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式。

当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能性。当然,树一旦建成,我们依然是使用剪枝参数来防止过拟合。

(3)剪枝参数:

  注释:不加限制时,决策树会生长到没有更多的特征可用为止,但这样往往会造成过拟合,既训练集上表现很好,测试集上表现却很差。因此为了让模型有更好的泛化性,我们需要

对决策树进行剪枝。

  1)剪枝参数1:max_depth

   目的:限制树的最大深度,超过设定深度的树枝全部剪掉。在高纬度低样本量时非常有效,决策树每多生长一层,对样本的需求量会增加一倍。所以限制树的深度有利于防止过拟合。

  建议:实际使用时,建议从=3开始尝试,看看拟合的效果在决定是否增加深度。

  2)剪枝参数2:min_samples_leaf & min_samples_split

  min_samples_leaf : 该参数限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分支就不会发生。

       建议:该参数设置的太小会引起过拟合,太大会阻止模型学习数据,一般搭配max_depth使用。

  min_samples_split : 该参数限定,一个节点必须包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分支就不会发生。

  3)剪枝参数3:max_features & min_impurity_decrease

  max_features : 该参数限定,分枝时需考虑的特征个数,超过限制个数的特征都会被舍弃。该参数是用来限制高纬度数据的过拟合的剪枝参数。

  min_impurity_decrease : 该参数限定信息增益的大小,信息增益小于设定数值的分枝不会发生。为0.19版本中更新的功能,0.19版本之前使用的时min_impurity_split。

  4)确定最优的剪枝参数的时候,可以采取如下方式:

import matplotlib.pyplot as plt
test = []
for i in range(10):
  clf = tree.DecisionTreeClassifier(max_depth=i+1
                         ,criterion="entropy"
                         ,random_state=30
                         ,splitter="random"
                                         )
  clf = clf.fit(Xtrain, Ytrain)
  score = clf.score(Xtest, Ytest)
  test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

(4)目标权重参数:

  1)class_weight & min_weight_fraction_leaf

  class_weight :

    该参数默认为None,表示自动给数据集中所有标签相同的权重

    该参数为‘blanced’时,每个类别的权重为该类别样本数的倒数。个人觉得惩罚项就用样本量的倒数未尝不可,因为乘以样本量都是1,相当于‘balanced‘这里是多乘以了一个常数.

    也可手动输入权重,代码举例如下:     

import numpy as np

y = [0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2]  #标签值,一共16个样本

from sklearn.utils.class_weight import compute_class_weight 
class_weight = {0:1,1:3,2:5}   # {class_label_1:weight_1, class_label_2:weight_2, class_label_3:weight_3}
classes = np.array([0, 1, 2])  #标签类别
weight = compute_class_weight(class_weight, classes, y)
print(weight)   # 输出:[1. 3. 5.],也就是字典中设置的值

  min_weight_fraction_leaf : 有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。

附::tree.DecisionTreeClassifier中的重要属性与接口如下:

#对数据进行拟合
clf.fit(Xtrain,Ytrain)

#求得测试集的准确率
clf.score(Xtest,Ytest)

#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)

#predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)

 

总结:分类树需要掌握的八个参数,一个属性,四个接口:

八个参数:Criterion,两个随机性相关的参数(random_state,splitter),五个剪枝参数(max_depth,
min_samples_split,min_samples_leaf,max_feature,min_impurity_decrease)
一个属性(该参数用于查看哪个特征对预测结果贡献最大):feature_importances_
四个接口:fit,score,apply,predict

 

 

 3.2、tree.DecisionTreeRegressor

class sklearn.tree.DecisionTreeRegressor (criterion=’mse’, 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, min_impurity_split=None, presort=False)

 

 注释:几乎所有参数,属性及接口都和分类树一样,但要注意的是,回归树中没有标签分布是否均衡的问题,依次没有class_weight这样的参数。

3.2.1 重要参数属性及接口:

(1)criterion:

   1)输入‘mse’ : 使用均方误差。mse的公式如下:

                                技术图片

其中N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签。MSE的本质是样本真实数据与回归结果的差异。

   2)输入‘friedman_mse’ : 使用费尔德曼均方误差。

   3)输入‘mae’ : 使用绝对平均误差MAE(mean absolute error)

(2)重要属性:最重要的依然是feature_importances_

(3)重要接口:依然是apply,fit,pridect,score最核心。

3.2.2 接口score

  回归树的接口score返回的是R平方,并不是MSE。R平方被定义如下:

                   技术图片

 

其中u是残差平方和(MSE*N),v是总平方和,N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签,y帽是真实数值标签

的平均数。R平方可以为正也可为负,当模型的残差平方和远远大于模型的总平方和,模型非常糟糕,R平方就会为负,而均方误差永远为正。但在sklearn中,

虽然均方误差永远为正,但是sklearn当中使用军方误差作为评判标准时,却是计算的‘负均方误差’,这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,

均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss),因此在sklearn当中,都以负数表示。真正的均方误差MSE的数值,其实就是neg_mean_squared_error

去掉负号的数字。

实例:

from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston = load_boston()
regressor = DecisionTreeRegressor(random_state=0)
cross_val_score(regressor, boston.data, boston.target, cv=10,
        scoring = "neg_mean_squared_error")

 

 

3.3、tree.export_graphviz()

目的:绘图专用,将生成的决策树转化为dot格式,方便可视化。

实例:

例1:

feature_name = [酒精,苹果酸,,灰的碱性,,总酚,类黄酮,非黄烷类酚类,花青素,颜色强度,色调,od280/od315稀释葡萄酒,脯氨酸]
import graphviz
dot_data = tree.export_graphviz(clf
                                ,feature_names= feature_name
                                ,class_names=["琴酒","雪莉","贝尔摩德"] # 标签名字
                                ,filled=True        # 到底填不填充颜色,颜色越深,代表不纯度越低,且叶子节点的每个颜色代表一个类别。
                                ,rounded=True       # 框的形状
                                ,out_file=None
                               )
graph = graphviz.Source(dot_data)     # 将我们画的树给导出来
graph

 

例2:

dot_data = tree.export_graphviz(clf
                                ,out_file=None,                                                                  
                                ,feature_names=iris.feature_names  
                                ,class_names=iris.target_names 
                                ,filled=True
                                ,rounded=True 
                                ,special_characters=True
                               )  
graph = graphviz.Source(dot_data)  
graph

 

其中,out_file为dot输出的目录;

   feature_names为特征的名字;

   class_names为标签的名字;

   filled=True,到底填补填充颜色,颜色越深,代表不纯度越低,且叶子节点的每个颜色代表一个类别。

   rounded=True,为框的形状。

 

高随机版本的分类树和回归树暂时先不记笔记。

sklearn中的决策树

标签:min   没有   inf   功能   索引   legend   定义   mod   影响   

原文地址:https://www.cnblogs.com/wdkblog/p/14175449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!