近來做一些遙感圖像自動解譯的工作,需要根據遙感圖像每個單元(像元,像素)的幾個波段值和相互之間的位置關系來進行自動分類,也就是確定哪些區域是耕地,哪些是林地,哪些是草地。之前雖然有上過數據挖掘和機器學習的課,但是自己的專業並不在此,對遙感圖像的自動分類更是一竅不通,所以慢慢自學,順便寫個博客記錄一下自己的學習過程,謬誤在所難免,大家多多包涵指正。
根據最近的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%左右,可以看到自動解譯的圖像不夠平滑,有很多星點,需要進一步處理,可以使用擇多濾波。