原文地址:http://www.cnblogs.com/kemaswill/archive/2012/09/21/2697188.html
近来做一些遥感图像自动解译的工作,需要根据遥感图像每个单元(像元,像素)的几个波段值和相互之间的位置关系来进行自动分类,也就是确定哪些区域是耕 地,哪些是林地,哪些是草地。之前虽然有上过数据挖掘和机器学习的课,但是自己的专业并不在此,对遥感图像的自动分类更是一窍不通,所以慢慢自学,顺便写 个博客记录一下自己的学习过程,谬误在所难免,大家多多包涵指正。
根据最近的Mahout Wiki,Mahout实现的分类算法有:随机梯度下降(SGD),贝叶斯分类,Online Passive Aggressive,HMM和决策森林(随机森林)。随机梯度下降当前不能并行处理,贝叶斯分类更适合处理文本数据,所以这两个算法都不太适合我的应用 场景(并行处理,特征类型为数字),OPA和HMM不太熟悉,所以就选用了决策森林(随机森林)。
决策森林,顾名思义,就是由多个决策树组成森林,然后用这个森林进行分类,非常适合用MapReduce实现,进行并行处理。决策森林又称为随机森林,这 是因为不同于常规的决策树(ID3,C4.5),决策森林中每个每棵树的每个节点在选择该点的分类特征时并不是从所有的输入特征里选择一个最好的,而是从 所有的M个输入特征里随机的选择m个特征,然后从这m个特征里选择一个最好的(这 样比较适合那种输入特征数量特别多的应用场景,在输入特征数量不多的情况下,我们可以取m=M)。然后针对目标特征类型的不同,取多个决策树的平均值(目 标特征类型为数字类型(numeric))或大多数投票(目标特征类型为类别(category))。
在Mahout的example中有一个Decision Tree的例子,可以直接在命令行运行:
1. 准备数据:
数据为Breiman提供的glass:http://archive.ics.uci.edu/ml/datasets/Glass+Identification。
2. 生成数据的说明文件:
在Mahout目录下执行:bin/mahout org.apache.mahout.df.tools.Describe -p testdata/glass.data -f testdata/glass.info -d I 9 N L
数据格式为CSV,最后的I 9 N L说明各特征的属性:
I表示忽略第一个特征值(该特征值一般用来标示每一条训练样例,亦即可以作为ID)。
9 N表示接下来的9个特征是输入特征,类型为数字类型。
L 表示该特征是目标特征,亦即Label。
以glass文件的前几行为例为例:
1,1.52101,13.64,4.49,1.10,71.78,0.06,8.75,0.00,0.00,1
2,1.51761,13.89,3.60,1.36,72.73,0.48,7.83,0.00,0.00,1
3,1.51618,13.53,3.55,1.54,72.99,0.39,7.78,0.00,0.00,1
4,1.51766,13.21,3.69,1.29,72.61,0.57,8.22,0.00,0.00,1
5,1.51742,13.27,3.62,1.24,73.08,0.55,8.07,0.00,0.00,1
第一个特征被忽略,因为这个特征是作为ID用来表示每个样例的,2-10是9个输入特征,用来训练分类器,类型为数字(Numeric),最后一个特征是目标特征,代表每个样例所属的类别,这里所有样例都属于"1"类。
3. 进行分类和测试
在Mahout目录下执行:bin/mahout org.apache.mahout.df.BreimanExample -d testdata/glass.data -ds testdata/glass.info -i 10 -t 100
-i表示迭代的次数
-t表示每棵决策树的节点的个数
BreimanExample默认会构造两个森林,一个取m=1,一个取m=log(M+1)。之所以这么做是为了说明即使m值很小,整个森林的分类结果也会挺好。
4. 分类的结果:
12/09/13 15:18:07 INFO df.BreimanExample: Selection error : 0.2952380952380952
12/09/13 15:18:07 INFO df.BreimanExample: Single Input error : 0.29999999999999993
12/09/13 15:18:07 INFO df.BreimanExample: One Tree error : 0.41874436090225553
Selection Error是用两个森林中误差较小的森林做分类得到的错误率。
Single Input Error是用m=1的森林做分类得到的错误率。
One Tree Error是单棵树的平均错误率。
我们可以看到,用森林分类的结果比单棵树要好很多。同时,m值即使取1,决策森林的误差也不会比m值大的森林效果差很多。
以下是我用Decision Forest对遥感图像做自动解译的效果,前者是人工解译的图像,我们利用这个图像做训练,得到分类器,然后做自动解译,得到后者:
人工解译的图像 | 自动解译的图像 |
|
|
错误率大概在23%左右,可以看到自动解译的图像不够平滑,有很多星点,需要进一步处理,KNN也许可以,不过Mahout没有实现,所以需要另寻他法。