python中决策树函数 python决策树代码解读( 四 )


信息增益也可以用作建模前的特征筛选 。在这种场景下,信息增益和互信息表达的含义相同,会被用来计算两变量之间的独立性 。比如scikit-learn 中的函数 mutual_info_classiif()
信息增益在面对类别较少的离散数据时效果较好,但是面对取值较多的特征时效果会有 偏向性。因为当特征的取值较多时 , 根据此特征划分得到的子集纯度有更大的可能性会更高(对比与取值较少的特征),因此划分之后的熵更低 , 由于划分前的熵是一定的,因此信息增益更大,因此信息增益比较偏向取值较多的特征 。举一个极端的例子来说 , 如果一个特征为身份证号 , 当把每一个身份证号不同的样本都分到不同的子节点时,熵会变为0 , 意味着信息增益最大,从而该特征会被算法选择 。但这种分法显然没有任何实际意义 。
这种时候,信息增益率就起到了很重要的作用 。
gR(D,A)=g(D,A)/HA(D)
HA(D) 又叫做特征A的内部信息 , HA(D)其实像是一个衡量以特征AA的不同取值将数据集D分类后的不确定性的度量 。如果特征A的取值越多,那么不确定性通常会更大,那么HA(D)的值也会越大,而1/HA(D)的值也会越小 。这相当于是在信息增益的基础上乘上了一个惩罚系数 。即 gR(D,A)=g(D,A)?惩罚系数。
在CART算法中,基尼不纯度表示一个随机选中的样本被分错类别的可能性 , 即这个样本被选中的概率乘以它被分错的概率 。当一个节点中所有样本均为一种时(没有被分错的样本),基尼不纯度达到最低值0 。
举例来说,如果有绿色和蓝色两类数据点,各占一半(蓝色50%,绿色50%) 。那么我们随机分类 , 有以下四种情况:
-分为蓝色,但实际上是绿色(?) , 概率25%
-分为蓝色,实际上也是蓝色(??) , 概率25%
-分为绿色,实际上也是绿色(??),概率25%
-分为绿色,但实际上是蓝色(?),概率25%
那么将任意一个数据点分错的概率为25%+25% = 50% 。基尼不纯度为0.5 。
在特征选择中,我们可以选择加入后使数据不纯度减少最多的特征 。
噪音数据简单来说就是会对模型造成误导的数据 。分为类别噪声( class noise 或 label noise )和 变量噪声( attribute noise ) 。类别噪声指的的是被错误标记的错误数据,比如两个相同的样本具有不同的标签等情况 。变量噪声指的是有问题的变量,比如缺失值、异常值和无关值等 。
决策树其实是一种图结构 , 由节点和边构成 。
-根节点:只有出边没有入边 。包含样本全集,表示一个对样本最初的判断 。
-内部节点:一个入边多个出边 。表示一个特征或是属性 。每个内部节点都是一个判断条件 , 包含数据集中从根节点到该节点所有满足条件的数据的集合 。
-叶节点:一个入边无出边 。表示一个类,对应于决策结果 。
决策树的生成主要分为三个步骤:
1. 节点的分裂 :当一个节点不够纯(单一分类占比不够大或者说信息熵较大)时,则选择将这一节点进行分裂 。
2. 决策边界的确定 :选择正确的决策边界( Decision Boundary ),使分出的节点尽量纯 , 信息增益(熵减少的值)尽可能大 。
3. 重复及停止生长 :重复1,2步骤,直到纯度为0或树达到最大深度 。为避免过拟合 , 决策树算法一般需要制定树分裂的最大深度 。到达这一深度后,即使熵不等于0,树也不会继续进行分裂 。
下面以超级知名的鸢尾花数据集举例来说明 。
这个数据集含有四个特征:花瓣的长度( petal length )、花瓣的宽度( petal width )、花萼的长度( sepal length )和花萼的宽度( sepal width ) 。预测目标是鸢尾花的种类 iris setosa, iris versicolor和iris virginica。

推荐阅读