web-dev-qa-db-fra.com

Enregistrer le modèle MinMaxScaler dans sklearn

J'utilise le modèle MinMaxScaler dans sklearn pour normaliser les fonctionnalités d'un modèle.

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]]

Maintenant, je veux utiliser le même scaler pour normaliser l'ensemble de test:

   [[ 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]]

Mais je ne veux pas utiliser la scaler.fit() avec les données d'entraînement tout le temps. Existe-t-il un moyen de sauvegarder le scaler et de le charger plus tard à partir d'un fichier différent?

Je ne suis donc pas un expert en la matière, mais à partir d'un peu de recherche et de quelques informations utiles liens , je pense que pickle et sklearn.externals.joblib vont être vos amis ici.

Le package pickle vous permet d'enregistrer des modèles ou des modèles "dump" dans un fichier.

Je pense que cela link est également utile. Il parle de créer un modèle de persistance. Vous allez essayer quelque chose:

# 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') 

Ici est l'endroit où vous pouvez en savoir plus sur les externes sklearn.

Faites-moi savoir si cela n'aide pas ou si je ne comprends rien à votre modèle.

15
jlarks32

Encore mieux que pickle (qui crée des fichiers beaucoup plus volumineux que cette méthode), vous pouvez utiliser l'outil intégré de sklearn:

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

# And now to load...

scaler = joblib.load(scaler_filename) 
57
Ivan Vegner

Vous pouvez utiliser pickle, pour enregistrer le scaler:

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

Rechargez-le:

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

Juste une note que sklearn.externals.joblib A été déprécié et est remplacé par le vieux joblib , qui peut être installé avec pip install joblib:

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

Documents pour les méthodes joblib.dump() et joblib.load() .

3
Engineero

La meilleure façon de procéder consiste à créer un pipeline ML comme suit:

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)

Vous pouvez maintenant l'enregistrer dans un fichier:

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

Plus tard, vous pouvez le charger comme ceci:

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