深入浅出决策树

admin 2025年3月16日00:08:48评论11 views字数 12621阅读42分4秒阅读模式
深入浅出决策树

决策树定义

01

树想必大家都会比较熟悉,是由节点和边两种元素组成的结构。

理解树,就需要理解几个关键词:根节点、父节点、子节点和叶子节点。

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

深入浅出决策树

决策树利用如上图所示的树结构进行决策,每一个非叶子节点是一个判断条件,每一个叶子节点是结论。从根节点开始,经过多次判断得出结论。

从一个分类例子说起:

通过一个文件的信息(包括后缀、大小、来源、长度)来判断该文件是否是病毒,从而给出一定的参考建议。下表是现在能够掌握的信息,我们的目标是通过对下面的训练数据进行分析建立一个预测文件是否是病毒的模型。

文件后缀
文件大小(KB)
文件来源
文件名长度
是否病毒
exe
5
下载
8
exe
32
下载
12
exe
128
邮件
15
exe
5400
U盘
28
dll
2
邮件
25
dll
11
下载
32
dll
4318
U盘
28
dll
8
U盘
21
bat
10
下载
28
bat
41
邮件
33
bat
216
U盘
48
bat
15
下载
48

然后通过该模型来判断下表中的文件是否是病毒。

文件后缀
文件大小(KB)
文件来源
文件名长度
是否病毒
exe
18
邮件
18
dll
7
下载
7
bat
78
U盘
5
(注:上表中的数据仅为测试虚构数据,不具有任何参考的意义)

如何综合利用这些属性去判断该文件是否是病毒?决策树的做法是每次选择一个属性进行判断,如果不能得出结论,继续选择其他属性进行判断,直到能够“肯定地”判断出结果或者是上述属性都已经使用完毕。比如说我们要判断一个文件是否是病毒,我们可以先根据文件后缀进行判断,如果不能得出结论,再根据文件大小作判断,这样以此类推,直到可以得出结论为止。

决策树用树结构实现上述的判断流程,如图所示:

深入浅出决策树

通过一开始的训练数据,我们可以建立下面的决策树。

其输入是文件的信息,输出是文件是否是病毒。

如果要判断某一文件是否是病毒,直接根据文件的文件后缀、文件大小、文件来源、文件名长度就可以分析得出文件是否是病毒。

如某文件的信息为:

[文件后缀,文件大小,文件来源,文件名长度]=[bat,15,下载,48]

将信息输入上述决策树,可以得到下列的分析步骤和结论。

第一步:根据该文件的文件后缀判断,选择“bat”分支;
深入浅出决策树
第二步:根据文件的大小进行选择,选择文件大小”<20”这一分支;
深入浅出决策树
第三步:根据文件名长度进行选择,选择”>=30”这一分支,得出该文件是病毒的结论。
深入浅出决策树
深入浅出决策树

决策树构建

02

如何构建上图所示一棵决策树呢?决策树的构建是数据逐步分裂的过程,构建的步骤如下:

步骤1:将所有的数据看成是一个节点,进入步骤2;
步骤2:从所有的数据特征中挑选一个数据特征对节点进行分割,进入步骤3;
步骤3:生成若干子节点,对每一个子节点进行判断,如果满足停止分裂的条件,进入步骤4;否则,进入步骤2;
步骤4:设置该节点是子节点,其输出的结果为该节点数量占比最大的类别。
从上述步骤可以看出,决策生成过程中有三个重要的问题:
(1)数据如何分割
(2)如何选择分裂的属性
(3)什么时候停止分裂

2.1数据如何分割

假如我们已经选择了一个分裂的属性,那怎样对数据进行分裂呢?

分裂属性的数据类型分为离散型和连续性两种情况,对于离散型的数据,按照属性值进行分裂,每个属性值对应一个分裂节点;对于连续性属性,一般性的做法是对数据按照该属性进行排序,再将数据分成若干区间,如[0,10]、[10,20]、[20,30]…,一个区间对应一个节点,若数据的属性值落入某一区间则该数据就属于其对应的节点。

