¿Cómo almaceno un TfidfVectorizer para uso futuro en scikit-learn?

Tengo un TfidfVectorizer que vectoriza la colección de artículos seguido de la selección de características.

 vectroizer = TfidfVectorizer() X_train = vectroizer.fit_transform(corpus) selector = SelectKBest(chi2, k = 5000 ) X_train_sel = selector.fit_transform(X_train, y_train) 

Ahora, quiero guardar esto y usarlo en otros progtwigs. No quiero volver a ejecutar el TfidfVectorizer() y el selector de funciones en el conjunto de datos de entrenamiento. ¿Cómo puedo hacer eso? Sé cómo hacer que un modelo sea persistente utilizando joblib pero me pregunto si esto es lo mismo que hacer que un modelo sea persistente.

Usted puede simplemente utilizar el lib de pickle incorporado:

 pickle.dump(vectorizer, open("vectorizer.pickle", "wb")) pickle.dump(selector, open("selector.pickle", "wb")) 

y cargarlo con:

 vectorizer = pickle.load(open("vectorizer.pickle"), "rb")) selector = pickle.load(open("selector.pickle"), "rb")) 

Pickle serializará los objetos en el disco y los cargará en la memoria nuevamente cuando lo necesite

docs de pickle lib

Aquí está mi respuesta usando joblib:

 joblib.dump(vectorizer, 'vectroizer.pkl') joblib.dump(selector, 'selector.pkl') 

Más tarde, puedo cargarlo y listo para ir:

 vectorizer = joblib.load('vectorizer.pkl') selector = joblib.load('selector.pkl') test = selector.trasnform(vectorizer.transform(['this is test'])) 

“Hacer que un objeto sea persistente” básicamente significa que va a volcar el código binario almacenado en la memoria que representa el objeto en un archivo en el disco duro, para que más adelante en su progtwig o en cualquier otro progtwig el objeto pueda ser recargado desde el archivo en el disco duro a la memoria.

Scikit-learn incluía joblib o stdlib pickle y cPickle harían el trabajo. cPickle a preferir cPickle porque es significativamente más rápido. Usando el comando% timeit de ipython :

 >>> from sklearn.feature_extraction.text import TfidfVectorizer as TFIDF >>> t = TFIDF() >>> t.fit_transform(['hello world'], ['this is a test']) # generic serializer - deserializer test >>> def dump_load_test(tfidf, serializer): ...: with open('vectorizer.bin', 'w') as f: ...: serializer.dump(tfidf, f) ...: with open('vectorizer.bin', 'r') as f: ...: return serializer.load(f) # joblib has a slightly different interface >>> def joblib_test(tfidf): ...: joblib.dump(tfidf, 'tfidf.bin') ...: return joblib.load('tfidf.bin') # Now, time it! >>> %timeit joblib_test(t) 100 loops, best of 3: 3.09 ms per loop >>> %timeit dump_load_test(t, pickle) 100 loops, best of 3: 2.16 ms per loop >>> %timeit dump_load_test(t, cPickle) 1000 loops, best of 3: 879 µs per loop 

Ahora, si desea almacenar varios objetos en un solo archivo, puede crear fácilmente una estructura de datos para almacenarlos, y luego volcar la estructura de datos en sí. Esto funcionará con tuple , list o dict . Del ejemplo de tu pregunta:

 # train vectorizer = TfidfVectorizer() X_train = vectorizer.fit_transform(corpus) selector = SelectKBest(chi2, k = 5000 ) X_train_sel = selector.fit_transform(X_train, y_train) # dump as a dict data_struct = {'vectorizer': vectorizer, 'selector': selector} # use the 'with' keyword to automatically close the file after the dump with open('storage.bin', 'wb') as f: cPickle.dump(data_struct, f) 

Más adelante o en otro progtwig, las siguientes declaraciones devolverán la estructura de datos en la memoria de su progtwig:

 # reload with open('storage.bin', 'rb') as f: data_struct = cPickle.load(f) vectorizer, selector = data_struct['vectorizer'], data_struct['selector'] # do stuff... vectors = vectorizer.transform(...) vec_sel = selector.transform(vectors)