您的位置:首页 > 其它

决策树算法

2015-07-01 17:12 260 查看
通俗来说,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:

女儿:多大年纪了?

母亲:26。

女儿:长的帅不帅?

母亲:挺帅的。

女儿:收入高不?

母亲:不算很高,中等情况。

女儿:是公务员不?

母亲:是,在税务局上班呢。

女儿:那好,我去见见。

这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑(声明:此决策树纯属为了写文章而YY的产物,没有任何根据,也不代表任何女孩的择偶倾向,请各位女同胞莫质问我^_^):



上图完整表达了这个女孩决定是否见一个约会对象的策略,其中绿色节点表示判断条件,橙色节点表示决策结果,箭头表示在一个判断条件在不同情况下的决策路径,图中红色箭头表示了上面例子中女孩的决策过程。

决策树的构造

ID3算法

信息论知识中我们直到,期望信息越小,信息增益越大,从而纯度越高。所以ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。下面先定义几个要用到的概念。

设D为用类别对训练元组进行的划分,则D的(entropy)表示为:

其中pi表示第i个类别在整个训练元组中出现的概率,可以用属于此类别元素的数量除以训练元组元素总数量作为估计。熵的实际意义表示是D中元组的类标号所需要的平均信息量。

现在我们假设将训练元组D按属性A进行划分,则A对D划分的期望信息为:

而信息增益即为两者的差值:



ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂。下面我们继续用SNS社区中不真实账号检测的例子说明如何使用ID3算法构造决策树。为了简单起见,我们假设训练集合包含10个元素:



其中s、m和l分别表示小、中和大。
设L、F、H和R表示日志密度、好友密度、是否使用真实头像和账号是否真实,下面计算各属性的信息增益。





因此日志密度的信息增益是0.276。

用同样方法得到H和F的信息增益分别为0.033和0.553。

因为F具有最大的信息增益,所以第一次分裂选择F为分裂属性,分裂后的结果如下图表示:



在上图的基础上,再递归使用这个方法计算子节点的分裂属性,最终就可以得到整个决策树。

上面为了简便,将特征属性离散化了,其实日志密度和好友密度都是连续的属性。对于特征属性为连续值,可以如此使用ID3算法:

先将D中元素按照特征属性排序,则每两个相邻元素的中间点可以看做潜在分裂点,从第一个潜在分裂点开始,分裂D并计算两个集合的期望信息,具有最小期望信息的点称为这个属性的最佳分裂点,其信息期望作为此属性的信息期望。


C4.5算法

ID3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。

C4.5算法首先定义了“分裂信息”,其定义可以表示成:

其中各符号意义与ID3算法相同,然后,增益率被定义为:

C4.5选择具有最大增益率的属性作为分裂属性,其具体应用与ID3类似,不再赘述。

WEKA 数据集

我们用于分类示例的数据集所围绕的仍然是我们虚构的 BMW 经销店。这个经销店正在启动一个推销计划,试图向其老客户推销两年延保。这个经销店过去曾做过类似的计划并从过去的销售中收集了 4,500 个数据点。数据集中的属性有:

收入水平 [0=$0-$30k, 1=$31k-$40k, 2=$41k-$60k, 3=$61k-$75k, 4=$76k-$100k, 5=$101k-$150k, 6=$151k-$500k, 7=$501k+]

第一辆 BMW 购买的年/月

最近的 BMW 购买的年/月

是否过去曾响应过延保计划

让我们来看看在这个例子中使用的 Attribute-Relation File Format (ARFF)。

清单 2. 分类 WEKA 数据
@attribute IncomeBracket {0,1,2,3,4,5,6,7} @attribute FirstPurchase numeric @attribute LastPurchase numeric @attribute responded {1,0} @data 4,200210,200601,0 5,200301,200601,1 ...

在 WEKA 内进行分类

