2017-02-02 7 views
6

Я использую модель MinMaxScaler в sklearn для нормализации функций модели.Сохранить модель скалера в 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]] 

Теперь я хочу, чтобы использовать тот же скейлер для нормализации тестового набора:

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

Но я не хочу, так что используйте scaler.fit() с обучающими данными всего время. Есть ли способ сохранить скалер и загрузить его позже из другого файла?

ответ

4

Так что я на самом деле не специалист в этом, но из небольшого количества исследований и нескольких полезных links, думаю, pickle и sklearn.externals.joblib будут твоими друзьями здесь.

Пакет pickle позволяет сохранять модели или модели «дампа» в файл.

Я думаю, что это link также полезно. В нем говорится о создании модели сохранения. То, что вы будете хотеть, чтобы попробовать это:

# 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, где вы можете узнать больше о sklearn внешнеположенности.

Сообщите мне, если это не поможет, или я ничего не понимаю о вашей модели.

+0

По какой-то причине, когда я использую это для сохранения 'MinMaxScaler', загруженный сканер не масштабирует данные идентично только что установленному масштабируемому. Любая идея почему? – BallpointBen

+0

@BallpointBen Просто попробовал это на отдельном тестовом наборе и получил те же результаты. Возможно, вы снова использовали 'np.random.rand'? –

4

Вы можете использовать pickle, чтобы сохранить скейлер:

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

Загрузите его обратно:

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

Даже лучше, чем pickle (что создает гораздо больше файлов, чем этот метод), вы можете использовать sklearn:

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

# And now to load... 

scaler = joblib.load(scaler_filename)