分类信息表
(1)属性1“文件后缀”是离散型变量,有三个取值,分别为exe、dll和bat,根据三个取值对原始的数据进行分割,如下表所示:
文件后缀
文件大小(KB)
文件来源
文件名长度
是否病毒
exe
5
下载
8
exe
32
下载
12
exe
128
邮件
15
exe
5400
U盘
28
dll
2
邮件
25
dll
11
下载
32
dll
4318
U盘
28
dll
8
U盘
21
bat
10
下载
28
bat
41
邮件
33
bat
216
U盘
48
bat
15
下载
48
属性1数据分割表
取值
是病毒
不是病毒
exe
3
1
dll
1
3
bat
3
1
上表可以表示成如下的决策树结构:
深入浅出决策树
(2)属性2是连续性变量,这里将数据分成三个区间,分别是[0,10]、(10,100]、(100,-],则每一个区间的分裂结果如下:                    
属性2数据分割表
文件大小
是病毒
不是病毒
[0,10]
2
2
(10,100]
3
1
(100,—]
2
2

上表可以表示成如下的决策树结构:

深入浅出决策树

2.2如何选择分裂的属性

我们知道了分裂属性是如何对数据进行分割的,那么我们怎样选择分裂的属性呢?

决策树采用贪婪思想进行分裂,即选择可以得到最优分裂结果的属性进行分裂。那么怎样才算是最优的分裂结果?最理想的情况当然是能找到一个属性刚好能够将不同类别分开,但是大多数情况下分裂很难一步到位,我们希望每一次分裂之后子节点的数据尽量”单一”,以下图为例:

深入浅出决策树

从上图可以明显看出,属性1分裂后的子节点比属性2分裂后的子节点更单一:属性2分裂后每个节点的两类的数量还是相同,跟根节点的分类结果相比几乎没有提高;按照属性1分裂后每个节点各类的数量相差比较大,可以很大概率认为第1个子节点的输出结果为类1,第2个子节点的输出结果为2。

选择分裂属性是要找出能够使所有子节点数据最单一的属性,决策树使用信息增益或者信息增益率作为选择属性的依据。

2.2.1信息增益

用信息增益表示分裂前后跟的数据复杂度和分裂节点数据复杂度的变化值。

在详细了解信息增益之前,还需对信息熵进行一定的了解

(1)信息

在信息论中,熵(entropy)是随机变量不确定性的度量,也就是熵越大,则随机变量的不确定性越大。设X是一个取有限个值得离散随机变量,其概率分布为:

深入浅出决策树

则随机变量X的熵定义为:

深入浅出决策树

其中Pi表示类i的数量占比。以二分类问题为例,如果两类的数量相同,此时分类节点的纯度最低,熵等于1;如果节点的数据属于同一类时,此时节点的纯度最高,熵等于0。

(2)条件熵

设有随机变量(X, Y),其联合概率分布为:

深入浅出决策树

条件熵H(Y|X)表示在已知随机变量X的条件下,随机变量Y的不确定性。随机变量X给定的条件下随机变量Y的条件熵H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:

深入浅出决策树

当熵和条件熵中的概率由数据估计得到时(如极大似然估计),所对应的熵与条件熵分别称为经验熵和经验条件熵。

信息增益定义信息增益表示由于得知特征A的信息时的数据集D的分类不确定性减少的程度,定义为:

Gain(D,A) = H(D) - H(D|A)

即集合D的信息熵H(D)与特征A给定条件下D的条件熵H(H|A)之差。

理解:选择划分后信息增益大的作为划分特征,说明使用该特征后划分得到的子集纯度越高,即不确定性越小。因此我们总是选择当前使得信息增益最大的特征来划分数据集。
缺点:信息增益偏向取值较多的特征(原因:当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分后的熵更低,即不确定性更低,因此信息增益更大)

