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?
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 sklearn
Herramienta 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
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
Ingeniero
Solo una nota que sklearn.externals.joblib
ha quedado en desuso y es reemplazado por el antiguo joblib
que 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 pickle
para 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