Como salvar um classificador treinado Naive Bayes em disco e usá-lo para prever dados?
Eu tenho o seguinte programa de amostra no site scikit-learn:
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print "Number of mislabeled points : %d" % (iris.target != y_pred).sum()
Você também pode usar joblib.dump e joblib.load, que são muito mais eficientes no tratamento de matrizes numéricas do que o seletor python padrão.
O joblib está incluído no scikit-learn:
Edit: no Python 3.8+, agora é possível usar pickle para pickling eficiente de objetos com grandes matrizes numéricas como atributos se você usar o protocolo 5 de pickle (que não é o padrão).
fonte
fit
método se é isso que você está procurando. Dito isto,joblib.load
não deve gerar uma exceção após um êxito,joblib.dump
se você a chamar de um Python com a mesma versão da biblioteca scikit-learn.--pylab
sinalizador de linha de comando ou a%pylab
mágica, pois a sobrecarga implícita de espaço para nome é conhecida por interromper o processo de decapagem. Use importações explícitas e a%matplotlib inline
mágica.O que você está procurando é chamado de persistência do modelo no sklearn words e está documentado nas seções introdução e persistência do modelo .
Então você inicializou seu classificador e o treinou por um longo tempo com
Depois disso, você tem duas opções:
1) Usando Pickle
2) Usando o Joblib
Mais uma vez, é útil ler os links mencionados acima
fonte
Em muitos casos, principalmente na classificação de texto, não basta armazenar o classificador, mas você também precisará armazenar o vetorizador para poder vetorizar sua entrada no futuro.
caso de uso futuro:
Antes de descarregar o vetorizador, é possível excluir a propriedade stop_words_ do vetorizador:
para tornar o dumping mais eficiente. Além disso, se os parâmetros do seu classificador forem escassos (como na maioria dos exemplos de classificação de texto), você poderá converter os parâmetros de denso para esparso, o que fará uma enorme diferença em termos de consumo de memória, carregamento e descarte. Sparsify o modelo por:
O que funcionará automaticamente para SGDClassifier, mas, se você souber que seu modelo é escasso (muitos zeros em clf.coef_), poderá converter manualmente o clf.coef_ em uma matriz esparsa csr scipy :
e então você pode armazená-lo com mais eficiência.
fonte
sklearn
os estimadores implementam métodos para facilitar o salvamento de propriedades treinadas relevantes de um estimador. Alguns estimadores implementam__getstate__
métodos eles mesmos, mas outros, como oGMM
apenas usam a implementação base, que simplesmente salva o dicionário interno dos objetos:O método recomendado para salvar seu modelo em disco é usar o
pickle
módulo:No entanto, você deve salvar dados adicionais para treinar novamente o seu modelo no futuro ou sofrer conseqüências terríveis (como ficar preso a uma versão antiga do sklearn) .
A partir da documentação :
Isso é especialmente verdadeiro para os estimadores do Ensemble que dependem do
tree.pyx
módulo escrito em Cython (comoIsolationForest
), uma vez que ele cria um acoplamento à implementação, que não garante a estabilidade entre as versões do sklearn. Viu mudanças incompatíveis com versões anteriores no passado.Se seus modelos se tornarem muito grandes e o carregamento se tornar um incômodo, você também poderá usar os mais eficientes
joblib
. A partir da documentação:fonte
but can only pickle to the disk and not to a string
Mas você pode incluir isso no StringIO no joblib. É isso que faço o tempo todo.sklearn.externals.joblib
foi descontinuado desde então0.21
e será removido emv0.23
:Portanto, você precisa instalar
joblib
:e finalmente escreva o modelo no disco:
Agora, para ler o arquivo despejado, tudo o que você precisa executar é:
fonte