原數據只是抽出來的一個3萬來條的樣本,大約60%為0,40%為1。

單機用的是R下的randomForest包,準確率能有85%,這個結果還是蠻可靠的。但是同樣的數據,放到伺服器上用Spark的MLlib跑,準確率只有60%左右,混淆矩陣也看不出問題。分類型變數也用categoricalFeaturesInfo命令註明了,這是怎麼回事呢?


首先spark上的RF和單機的RF是有區別的。主要表現在spark上的RF為了減少IO通信對RF做了優化,其中的優化主要有:1 對於連續型特徵,一般都是通過排序後進行切割點的劃分,但是考慮到對所有數據做排序的IO通信較高,所以只是對每個節點上的數據進行抽樣,並根據樣本進行切分點的劃分,所以這裡有一部分的近似。2由於傳統的構建決策樹方法是遞歸的形式,這樣無形中會造成更多的數據傳送,所以在spark中為了能減少這部分的數據傳輸,一方面採用分層構建,另一方面採用bin也就是feature裝箱的方式減少了數據量,這樣相當於又做了一部分的近似。所以在演算法上來說,spark的RF和單機的是不同的。可以說spark為了能更好的跑大規模數據,犧牲了部分的精確度。其次,你在R上的和spark上的參數是否相同,還有就是你這三萬的數據量太小了。


根本都不是一個演算法,spark上的差遠了


推薦閱讀:
相关文章