在sklearn中保存MinMaxScaler模型

73

我正在使用sklearn中的MinMaxScaler模型对模型的特征进行归一化。

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()来拟合训练数据。有没有办法将Scaler保存起来,然后在以后的某个时间从另一个文件中加载它呢?

5个回答

116

更新: sklearn.externals.joblib已被弃用。请安装并使用纯粹的joblib。请参见下面的Engineero的答案,该答案与我的完全相同。

原始回答

比起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) 

1
这是一个不错的解决方案,但与pickle一样吧?我是机器学习的初学者。 - gold-kou
3
这并不是 -- joblib.dump 被优化用于转储 sklearn 对象,因此创建的文件比 pickle 更小,后者会将对象及其所有依赖项一起转储。 - Ivan Vegner
1
我对pickle的经验不好:它可能适用于短期导出,但长时间后,你必须处理协议版本(pickling的参数之一),我在加载旧的导出时遇到了错误。因此,我更喜欢这个答案。 - Vojta F

41

请注意,sklearn.externals.joblib已被弃用,现在可以使用普通的joblib代替,并且可以通过pip install joblib进行安装:

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

请注意,文件扩展名可以是任何东西,但如果是以下扩展名之一:['.z', '.gz', '.bz2', '.xz', '.lzma']则会使用相应的压缩协议。有关joblib.dump()joblib.load()方法的文档。


41

我其实不是这方面的专家,但经过一些研究和一些有帮助的链接,我认为 picklesklearn.externals.joblib 可能会对你有帮助。

这个pickle包可以让你把模型保存或“倾倒”到一个文件中。

我觉得这个链接也很有用。它谈到了创建持久化模型的方法。你可能想要尝试的一些东西是:

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

这里是你可以了解更多关于sklearn外部库的信息。

如果这并没有帮助或者我没有正确理解你的模型,请告诉我。

注意: sklearn.externals.joblib已经被弃用。请安装并使用纯粹的joblib代替。


4
不知道为什么,当我使用这个方法保存一个 MinMaxScaler 后,加载的缩放器与刚刚适配的缩放器无法完全相同地进行数据缩放。有任何想法吗? - BallpointBen
@BallpointBen 刚刚在另一个测试集上尝试了一下,结果相同。也许你又使用了 np.random.rand - Breina

21

您可以使用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)

13

最好的方法是创建以下的ML流程:

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)

现在你可以将它保存到文件中:

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

稍后您可以按照以下方式加载它:

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

2
你可以在这里使用joblib或pickle。重点是创建一个管道,这样你就不必单独调用缩放器了。 - PSN
1
这是代替保存模型的方法,对吗?如果是这样的话,这似乎比上面的答案更好,因为您不必管理两个单独的文件。 - codehearted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接