天天看點

mahout如何使用随機森林測試資料集

      最近在研究機器學習經典的分類算法随機森林,需要用随機森林算法來測試一個小的資料集。開源項目mahout實作了大多數經典的機器學習算法,裡面也提供了很多處理資料,提取特征,訓練算法模型的類和方法,但是貌似國内用這個開源項目的人并不多,因為網上關于具體如何使用mahout算法的資料廖若晨星,而mahout實戰中也沒有關于随機森林的使用例子,這部分資訊隻能從mahout官網中搜集到,而mahout官網中對随機森林的使用也并沒有描述的很詳細,于是部落客在研究如何使用mahout随機森林時廢了很大心力,最後發現,官網給出的mahout使用例子是用linux指令行直接運作jar包的方式來完成随機樹的模組化和測試的。

     mahout随機樹測試分為三個步驟:1.對資料生成對應的描述資訊檔案(這個生成的描述資訊檔案需要作為随機森林模組化時的一個輸入檔案)。2.根據訓練集及第一步生成的描述資訊檔案訓練一個随機森林。3.用訓練好的随機森林來測試資料。

     第一步:對資料生成對應的描述資訊檔案,這個類位于mahout-examples-版本号-job.jar(注意一定要有job字尾,mahout下面還有一個mahout-examples-版本号.jar包,但是這個包裡面的類并不全)的org.apache.mahout.classifier.df.tools.Describe,這個類裡面有個主方法,是以可以在指令行直接運作這個類。你可以在hadoop環境下直接運作這個類對資料生成相應的描述檔案,如下指令行:

$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar這個包所在的路徑)  org.apache.mahout.classifier.df.tools.Describe  -p  /testdata/datatrain.csv(需要處理的目标資料,這裡是在hdfs檔案系統中的路徑)  -f  /testdata/datatrain.info(生成的描述資訊檔案的存放路徑,描述資訊字尾為info)  -d  20 N L(需要處理的目标資料的格式)

     這裡我來好好說一下這個-d後面的資料格式如何設定,其實這個非常簡單,我們知道資料屬性無非就兩種,一種是數值型,還有一種是類别型。數值型就是純代數值,比如工資收入,商品價格,商品數量等等,這些屬性值在分類的時候隻能定義區間去分類,這些就屬于數值型屬性。還有一類是種類型屬性,這種類型的資料更像是枚舉類型,因為它的所有情況都可以一一列舉出來,比如對一個商品的評價good,bad,not bad,對是否具有某個特征的屬性yes,no等等,一般是通過單詞字元的形式來描述的,但是也有通過數字的形式來表示的,比如0,1,0表示no,1表示yes,雖然看起來好像是數字,但其實它們不是數值型,而是種類型,是以我們在分析資料時一定要搞清楚這些資料的類型到底是數值型還是種類型。

     數值型屬性我們用N表示(Numerical),種類型我們用C表示(Categories),如有一組資料為:

name  age  income  adress  commodity_number  telephone_fare  is_pass

 tom     22     23.3   NewYork              320                        24.3              1

 jack     34     34.5    Miami                1400                       45.8              0

     如果是這組資料,那麼-d後面應該寫成C  2  N  C  2  N  L,從左往右依次寫過來,如果有連續n個C類型的話,就可以寫成n  C,如果有連續m個N類型的話,就可以寫成m  N,L是label的縮寫即标簽屬性。

     經過上面的第一步處理後,我們就得到了一個對應于訓練資料集datatrain.csv對應的datatrain.info描述資訊檔案,然後我們進入第二部随機森林模組化過程。這個過程有點扯,我當時弄了好久都沒成功,最後發現是因為mahout的版本問題。模組化過程需要用到的類是mahout-examples-版本号-job.jar中的org.apache.mahout.classifier.df.mapreduce.BuildForest,但是這個類貌似隻有在mahout版本小于等于0.8的時候才有主方法,也就是隻有在mahout版本小于0.8的時候才能直接在指令行裡面運作。也許mahout後面為了提高架構的可擴充性,把指令行使用的方法逐漸拿掉了,轉為提供更多豐富的接口,類,方法,這樣可以直接在java程式中調用,更加的靈活。但介于部落客找了好久也沒找到相關的api幫助文檔,于是就放棄了自己撸代碼去調用随機森林方法這條路。我改用了mahout-examples-0.8-job.jar這個版本的随機森林模組化方法,順便還提一句,mahout-0.8這個版本比較老,貌似是不支援hadoop-2.x的,是以你隻能用hadoop-1.x運作。看指令行代碼調用:

$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar這個包所在的路徑)  org.apache.mahout.classifier.df.mapreduce.BuildForest  -D  mapreduce.job.queuename=root.default(設定隊列,我也不知道為啥,總之不設定我這邊的環境就出錯)  -Dmapred.max.split.size=1074231(這個參數應該是設定最大的map數)  -d  /testdata/datatrain.csv(需要處理的目标資料,這裡是在hdfs檔案系統中的路徑)  -ds  /testdata/datatrain.info(第一步生成的info檔案路徑)  -t  100(随機森林樹的個數)  -sl  6(随機因子,即每個節點分裂時随機選擇多少個分裂節點數)  -o  /testdata/dataforest(存放訓練後的随機森林模型檔案的目錄)

     還有一些參數,可以直接運作$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar這個包所在的路徑)  org.apache.mahout.classifier.df.mapreduce.BuildForest 來檢視。

     最後一步,測試資料,測試的資料也必須先像第一步那樣Describe一下生産info描述檔案。

$hadoop  jar  /usr/local/mahout-0.8/mahout-examples-0.8-job.jar(你的mahout-examples-版本号-job.jar這個包所在的路徑)  org.apache.mahout.classifier.df.mapreduce.TestForest  -i  /testdata/datatest.csv(測試集的資料hdfs的存放路徑)  -ds  /testdata/datatest.info(測試集經過第一步生成的info檔案)  -m  /testdata/dataforest/file.seq(具體到第二步生成的那個随機森林的模型檔案那,這裡我忘了是個啥檔案了,反正第二步會在目錄/testdata/dataforest/下生成一個模型檔案)  -mr  -a(運作後在指令行界面可以看到分析結果,包括準确率等資訊,不加就看不到)   -o  /testdata/datatest_result(測試結果資訊檔案,測試結果的輸出)

     好了,上面就是mahout随機森林算法使用整個過程,最後還有一點問題,就是資料集中千萬不要出現空格,出現空格的資料,随機森林會把空格也當成分隔符,最後導緻出錯。如1,more than 1,less than 20, very good這樣的資料是會識别出錯的,要改為1,more_than_1,less_than_20,very_good才能正确識别。

    個人的一點小總結,因為确實發現國内關于這一塊的資料太少了,自己使用的時候費了很大精力,版本問題,環境問題和資料格式問題都碰到過了,是以,為了避免其他程式猿和攻城獅朋友們又走我走過的歧路,費心費時,是以我就在前面把雜草啥的都除掉了,讓你們走上舒服平坦的大路。

繼續閱讀