2016-09-24 44 views
0

我已經使用scikit學習構建了一個分類器,現在我想使用spark在大型數據集上運行predict_proba。我目前醃一次使用分類:在火花中分發scikit學習分類的建議方法是什麼?

import pickle 
pickle.dump(clf, open('classifier.pickle', 'wb')) 

,然後在我的火花的代碼,我用廣播爲sc.broadcast在我的火花代碼中使用它具有在每個集羣節點加載這個鹹菜。

這樣的工作,但泡菜很大(約0.5GB),它似乎非常低效。

有沒有更好的方法來做到這一點?

+0

您正在使用哪個分類? – miraculixx

+0

@miraculixx RandomForestClassifer – eleanora

+0

請參閱我對某些選項的回答,您是否介意使用'sc.broadcast'或某些指針分享您的方法?謝謝。 – miraculixx

回答

3

這工作,但鹹菜是大(約0.5GB)

注意森林的規模將O(M*N*Log(N)),其中M是樹木的數量,N是樣本的數量。 (source)

有沒有更好的方法來做到這一點?

有幾個選項,你可以儘量減少或者您的RandomForestClassifier模型或序列化的文件的大小:

  • optimizing hyperparameters減少模型的大小,特別是max_depth, max_leaf_nodes, min_samples_split這些參數的影響在合奏中使用的樹木的尺寸

  • 拉鍊泡菜,例如如下。注意,有several options和一個可能更適合你,所以你需要嘗試:

    with gzip.open('classifier.pickle', 'wb') as f: 
        pickle.dump(clf, f) 
    
  • 使用JOBLIB代替鹹菜,它壓縮更好,也是recommended approach

    from sklearn.externals import joblib 
        joblib.dump(clf, 'filename.pkl') 
    

    這裏需要說明的是,JOBLIB將在目錄中創建多個文件,所以你必須要壓縮這些運。

  • 最後但並非最不重要,你也可以嘗試通過降維降低輸入的大小適合你面前/預計使用RandomTreeClassifier,如決策樹在practical tips提及。

因人而異

+0

謝謝。關於joblib,它是否保存單個文件或整個文件集合? – eleanora

+0

另外,是cPickle推薦超過醃這個任務在python 2? – eleanora

+0

在joblib上看到我的更新 - 是的,它保存了一組文件。你可以壓縮這些運輸,但不知道如何解壓縮將與'sc.broadcast'工作雖然(請參閱我對你的問題的其他評論) – miraculixx