¿Cómo puedo guardar una capacitados Bayes ingenuo clasificador de disco y utilizarlo para predecir datos?
Tengo el siguiente programa de muestra del sitio web 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()
También puede usar joblib.dump y joblib.load, que es mucho más eficiente en el manejo de matrices numéricas que el selector de python predeterminado.
Joblib está incluido en scikit-learn:
Editar: en Python 3.8+ ahora es posible usar pickle para el decapado eficiente de objetos con grandes matrices numéricas como atributos si usa el protocolo 5 de pickle (que no es el predeterminado).
fuente
fit
método si esto es lo que está buscando. Dicho esto,joblib.load
no debería generar una excepción después de un éxitojoblib.dump
si lo llama desde un Python con la misma versión de la biblioteca scikit-learn.--pylab
indicador de línea de comando o la%pylab
magia ya que se sabe que la sobrecarga implícita del espacio de nombres interrumpe el proceso de decapado. Utilice importaciones explícitas y la%matplotlib inline
magia en su lugar.Lo que estás buscando se llama Persistencia del modelo en palabras sklearn y está documentado en la introducción y en las secciones de persistencia del modelo .
Entonces, ha inicializado su clasificador y lo ha entrenado durante mucho tiempo con
Después de esto tienes dos opciones:
1) Usando Pickle
2) Usando Joblib
Una vez más, es útil leer los enlaces mencionados anteriormente
fuente
En muchos casos, particularmente con la clasificación de texto, no es suficiente solo almacenar el clasificador, sino que también deberá almacenar el vectorizador para poder vectorizar su entrada en el futuro.
caso de uso futuro:
Antes de descargar el vectorizador, se puede eliminar la propiedad stop_words_ del vectorizador de la siguiente manera:
para que el vertido sea más eficiente. Además, si los parámetros de su clasificador son escasos (como en la mayoría de los ejemplos de clasificación de texto), puede convertir los parámetros de densos a dispersos, lo que marcará una gran diferencia en términos de consumo de memoria, carga y descarga. Sparsify el modelo por:
Lo que funcionará automáticamente para SGDClassifier pero en caso de que sepa que su modelo es escaso (muchos ceros en clf.coef_), puede convertir manualmente clf.coef_ en una matriz dispersa scipy csr de la siguiente manera :
y luego puedes almacenarlo de manera más eficiente.
fuente
sklearn
los estimadores implementan métodos para facilitarle el almacenamiento de propiedades capacitadas relevantes de un estimador. Algunos estimadores implementan__getstate__
métodos ellos mismos, pero otros, como elGMM
solo usan la implementación base que simplemente guarda el diccionario interno de objetos:El método recomendado para guardar su modelo en el disco es usar el
pickle
módulo:Sin embargo, debe guardar datos adicionales para poder volver a entrenar su modelo en el futuro o sufrir graves consecuencias (como estar bloqueado en una versión anterior de sklearn) .
De la documentación :
Esto es especialmente cierto para los estimadores de Ensemble que se basan en el
tree.pyx
módulo escrito en Cython (comoIsolationForest
), ya que crea un acoplamiento a la implementación, que no se garantiza que sea estable entre las versiones de sklearn. Ha visto cambios hacia atrás incompatibles en el pasado.Si sus modelos se vuelven muy grandes y la carga se vuelve una molestia, también puede usar el más eficiente
joblib
. De la documentación:fuente
but can only pickle to the disk and not to a string
Pero podría enredar esto en StringIO desde joblib. Esto es lo que hago todo el tiempo.The training data, e.g. a reference to a immutable snapshot
aquí? TIA!sklearn.externals.joblib
ha quedado en desuso desde entonces0.21
y se eliminará env0.23
:Por lo tanto, necesita instalar
joblib
:y finalmente escribe el modelo en el disco:
Ahora, para leer el archivo volcado, todo lo que necesita ejecutar es:
fuente