2016-04-09 30 views
5

Ben Benim sabit diskinde çok yer alırNeden skolearn RandomForest modeli, kaydettikten sonra çok fazla disk alanı alıyor?

with open('/tmp/rf.model', 'wb') as f: 
    cPickle.dump(RF_model, f) 

altında koduyla sklearn kütüphanesinden RandomForestClassifier modelini kurtarıyorum. Modelde sadece 50 ağaç var, ancak disk üzerinde 50 MB'yi aştı (analiz edilen veri kümesi 21 özellik ile ~ 20MB). Neden olduğu hakkında fikri olan var mı? ExtraTreesClassifier için benzer davranış gözlemlerim.

Düzenleme: RF parametreleri:

"n_estimators": 50, 
"max_features": 0.2, 
"min_samples_split": 20, 
"criterion": "gini", 
"min_samples_leaf": 11 

@dooms önerdiği gibi ben sys.getsizeof kontrol ve 64 döndürür - Bu sadece işaretçi boyutu olduğunu varsayalım. Ben önceki 53 MB'den böylece daha küçük 1 * .pkl dosyası ve toplam boyutu 14.9 MB 201 * .npy dosyaları almak bu şekilde kullanarak

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

:

Ben bir model kurtarmak için başka bir yol denedi.

ilk dosya (231 KB) içerik:

array([(1, 1062, 20, 0.2557438611984253, 0.4997574055554296, 29168, 46216.0), 
     (2, 581, 12, 0.5557271242141724, 0.49938159451291675, 7506, 11971.0), 
     (3, 6, 14, 0.006186043843626976, 0.4953095968671224, 4060, 6422.0), 
     ..., 
     (4123, 4124, 15, 0.6142271757125854, 0.4152249134948097, 31, 51.0), 
     (-1, -1, -2, -2.0, 0.495, 11, 20.0), 
     (-1, -1, -2, -2.0, 0.3121748178980229, 20, 31.0)], 
     dtype=[('left_child', '<i8'), ('right_child', '<i8'), ('feature', '<i8'), ('threshold', '<f8'), ('impurity', '<f8'), ('n_node_samples', '<i8'), ('weighted_n_node_samples', '<f8')]) 

İkinci dosya (66 kB) içeriği:

orada Ormanı'nda ağaç başına 4 dosyaları - bu 201 NPY dosyalarda bir model vardır
array([[[ 2.25990000e+04, 2.36170000e+04]], 

     [[ 6.19600000e+03, 5.77500000e+03]], 

     [[ 3.52200000e+03, 2.90000000e+03]], 

     ..., 
     [[ 3.60000000e+01, 1.50000000e+01]], 

     [[ 1.10000000e+01, 9.00000000e+00]], 

     [[ 2.50000000e+01, 6.00000000e+00]]]) 

üçüncü dosya (88B): grup (96B) arasından

array([2]) 

son dosya:

array([ 0., 1.]) 

Ne olduğu hakkında bir fikrin var mı? Sklearn'da Tree koduna bakmaya çalıştım ama zor. Sklearn ağacının daha az disk sakladığını nasıl edindiniz? (sadece xgboost'un benzer boyuttaki topluluğunun toplam boyutu ~ 200 KB aldığını belirtmek için)

+2

Sınıflandırıcı için parametreler nelerdir? ağaç sayısı ve maksimum derinlik/min_samples_ {split, yaprak} ile ilgilidir. –

cevap

0

Aynı davranışı da turşu döküntülerini kullanarak gördüm. Çöp kutusu, size in memory'un yaklaşık 10 katı büyüklüğündedir. Orada büyük bir fark olduğunu ve olay buysa modelinizi kurtarmak için another way görürseniz

from sys import getsizeof 
memory_size = getsizeof(RF_model) 

bakınız.

+1

Bu oldukça yanıltıcı bir cevaptır. 1. "getsizeof" karmaşık bir nesne için yanlış boyut tahminleri sunacaktır (bu daha önce tartışılmıştır, bkz. Örneğin [http://stackoverflow.com/questions/19516403/why-pickle-dumpobj-has-diferent -size-with-sys-getsizeofobj-nasıl-kaydetmek-var) 2. "Modelinizi kaydetmenin başka bir yolu" bir bağlantı önermek gerçekten bir yoruma değil, bir cevaba aittir (bağlantı, Soru, tüm çözüm burada SO) konmuş olmalıydı. – Jealie