Guarde el modelo MinMaxScaler en sklearn

4 minutos de lectura

Avatar de usuario de Luis Ramón Ramírez Rodríguez
Luis Ramón Ramírez Rodríguez

estoy usando el MinMaxScaler model en sklearn para normalizar las características de un modelo.

training_set = np.random.rand(4,4)*10
training_set

       [[ 6.01144787,  0.59753007,  2.0014852 ,  3.45433657],
       [ 6.03041646,  5.15589559,  6.64992437,  2.63440202],
       [ 2.27733136,  9.29927394,  0.03718093,  7.7679183 ],
       [ 9.86934288,  7.59003904,  6.02363739,  2.78294206]]


scaler = MinMaxScaler()
scaler.fit(training_set)    
scaler.transform(training_set)


   [[ 0.49184811,  0.        ,  0.29704831,  0.15972182],
   [ 0.4943466 ,  0.52384506,  1.        ,  0.        ],
   [ 0.        ,  1.        ,  0.        ,  1.        ],
   [ 1.        ,  0.80357559,  0.9052909 ,  0.02893534]]

Ahora quiero usar el mismo escalador para normalizar el conjunto de prueba:

   [[ 8.31263467,  7.99782295,  0.02031658,  9.43249727],
   [ 1.03761228,  9.53173021,  5.99539478,  4.81456067],
   [ 0.19715961,  5.97702519,  0.53347403,  5.58747666],
   [ 9.67505429,  2.76225253,  7.39944931,  8.46746594]]

Pero no quiero, así que usa el scaler.fit() con los datos de entrenamiento todo el tiempo. ¿Hay alguna forma de guardar el escalador y cargarlo más tarde desde un archivo diferente?

Avatar de usuario de Ivan Vegner
Iván Vegner

Actualizar: sklearn.externals.joblib es obsoleto. Instale y use el puro joblib en cambio. Consulte la respuesta de Engineero a continuación, que por lo demás es idéntica a la mía.

respuesta original

Incluso mejor que pickle (que crea archivos mucho más grandes que este método), puede usar sklearnHerramienta integrada de:

from sklearn.externals import joblib
scaler_filename = "scaler.save"
joblib.dump(scaler, scaler_filename) 

# And now to load...

scaler = joblib.load(scaler_filename) 

  • Es una buena solución, pero lo mismo con el pepinillo, ¿no? Soy un principiante en el aprendizaje automático.

    – oro-kou

    1 de julio de 2018 a las 5:07

  • No lo es — joblib.dump está optimizado para volcar objetos sklearn y, por lo tanto, crea archivos mucho más pequeños que pickle, que volca el objeto con todas sus dependencias y demás.

    – Iván Vegner

    02/07/2018 a las 16:30

  • mi experiencia con pickle es deficiente: probablemente funcione para una exportación a corto plazo, pero durante un largo período de tiempo, debe lidiar con la versión del protocolo (uno de los parámetros para el decapado) y he encontrado errores al cargar exportaciones antiguas. Prefiero esta respuesta, por lo tanto.

    – Vojta F.

    26 de febrero de 2019 a las 15:23


avatar de usuario de jlarks32
jlarks32

Así que en realidad no soy un experto en esto, pero a partir de un poco de investigación y algunos enlaces útiles, creo pickle y sklearn.externals.joblib van a ser tus amigos aquí.

El paquete pickle le permite guardar modelos o “volcar” modelos en un archivo.

pienso esto Enlace también es útil. Habla de crear un modelo de persistencia. Algo que vas a querer probar es:

# could use: import pickle... however let's do something else
from sklearn.externals import joblib 

# this is more efficient than pickle for things like large numpy arrays
# ... which sklearn models often have.   

# then just 'dump' your file
joblib.dump(clf, 'my_dope_model.pkl') 

Aquí es donde puede obtener más información sobre los aspectos externos de sklearn.

Avíseme si eso no ayuda o si no entiendo algo sobre su modelo.

Nota: sklearn.externals.joblib es obsoleto. Instale y use el puro joblib en cambio

  • Por alguna razón, cuando uso esto para guardar un MinMaxScaler, el escalador cargado no escala los datos de forma idéntica a un escalador recién instalado. ¿Alguna idea de por qué?

    – BolígrafoBen

    8 jun 2017 a las 19:53


  • @BallpointBen Lo probé en un conjunto de prueba separado y obtuve los mismos resultados. tal vez usaste np.random.rand ¿otra vez?

    – Breina

    2 de julio de 2017 a las 9:46

Avatar de usuario de Ingeniero
Ingeniero

Solo una nota que sklearn.externals.joblib ha quedado en desuso y es reemplazado por el antiguo joblibque se puede instalar con pip install joblib:

import joblib
joblib.dump(my_scaler, 'scaler.gz')
my_scaler = joblib.load('scaler.gz')

Tenga en cuenta que las extensiones de archivo pueden ser cualquier cosa, pero si es una de ['.z', '.gz', '.bz2', '.xz', '.lzma'] entonces se utilizará el protocolo de compresión correspondiente. documentos para joblib.dump() y joblib.load() métodos.

Puedes usar picklepara guardar el escalador:

import pickle
scalerfile="scaler.sav"
pickle.dump(scaler, open(scalerfile, 'wb'))

Vuelva a cargarlo:

import pickle
scalerfile="scaler.sav"
scaler = pickle.load(open(scalerfile, 'rb'))
test_scaled_set = scaler.transform(test_set)

La mejor manera de hacer esto es crear una canalización de ML como la siguiente:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.externals import joblib


pipeline = make_pipeline(MinMaxScaler(),YOUR_ML_MODEL() )

model = pipeline.fit(X_train, y_train)

Ahora puede guardarlo en un archivo:

joblib.dump(model, 'filename.mod') 

Más tarde puedes cargarlo así:

model = joblib.load('filename.mod')

  • Puede usar joblib o pickle aquí. El punto es crear una canalización para que no tenga que llamar al escalador por separado.

    – PSN

    23 de agosto de 2019 a las 9:24

  • Esto es en cambio de guardar el modelo, ¿correcto? Si es así, esta parece una mejor respuesta que la anterior, ya que no tiene que administrar dos archivos separados.

    – de corazón codificado

    13 de agosto de 2020 a las 3:37

  • Puede usar joblib o pickle aquí. El punto es crear una canalización para que no tenga que llamar al escalador por separado.

    – PSN

    23 de agosto de 2019 a las 9:24

  • Esto es en cambio de guardar el modelo, ¿correcto? Si es así, esta parece una mejor respuesta que la anterior, ya que no tiene que administrar dos archivos separados.

    – de corazón codificado

    13 de agosto de 2020 a las 3:37

¿Ha sido útil esta solución?