在我的前一篇文章中过了一遍ID3 算法后面的理论。现在我们在此基础上得到了那个痛苦的数学公式,让我们写一些代码吧!这里是一个用F#实现了的算法(同时在文章底部有附件下载)。
entropy和informationGain这两个函数在上篇文章中已经提到过了,所以让我们来过一遍这个实际的决策树是怎样构建的。这里还有点小工作,即计算出最佳的决策树分割点,然后用F#你能非常美观地用代码表达它。
首先,它需要所有分裂的潜在属性...
attributesLeft
...然后匹配这个属性名字到一个新的属性名字和一个信息元组...
|> List.map(fun attrName -> attrName, (informationGain data attrName)) ...再从新生成的列表中取出那个最高信息增益的元组…
|> List.maxBy(fun (attrName, infoGain) -> infoGain)
...最后返回该元组的第一个元素,即有最高信息增益的属性。
|> fst
当你能在内存里构成一个决策树时,怎样获取它呢?最简单的方法是在控制台输出它。
这里的代码非常的直接了当。注意"padding parameter"的使用,这使递归调用获得越来越多的缩进。在控制台打印出树类型数据结构时,这是一个非常有帮助的技术。
然而现在都快2010年了,因此对于代替飞行汽车而言,或许我们至少可以比控制台打印出数据做得更好。理想情况是我们可以生成出一些像这样的性感图像:
你可以用Microsoft Visio精心构造这决策树,但幸运地是已经有现成工具为你做这些工作了。AT&T研究已经生产出了一个很棒的工具叫GraphViz。虽然最终结果并不是完全没有瑕疵,但这已足够简单去进行下去了。
下面这个函数把决策树转换到一个GraphViz能够进行绘图的格式(复制打印出来的内容到该工具,然后用默认设置进行绘图)。
现在你有了F# 的ID3. 用很少一些数学和一些聪明的输出,你可以为你所有的机器学习需求构造决策树。在你以后的工作中,如你想挖掘客户的交易、分析服务器日志、或为你的杀手机器人编写程序去找到沙拉康纳(电影终结者里的女主角)。
<完全无耻的插入>如果你想学习更多F#,就去看下O'Reilly的Programming F#(在F#学习资料汇总里有下载)</完全无耻的插入>
源代码下载:ID3.fsx
原文链接 :http://blogs.msdn.com/b/chrsmith/archive/2009/11/02/awesome-f-decision-trees-part-ii.aspx