信息增益说白了就是分裂前的数据复杂度减去子节点的数据复杂度的和,信息增益越大,分裂后的复杂度减小得越多,分类的效果越明显。

例:

以熵作为节点复杂度的统计量,分别求出下面例子的信息增益,左图表示节点选择属性1进行分裂的结果,右图表示节点选择属性2进行分裂的结果,通过计算两个属性分裂后的信息增益,选择最优的分裂属性。

深入浅出决策树
属性1:
深入浅出决策树
属性2:
深入浅出决策树

由于Gain1<Gain2,所以属性2与属性1相比是更优的分裂属性,故选择属性2作为分裂的属性。

使用信息增益作为选择分裂的条件有一个不可避免的缺点:倾向选择分支比较多的属性进行分裂。

同样是类1:30,类2:25

最理想的分割:[[30,0],[0,25]]

深入浅出决策树

最糟糕的分割:

[[1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [5, 0], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]]
深入浅出决策树

上面两个分割后的H(D|A)都等于0

2.2.2信息增益率

使用信息增益作为选择分裂的条件有一个不可避免的缺点:倾向选择分支比较多的属性进行分裂。为了解决这个问题,引入了信息增益率这个概念。

信息增益率是在信息增益的基础上除以分裂节点数据量的信息增益(听起来很拗口),其计算公式如下:

深入浅出决策树

其中,Info_Gain 表示信息增益

InstrinsicInfo表示分裂子节点数据量的熵,其计算公式为:

深入浅出决策树

其中m表示子节点的数量

ni表示第i个子节点的数据量

N表示父节点数据量

说白了,其实InstrinsicInfo是分裂节点相对父节点的数据量的熵

如果节点的数据链越接近, InstrinsicInfo越大

如果子节点越大, InstrinsicInfo越大

如果InstrinsicInfo越大,Info_Ratio就会越小,从而降低节点分裂时选择子节点多的分裂属性的倾向性。

信息增益率越高,说明分裂的效果越好。

深入浅出决策树

InstrinsicInfo = Entropy([20,35])= 0.994030211477

深入浅出决策树
InstrinsicInfo = Entropy ([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1])= 5.78135971352
属性1的信息增益率:
Info_Ratio1 = 0.6890092384766586/0.945660304601 = 0.7286012060825271
属性2的信息增益率:
Info_Ratio2 = 0.6890092384766586/ 5.78135971352 = 0.11917771469320201
选择属性1作为分裂的属性。
深入浅出决策树

什么时候停止分裂。

停止分裂的条件

决策树不可能不限制地生长,总有停止分裂的时候,最极端的情况是当节点分裂到只剩下一个数据点时自动结束分裂,但这种情况下树过于复杂。一般情况下为了降低决策树复杂度和提高预测的速度,会适当提前终止节点的分裂。

以下是决策树节点停止分裂的一般性条件:

(1)最小节点数

  当节点的数据量小于一个指定的数量时,不继续分裂。两个原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。

(2)熵或者基尼值小于阀值。

 由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度数,节点停止分裂。

(3)决策树的深度达到指定的条件

节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。

(4)所有特征已经使用完毕,不能继续进行分裂。

 被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。

深入浅出决策树

算法原理

03
决策树的构建方法

根据决策树的输出结果,决策树可以分为分类树和回归树,分类树输出的结果为具体的类别,而回归树输出的结果为一个确定的数值。

决策树的构建算法主要有ID3、C4.5、CART三种,其中ID3和C4.5是分类树,CART是分类回归树,ID3、C4.5和CART将在下面的算法原理的中分别讲述。

其中ID3是决策树最基本的构建算法,而C4.5和CART是在ID3的基础上进行优化的算法。

ID3算法

