Ukuran terlarang dari hutan acak saat disimpan ke disk

9

Ketika disimpan ke disk menggunakan cPickle: /programming/20662023/save-python-random-forest-model-to-file , hutan acak saya adalah 6,57 GB.

with open('rforest.cpickle', 'wb') as f:
    cPickle.dump(rforest, f)

Saya ingin menggunakan hutan itu sendiri untuk membuat prediksi melalui API python yang dihosting di Heroku - tentu saja, ukuran file itu tidak dapat diterima.

Mengapa ukuran file begitu besar? Ada 500 pohon di ansambel - yang ingin saya selamatkan adalah pohon yang sudah selesai, karena akan digunakan sebagai prediksi. Apakah node dan tepi sebenarnya yang menyusun masing-masing dari 500 pohon yang membutuhkan hampir 7 GB ruang pada disk?

Saya menggunakan randomforestregressor scikitlearn:

def buildForest(self, X_train, y_train):
    rf = RandomForestRegressor(n_estimators=500, verbose=1)
    rf.fit_transform(X_train, y_train)
    return rf

Juga, jika ada cara yang lebih baik untuk membuat model saya dapat diakses melalui API, itu juga baik untuk diketahui.

Pembaruan: Saya menguranginya menjadi 100 pohon tanpa kehilangan banyak daya prediksi, dan sekarang ukuran yang disimpan adalah 1,3 GB - jauh lebih mudah dikelola, tetapi masih belum terlalu bagus.

compguy24
sumber
1
Lol dan saya pikir milik saya besar. Hutan acak saya mengambil 330 Mb, saya merasa aneh, berpikir bahwa itu ukuran yang sangat besar untuk sebuah file, jadi saya datang ke sini dan saya melihat milik Anda membutuhkan 6,57 Gb jadi sekarang saya merasa lebih baik lol terima kasih. Saya tidak tahu jumlah rekaman Anda, tetapi saya kira itu akan membuat perbedaan. Saya juga menggunakan 500 pohon, saya mencoba dengan 100, 500 dan 1000, tidak melihat perbedaan yang cukup dalam keakuratan jadi kembali ke 500.
AndroidMarshmallow

Jawaban:

5

Ukuran setiap pohon sangat tergantung pada kedalamannya. Jadi, ubah kedalaman maksimal ( max_depth). Cobalah untuk mengaturnya ke nomor yang terbatas (sebagai lawan dari "Tidak Ada" default) dan kemudian mencoba untuk mengurangi nomor ini. Selain itu (atau sebagai alternatif) cobalah untuk menambah min_samples_splitatau min_samples_split.

Anda juga dapat menganalisis fitur Anda dan hanya menyimpan yang penting. Cara paling sederhana adalah dengan melihat clf.feature_importances_hutan Anda. (Secara umum, menemukan fitur-fitur penting adalah seni dan sains pada dirinya sendiri.) Mengecualikan fitur yang tidak relevan dan membangun kembali hutan.

lanenok
sumber
2

Coba ini:

import pickle
with open('rforest.pickle', 'wb') as f:
    pickle.dump(rforest, f, -1)

Perhatikan: dengan parameter "-1" ukuran file model sebagian besar akan berkurang.

Menurut dokumentasi:

pickle.dump (obj, file [, protokol])

Protokol versi 0 adalah protokol ASCII asli dan kompatibel dengan versi Python sebelumnya. Protokol versi 1 adalah format biner lama yang juga kompatibel dengan versi Python sebelumnya. Protokol versi 2 diperkenalkan dengan Python 2.3. Ini memberikan pengawetan kelas gaya baru yang jauh lebih efisien.

Jika parameter protokol dihilangkan, protokol 0 digunakan. Jika protokol ditetapkan sebagai nilai negatif atau HIGHEST_PROTOCOL, versi protokol tertinggi akan digunakan.

elecjack
sumber