Kích thước cấm của rừng ngẫu nhiên khi lưu vào đĩa


9

Khi được lưu vào đĩa bằng cPickle: /programming/20662023/save-python-random-forest-model-to-file , khu rừng ngẫu nhiên của tôi là 6,57 GB.

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

Tôi muốn sử dụng chính khu rừng để đưa ra dự đoán thông qua API python được lưu trữ trên Heroku - tất nhiên, kích thước tệp đó là không thể chấp nhận được.

Tại sao kích thước tập tin rất lớn? Có 500 cây trong đoàn - tất cả những gì tôi muốn lưu là những cây đã hoàn thành, vì chúng sẽ được sử dụng làm dự đoán. Đây có phải là các nút và cạnh thực tế tạo ra mỗi trong số 500 cây cần gần 7 GB dung lượng trên đĩa không?

Tôi đã sử dụng ứng dụng ngẫu nhiên của scikitlearn:

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

Ngoài ra, nếu có một cách tốt hơn để làm cho mô hình của tôi có thể truy cập được thông qua API, thì đó cũng là điều tốt để biết.

Cập nhật: Tôi đã giảm xuống còn 100 cây mà không mất nhiều sức mạnh dự đoán, và vì vậy bây giờ kích thước đã lưu là 1,3 GB - dễ quản lý hơn nhiều, nhưng vẫn không tuyệt vời.


1
Lol và tôi nghĩ rằng tôi là lớn. Khu rừng ngẫu nhiên của tôi mất 330 Mb, tôi thấy nó thật kỳ lạ, nghĩ rằng đó là kích thước khổng lồ cho một tập tin, vì vậy tôi đã đến đây và tôi thấy bạn mất 6,57 Gb vì vậy bây giờ tôi cảm thấy tốt hơn nhờ lol. Tôi không biết số lượng hồ sơ của bạn nhưng tôi cho rằng điều đó sẽ tạo ra sự khác biệt. Tôi cũng đang sử dụng 500 cây, tôi đã thử với 100, 500 và 1000, không nhận thấy sự khác biệt đáng kể về độ chính xác nên đã quay lại 500.
AndroidMarshmallow

Câu trả lời:


4

Kích thước của mỗi cây phụ thuộc rất nhiều vào độ sâu của nó. Do đó, thay đổi độ sâu tối đa ( max_depth). Cố gắng đặt nó thành số hữu hạn (trái ngược với "Không" mặc định) và sau đó cố gắng giảm số này. Ngoài ra (hoặc thay thế) cố gắng tăng min_samples_splithoặc min_samples_split.

Bạn cũng có thể phân tích các tính năng của bạn và chỉ giữ lại những tính năng quan trọng. Cách đơn giản nhất là nhìn vào clf.feature_importances_khu rừng của bạn. (Nói chung, tìm các tính năng quan trọng là một nghệ thuật và khoa học trên chính nó.) Loại trừ các tính năng không liên quan và xây dựng lại khu rừng.


2

Thử cái này:

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

Lưu ý: với tham số "-1", kích thước tệp mô hình sẽ giảm đi phần lớn.

Theo tài liệu:

pickle.dump (obj, tệp [, giao thức])

Giao thức phiên bản 0 là giao thức ASCII ban đầu và tương thích ngược với các phiên bản trước của Python. Giao thức phiên bản 1 là định dạng nhị phân cũ cũng tương thích với các phiên bản trước của Python. Giao thức phiên bản 2 đã được giới thiệu trong Python 2.3. Nó cung cấp hiệu quả hơn nhiều của lớp học kiểu mới.

Nếu tham số giao thức bị bỏ qua, giao thức 0 được sử dụng. Nếu giao thức được chỉ định là giá trị âm hoặc HIGHEST_PROTOCOL, phiên bản giao thức cao nhất sẽ được sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.