决策树原理详解(无基础的同样可以看懂) |
您所在的位置:网站首页 › 树上有几个人脸怎么画的 › 决策树原理详解(无基础的同样可以看懂) |
一. 决策树简介
决策树(Decision Tree),它是一种以树形数据结构来展示决策规则和分类结果的模型,作为一种归纳学习算法,其重点是将看似无序、杂乱的已知数据,通过某种技术手段将它们转化成可以预测未知数据的树状模型,每一条从根结点(对最终分类结果贡献最大的属性)到叶子结点(最终分类结果)的路径都代表一条决策的规则。决策树就是形如下图的结构(机器学习西瓜书的图): 话不多说,先看图 在介绍决策树流程的时候提到了,寻找最优划分属性是决策树过程中的重点。那么如何在众多的属性中选择最优的呢。 3.1 信息增益在介绍信息增益之前,先介绍一下信息熵的含义。我们理科生都学过化学,热力学里有一个熵的概念,熵就是来形容系统混乱程度的,系统越混乱,熵就越大。信息熵也具有同样的意义,不过它描述的是随机变量的不确定性(也就是混乱程度)。 假设某随机变量的概率分布为: 信息增益虽然在理论上可以找到最优的划分属性,但在某些情况下会存在问题。信息增益比较偏好可取值较多的属性,比如我们的样本有一个属性叫序号,每一个样本都具有一个单独的序号,因此使用序号划分后,每个子结点只有一个样本,熵为0。这样的话信息增益最大,算法就会以此属性作为最优划分属性。这显然与我们的意愿不同。因此引申出了增益比的思想。 可以这么说,增益比就是为了矫正信息增益偏好的问题。为了使算法不偏向可取值较多的属性。 基尼指数也是一个寻找最优划分属性的准则。公式如下: ![]() 到这里我们的划分选择的几种方法就讲完了。我们可以看出,对于每种决策树算法,他们的基本流程是一样的。不同的是,虽然决策树基本流程中的每一步骤的目的一样,但不同算法实现的方式不同。 四. 剪枝处理如果按照我们之前的方法形成决策树后,会存在一定的问题。决策树会无休止的生长,直到训练样本中所有样本都被划分到正确的分类。实际上训练样本中含有异常点,当决策树节点样本越少的时候,异常点就可能使得该结点划分错误。另外,我们的样本属性并不一定能完全代表分类的标准,可能有漏掉的特征,也可能有不准确的特征。这样就会导致决策树在训练集上准确率超高,但是在测试集上效果不好,模型过拟合,泛化能力弱。因此我们需要适当控制决策树的生长。 剪枝处理是防止决策树过拟合的有效手段。剪枝,其实就是把决策树里不该生长的枝叶剪掉,也就是不该划分的节点就不要继续划分了。剪枝分为“预剪枝”和“后剪枝”。两种操作在决策树生辰步骤的位置如下图: 我们之前使用的例子都是离散型数据,比如纹理(清晰,稍糊,模糊),色泽(青绿,乌黑,浅白),触感(硬滑,软粘),实际上我们的数据还有可能是连续值,比如西瓜的含糖率是0-1之间的连续值。这种情况下,属性的可取值无穷多,就无法直接划分节点,需要先将连续值离散化。 我们这里讲一下最简单的二分法策略对连续值进行处理,C4.5算法就是使用的这个方法,其他的算法等找到资料后我再补充到这里。 定义如下: 给定样本集D和连续属性a,假定a在D上出现了n个不同的取值,将这些值从小到大进行排序,记为{a1,a2,…,an}。基于划分点t可将D分为子集Dt-和Dt+,其中Dt-包含那些在属性a上取值不大于t的样本,而Dt+包含那些在属性a上取值大于t的样本。显然,对相邻的属性取值ai和ai+1来说,t在区间[ai,ai+1]中取任意值所产生的划分结果相同,我们就把区间[ai,ai+1]的中位点作为候选划分点好了。 **【注意】**这里我们要注意一下,对于连续值的属性来说,离散化后再进行划分选择的过程不同。 离散化后,当选择最优划分属性时,对于该属性,并不是划分为候选点数量的子节点,而是选择其中一个候选点,将样本集D二分,小于候选点的分为一类,记为D-,另一类记为D+,然后计算信息增益。循环所有候选点后,选择信息增益最大的候选点来与其他属性带来的信息增益对比,如果该候选点带来的信息增益最大,就将该候选点所在属性作为最优划分属性,并以该候选点将原节点分为2个子节点。 **【注意】**另一个值得注意的是,对于连续值离散化的属性,在进行决策树生成的过程中可能不止使用1次。以下图为例 由于各种原因,我们得到的数据经常含有缺失值。当然如果一条样本缺失值太多,我们可以直接舍弃。但对于只缺失少量数据的样本,我们丢弃就有些可惜,尤其是对于不方便收集的数据样本。我们谈一下决策树算法中对于缺失值怎么处理的。 这里还是要放上公式(显得专业一些)。千万不要被这复杂的公式吓到,实际上意义超级简单。 考虑到缺失值后,我们需要解决的有两个问题: 1. 信息增益怎么算,最优划分属性怎么着。 信息增益的计算公式如下: 至此,如何解决连续值和缺失值的方法就讲完了。 六. 决策树回归我们都知道决策树不仅可以处理分类问题,也可以处理回归问题。这里我们就简单介绍一下回归问题的解决办法。 我们先看一下决策树回归的流程,与分类问题类似。 可以看出,决策树回归的重点就在两个地方: 重点1:寻找最优切分点; 重点2:将样本切分后,子节点的输出值怎么算。 重点1: 回归决策树是通过最小二乘法来寻找最优切分点(j,s)的。定义了如下目标函数: 重点2 当找到最优切分点(j,s)后,将样本切分为左右两个子节点。子节点的输出值为该节点内的所有样本y的均值。 我们既讲了决策树的原理,中间又穿插了几个算法的名字,这里我把算法名字和原理之间的关系做一个小小的总结。 相信大家基本都是使用sklearn工具包里的决策树算法,这里简单说几句调用的方法和参数的意义,哪都能查得到,摆在这省的大家再去别的地方再搜了。 调用算法代码: from sklearn.tree import DecisionTreeClassifier #导入分类模型 from sklearn.tree import DecisionTreeRegressor #导入回归模型 model_c = DecisionTreeClassifier(max_depth=10,max_features=5) #括号内加入要人工设定的参数 model_r = DecisionTreeRegressor(max_depth=10,max_features=5) #同样的,加入参数设定值,不仅局限于这几个 model_c.fit(x_train,y_train) #训练分类模型 model_r.fit(x_train,y_train) #训练回归模型 result_c = model_c.predict(x_test) #使用模型预测分类结果 result_r = model_r.predict(x_test) #使用模型预测回归结果模型可添加的更多的参数及解释如下: criterion:字符型,可选,规定了该决策树所采用的的最佳分割属性的判决方法,有两种:“gini”,“entropy”,默认为’gini’, splitter: 字符型,可选(默认=“best”)用于在每个节点选择分割的策略,可填‘best’或’random’,前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random" max_depth: int型或None,可选(默认=None)树的最大深度,对于防止过拟合非常有用。如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。 min_samples_split: int型float型,可选(默认值=2)分割内部节点所需的最小样本数量;如果是int型,则min_samples_split为最小样本数量。如果是float型,则min_samples_split是分数,ceil(min_samples_split * n_samples)是每个分割的最小样本数。 min_samples_leaf: int型float型,可选(默认值=1)叶节点上所需的最小样本数。如果是int类型,则将min_samples_leaf作为最小值。若是float,那么min_samples_leaf是分数,ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。 min_weight_fraction_leaf:浮点型,可选(默认=0)。叶节点上(所有输入样本的)权值之和的最小加权分数。当没有提供sample_weight时,样品的重量相等。 max_features: int, float, string or None, 可选(默认=None),在寻找最佳分割时需要考虑的特性数量;如果是int类型,则考虑每个分割处的max_features特性。如果是float,那么max_features是一个分数,并且在每个分割中都考虑int(max_features * n_features)特性。如果“auto”,则max_features=sqrt(n_features)。如果“sqrt”,则max_features=sqrt(n_features)。如果“log2”,则max_features=log2(n_features)。如果没有,则max_features=n_features。 class_weight: 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None" random_state: int型RandomState实例或None,可选(默认=None)如果是int, random_state是随机数生成器使用的种子;如果是RandomState实例,random_state是随机数生成器;如果没有,随机数生成器是np.random使用的RandomState实例。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |