Tamanho proibitivo de floresta aleatória quando salvo em disco

9

Quando salva em disco usando o cPickle: /programming/20662023/save-python-random-forest-model-to-file , minha floresta aleatória tem 6,57 GB.

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

Quero usar a própria floresta para fazer previsões por meio de uma API python hospedada no Heroku - é claro, esse tamanho de arquivo é inaceitável.

Por que o tamanho do arquivo é tão grande? Existem 500 árvores no conjunto - tudo o que quero salvar são as próprias árvores concluídas, pois serão usadas como previsão. São os nós e as bordas reais que compõem cada uma das 500 árvores que requerem quase 7 GB de espaço em disco?

Eu usei o randomforestregressor do scikitlearn:

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

Além disso, se houver uma maneira melhor de tornar meu modelo acessível via API, também seria bom saber.

Atualização: reduzi-o para 100 árvores sem perder muito poder preditivo, e agora o tamanho salvo é de 1,3 GB - muito mais gerenciável, mas ainda não ótimo.

compguy24
fonte
1
Lol e eu pensamos que o meu era grande. Minha floresta aleatória tinha 330 Mb, achei estranho, achei que era um tamanho enorme para um arquivo, então eu vim aqui e vi a sua com 6,57 Gb, então agora me sinto melhor lol, obrigado. Não sei o seu número de registros, mas suponho que isso fará diferença. Eu também estou usando 500 árvores, tentei com 100, 500 e 1000, não notei uma diferença considerável na precisão, então voltei para 500. #
9788 Android

Respostas:

5

O tamanho de cada árvore depende muito de sua profundidade. Assim, altere a profundidade máxima ( max_depth). Tente configurá-lo para número finito (em oposição ao padrão "Nenhum") e tente reduzir esse número. Além disso (ou como alternativa), tente aumentar min_samples_splitou min_samples_split.

Você também pode analisar seus recursos e manter apenas os importantes. A maneira mais simples seria dar uma olhada na clf.feature_importances_floresta. (Em geral, encontrar características importantes é uma arte e ciência por si só.) Exclua características não relevantes e reconstrua a floresta.

lanenok
fonte
2

Tente isto:

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

Nota: com o parâmetro "-1", o tamanho do arquivo do modelo será bastante reduzido.

De acordo com a documentação:

pickle.dump (obj, arquivo [, protocolo])

O protocolo versão 0 é o protocolo ASCII original e é compatível com versões anteriores do Python. A versão 1 do protocolo é o antigo formato binário que também é compatível com as versões anteriores do Python. O protocolo versão 2 foi introduzido no Python 2.3. Ele fornece decapagem muito mais eficiente de novas classes de estilo.

Se o parâmetro protocol for omitido, o protocolo 0 será usado. Se o protocolo for especificado como um valor negativo ou HIGHEST_PROTOCOL, a versão mais alta do protocolo será usada.

elecjack
fonte