2017-02-02 1 views
6

J'utilise le modèle MinMaxScaler dans sklearn pour normaliser les caractéristiques d'un modèle.Enregistrer le modèle de scaler dans sklearn

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 le scaler.fit() avec les données de formation tout le temps. Existe-t-il un moyen de sauvegarder le scaler et de le charger plus tard à partir d'un fichier différent?

Répondre

4

Donc, je ne suis pas vraiment un expert avec cela, mais à partir d'un peu de recherche et quelques links utiles, je pense que pickle et sklearn.externals.joblib vont être vos amis ici.

Le package pickle vous permet de sauvegarder des modèles ou de "vider" des modèles dans un fichier. Je pense que ce link est également utile. Il parle de créer un modèle de persistance. Quelque chose que vous allez vouloir essayer est:

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

Here est où vous pouvez en savoir plus sur les externals de sklearn. Faites-moi savoir si cela ne vous aide pas ou si je ne comprends pas quelque chose à propos de votre modèle.

+0

Pour une raison quelconque, lorsque je l'utilise pour enregistrer un 'MinMaxScaler', le mesureur chargé n'aligne pas les données de la même manière qu'un nouveau correcteur. Une idée pourquoi? – BallpointBen

+0

@BallpointBen Juste essayé sur un ensemble de test séparé et obtenu les mêmes résultats. Peut-être que vous avez utilisé 'np.random.rand' à nouveau? –

4

Vous pouvez utiliser pickle, pour sauver le scaler:

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

charge en arrière:

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

Encore mieux que pickle (ce qui crée des fichiers beaucoup plus que cette méthode), vous pouvez utiliser Outil intégré sklearn:

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

# And now to load... 

scaler = joblib.load(scaler_filename)