输入:训练数据集D,特征集A,阈值e;
输出:决策树T.
1.计算A中个每个特征对D的信息增益,选择信息增益最大的特征f;
2.如果的信息增益小于阈值e,将D中实例数最大的类作为该节点的类标记,返回该节点树T;
3.如果的信息增益大于阈值e,对该特征f的每一种可能值,依将D分割为若干非空子集,构成多个子节点Dx;
4.对每一个子节点,以该节点Dx为训练集,以该节点的特征Ax为特征集合;
5.若Dx中所有实例属于同一类,将该类作为该节点的类标记,返回该节点树T;
6.若Ax=Ø,将D中实例数最大的类作为该节点的类标记,返回该节点树T;
7.循环上述流程,直至结束;

创建数据集

def create_data_set():
    dataset = [[11'yes'],
               [11'yes'],
               [10'no'],
               [01'no'],
               [01'no']]
    labels = ['usb''exe'# 第一个代表是否从U盘下载来,第二个代表是否是exe文件后缀,第三个代表是否是病毒文件
    print(dataset, labels)
    return dataset, labels

# 计算数据中的信息熵: H = -∑p(x)log2 p(x)
def calc_shannon_ent(dataset):
    numentries = len(dataset)
    labelcounts = {}    # 创建标签字典
    for featvec in dataset:
        currentlabel = featvec[-1]  # 数据的最后一列是标签作为字典的键值
        if currentlabel not in labelcounts.keys():   # 记录属于该标签数据的次数,后面计算熵使用,
            labelcounts[currentlabel] = 0   # 如果字典里没有这个标签即键值,则创建并赋值为0,如果存在该标签则加1
        labelcounts[currentlabel] += 1
    shannonent = 0.0    # 计算熵值
    for key in labelcounts:
        prob = float(labelcounts[key]) / numentries  # 以每个标签出现的频次为概率计算熵值
        shannonent -= prob * log(prob, 2)
    return shannonent

划分数据集

# 按照给定特征划分数据集
def split_data_set(dataset, axis, value):  # dataset为原始输入数据,axis是原始数据的特征位置,value是数据对应的特征值
    retdataset = []
    for featvec in dataset:  # 迭代dataset中的数据
        if featvec[axis] == value:  # 通过迭代判断每个数据特征位置的数据和给定的特征值是否一致
            reducedfeatvec = featvec[:axis]  # 如果条件成立,那么就把该位置前面的数据保存
            reducedfeatvec.extend(featvec[axis+1:])  # 把该位置后面的数据保存,通过这两句就可以把该特征位置删除
            retdataset.append(reducedfeatvec)  # 把保留下来的数据,存储在新的列表里作为一个元素
            '''下面有例子解释一下上面的三句代码
                trees.split_data_set(mydata, 0, 1),输入的数据为mydata, 特征位置为0即axis, 数据特征值为1
执行后的数据
原始数据: [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
划分好的数据:  [[1, 'yes'], [1, 'yes'], [0, 'no']]
原始数据是一个列表,这个列表有5个元素,而每个元素又是一个列表,每个元素列表中又有三个元素
                featvec[axis] == value这句代码的意思是featvec从dataset中获得元素后,例如为第一个元素[1, 1, 'yes'],
此时featvec[axis]是指该元素的第零个位置数据即为1,value为给定的特征划分值为1,此时if成立,执行下面的程序
                reducedfeatvec = featvec[:axis],列表的切片,不会的请查看列表的切片,featvec[:axis]是指把axis位置前面的数据传给reducedfeatvec
,而featvec[axis+1:]是把特征位置后面的数据都保存下来如[1, 'yes'],把保存下来,简单说 这两句意思就是把axis位置删除
把重新组建的数据传给retdata
            '''

    return retdataset
 

信息增益划分数据集

# 选择数据集划分方式,主要通过信息增益进行划分
def choose_bestfeature_to_split(dataset):
    num_features = len(dataset[0]) - 1  # 计算每个元素有多少特征
    print(num_features)  # 只计算前两个数值特征
    base_entropy = calc_shannon_ent(dataset)  # 计算基础香浓熵
    best_info_gain = 0.0
    best_feature = -1
    # 下面为计算信息增益做准备工作
    for i in range(num_features):
        feat_list = [example[i] for example in dataset]  # 利用列表推倒,把每个元素数据的特征提取出来,并创建新列表
        print('feat_list', feat_list)  # 打印出来发现是feat_list [1, 1, 1, 0, 0],即表明把dataset的第0号位置的特征提取出来
        unique_vals = set(feat_list)  # 使用集合元素数据中重复的特征合并
        print('unique_vals', unique_vals)  # 把feat_list [1, 1, 1, 0, 0]重合的合并为unique_vals {0, 1}
        new_entropy = 0.0
        for value in unique_vals:
            subdataset = split_data_set(dataset, i, value)  # 根据特征把同类的数据归类,并计算香浓熵
            prob = len(subdataset)/float(len(dataset))  # 计算概率
            new_entropy += prob * calc_shannon_ent(subdataset)  # 计算条件熵
        info_gain = base_entropy - new_entropy   # 计算信息增益
        if (info_gain > best_info_gain):  # 找出信息增益最大的特征
            best_info_gain = info_gain
            best_feature = i
    return best_feature

创建决策树

# 创建决策树
def create_tree(dataset, labels):
    classlist = [example[-1for example in dataset]
    # 该句代码的意思是,把元素数据的分类信息提取出来,此时classlist = ['yes', 'yes', 'no', 'no', 'no']
    if classlist.count(classlist[0]) == len(classlist):
        return classlist[0]
    '''
    # 第一个递归停止条件,如果classlist中的信息都为同一类,则说明分类已经是纯净的了,无须再划分,返回类别就好
    # 如classlist = ['no', 'no', 'no'],此时classlist[0]出现三次,而列表长度也为3,等式成立执行if语句,即返回类别’no‘
    '''

    if len(dataset[0]) == 1:  # 使用完了所有的特征,但还是无法将数据划分为唯一类别的分组,因此就挑选出现次数最多的类别进行分类
        return max(classlist,key=classlist.count)
    '''
    # 第二个递归停止条件是根据特征判断,因为每次根据特征划分时,后面就会删除该特征,如果遍历完所有特征以后发现classlist还是不纯净,
    # 那么就通过出现的次数划分。如刚开始dataset[0] = [1, 1, 'yes'],有两个特征,一个分类标签,当每根据一个特征进行分类结束时就会
    # 删除该特征,最后只剩下dataset[0] = ['yes'],无法再根据特征进行分类,此时,根据分类列表中把该元素划分到出现类别最多的次数的
    # 分类中,如classlist = ['no', 'yes', 'yes','yes'],此时‘no’出现一次,‘yes’出现三次,因此把该类分为‘yes’,其中通过函数
    # majority_cnt()进行统计。
    '''

 
    bestfeat = choose_bestfeature_to_split(dataset)  # 使用信息增益返回最好的划分特征的列表位置信息
    # 分类的标准是通过ID3算法即信息增益进行划分,返回的是使信息增益增加最大的特征
    bestfeatlabel = labels[bestfeat]
    # 提出该最优特征 第一次特征为'U盘'
    mytree = {bestfeatlabel: {}}
    # 以当前使信息增益最大的特征创建以字典形式迭代的迭代器,此时为mytree = {U盘: {}}
    del (labels[bestfeat])
    # 删除该使用的特征
    featvalues = [example[bestfeat] for example in dataset]
    # 遍历所有元素的最优特征位置对应的特征值featvalues = [1, 1, 1, 0, 0]
    unique_vals = set(featvalues)
    # 转换成集合形式,即去除重复的特征值,集合的互异性可以使相同特征值合并,此时unique_vals = [1,0]
    for value in unique_vals:
        sublabels = labels[:]
        # 复制一份 标签列表
        mytree[bestfeatlabel][value] = create_tree(split_data_set(dataset, bestfeat, value), sublabels)
    return mytree

使用决策树的分类函数进行预测

def classify(inputtree, featlabels, testvec):
    firststr = list(inputtree.keys())[0]
    second_dict = inputtree[firststr]
    feat_index = featlabels.index(firststr)
    for key in second_dict.keys():
        if testvec[feat_index] == key:
            if type(second_dict[key]) == dict:
                classlabel = classify(second_dict[key], featlabels, testvec)
            else:
                classlabel = second_dict[key]
    return classlabel

预测结果

data_set, labels = create_data_set()
decision_tree = create_tree(data_set, labels)
print "决策树:", decision_tree

print classify(decision_tree, labels, [10])
print classify(decision_tree, labels, [11])
print classify(decision_tree, labels, [00])

output:
决策树: {'usb': {0'no'1: {'exe': {0'no'1'yes'}}}}
no
yes
no
深入浅出决策树

 应 用 

04
#coding=utf-8
from sklearn import tree
import pydotplus
 
x=[[1,0,0],[0,1,1],[0,1,0],[1,1,1]]
y=[1,1,0,1]
 
clf = tree.DecisionTreeClassifier()
clf = clf.fit(x, y)
print(clf.predict([[1,0,1]])) # output:1
 
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png("./决策树.png")

深入浅出决策树
DecisionTreeClassifier 参数
criterion:
特征选择标准,【entropy, gini】。默认gini,即CART算法。
splitter:
特征划分标准,【best, random】。best在特征的所有划分点中找出最优的划分点,random随机的在部分划分点中找局部最优的划分点。默认的‘best’适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐‘random’。
max_depth:
决策树最大深度,【int,  None】。默认值是‘None’。一般数据比较少或者特征少的时候可以不用管这个值,如果模型样本数量多,特征也多时,推荐限制这个最大深度,具体取值取决于数据的分布。常用的可以取值10-100之间,常用来解决过拟合。
min_samples_split:
内部节点(即判断条件)再划分所需最小样本数,【int, float】。默认值为2。如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_split*样本数量)作为最小样本数。(向上取整)
min_samples_leaf:
叶子节点(即分类)最少样本数。如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_leaf*样本数量)的值作为最小样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
所以基本上,min_sample_split是分割所需的最小样本数。例如,如果min_sample_split = 6并且节点中有4个样本,则不会发生拆分(不管熵是多少)。在另一方面,min_sample_leaf基本上是叶节点所需的最小样本数。假设min_sample_leaf = 3并且一个含有5个样本的节点可以分别分裂成2个和3个大小的叶子节点,那么这个分裂就不会发生,因为最小的叶子大小为3。
max_features:
在划分数据集时考虑的最多的特征值数量,【int值】。在每次split时最大特征数;【float值】表示百分数,即(max_features*n_features)
random_state:
【int, randomSate instance, None】,默认是None
max_leaf_nodes:
最大叶子节点数。【int, None】,通过设置最大叶子节点数,可以防止过拟合。默认值None,默认情况下不设置最大叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征多,可以加限制,具体的值可以通过交叉验证得到。
min_impurity_decrease:
节点划分最小不纯度,【float】。默认值为‘0’。限制决策树的增长,节点的不纯度(基尼系数,信息增益,均方差,绝对差)必须大于这个阈值,否则该节点不再生成子节点。
class_weight:
类别权重,【dict, list of dicts, balanced】,默认为None。(不适用于回归树,sklearn.tree.DecisionTreeRegressor)
指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。balanced,算法自己计算权重,样本量少的类别所对应的样本权重会更高。如果样本类别分布没有明显的偏倚,则可以不管这个参数。
presort:
bool,默认是False,表示在进行拟合之前,是否预分数据来加快树的构建。

原文始发于微信公众号(SAINTSEC):深入浅出决策树

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月16日00:08:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   深入浅出决策树https://cn-sec.com/archives/3843186.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息