使用我们之前使用过的相同步骤来将数据文件 bmw-training.arff (参见 下载
载入 WEKA。请注意:这个文件只包含经销店记录内的这 4,500 个记录中的 3,000 个。我们需要分割我们的记录以便某些数据实例被用来创建模型,某些被用来测试模型以确保没有过拟合。在加载了数据后,屏幕应该类似于图 1。

图 1. WEKA 内的 BMW 分类数据



与我们在 用 WEKA 进行数据挖掘,第 1 部分:简介和回归 中对回归模型所做的类似,我们选择 Classify 选项卡,然后选择 trees 节点,然后是 J48 叶子(我不知道为何这就是正式的名称,不过还是接受吧)。

图 2. BMW 分类算法



至此,我们已经准备好可以在 WEKA 内创建我们的模型了。请确保 Use training set 被选中以便我们使用刚刚加载的这个数据集来创建模型。单击 Start 并让 WEKA 运行。模型的输出应类似于清单 3 内的结果。

清单 3. WEKA 的分类模型的输出
Number of Leaves : 28 Size of the tree : 43 Time taken to build model: 0.18 seconds === Evaluation on training set === === Summary === Correctly Classified Instances 1774 59.1333 % Incorrectly Classified Instances 1226 40.8667 % Kappa statistic 0.1807 Mean absolute error 0.4773 Root mean squared error 0.4885 Relative absolute error 95.4768 % Root relative squared error 97.7122 % Total Number of Instances 3000 === Detailed Accuracy By Class === TP Rate FP Rate Precision Recall F-Measure ROC Area Class 0.662 0.481 0.587 0.662 0.622 0.616 1 0.519 0.338 0.597 0.519 0.555 0.616 0 Weighted Avg. 0.591 0.411 0.592 0.591 0.589 0.616 === Confusion Matrix === a b <-- classified as 1009 516 | a = 1 710 765 | b = 0

上述这些数字是什么意思?我们怎么才能知道这是一个好的模型?我们应该寻找的这个所谓的“树”在哪里?这些问题问得很好。让我们逐一回答:

这些数字是什么意思? 这里应该关注的重要数字是“Correctly Classified Instances”(59.1 %)与“Incorrectly Classified Instances”(40.9 %)旁边的这些数字。其他的重要数字还有“ROC Area”列第一行的这个数字(0.616);我稍候会详细解释这个数字,目前只需记住即可。最后,在“Confusion
Matrix”中,显示了假正和假负的数量。在这个矩阵中,假正为 516,假负为 710。

我们怎么才能知道这是一个好的模型? 由于准确率仅为 59.1 %,我不得不承认经初步分析后,这不是一个非常好的模型。

这个所谓的“树”在哪里? 要看到这个树,可右键单击刚刚创建的这个模型。在弹出菜单中,选择 Visualize tree。之后,就会看到我们所创建的这个分类树,虽然在本例中,可视树不能提供任何帮助。我们的树如图 3 所示。看到这个树的另一种方式是在 Classifier Output 内往高处看,其中的文本输出显示了具有节点和叶子的整个树。

图 3. 分类树可视化



还有最后一个步骤,就是验证我们的分类树,这需要贯穿模型运行我们的测试集并确保我们模型的准确性在测试集时与在训练集时相差不远。为此,在 Test options 内,选择 Supplied test set 单选按钮并单击 Set。选择文件
bmw-test.arff,内含 1,500 条记录,而这些记录在我们用来创建模型的训练集中是没有的。当我们这次单击 Start 时,WEKA 将会贯穿我们已经创建的这个模型运行测试数据集并会让我们知道模型的情况。让我们现在单击 Start。如下是输出。

图 4. 分类树测试



对比这个测试集的“Correctly Classified Instances”(55.7 %)与训练集的“Correctly Classified Instances”(59.1 %),我们看到此模型的准确性非常接近,这表明此模型不会在应用未知数据或未来数据时,发生故障。

不过,由于模型的准确性很差,只能正确地分类 60 % 的数据记录,因此我们可以后退一步说:“哦,这个模型一点都不好。其准确性勉强超过 50 %,我随便猜猜,也能得到这样的准确性。”这完全正确。这也是我想审慎地告诉大家的一点:有时候,将数据挖掘算法应用到数据集有可能会生成一个糟糕的模型。这一点在这里尤其准确,并且它是故意的。

我本想带您亲历用适合于分类模型的数据生成一个分类树的全过程。然而,我们从 WEKA 获得的结果表明我们错了。我们在这里本应选择的并非 分类树。我们所创建的这个模型不能告诉我们任何信息,并且如果我们使用它,我们可能会做出错误的决策并浪费钱财。

那么这是不是意味着该数据无法被挖掘呢?当然不是,只不过需要使用另一种数据挖掘方法:最近邻模型,该模型会在本系列的后续文章中讨论,它使用相同的数据集,却能创建一个准确性超过 88 % 的模型。它旨在强调一点:那就是必须为数据选择合适的模型才能得到有意义的信息。

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: