Python 在sklearn中保存MinMaxScaler模型

Python 在sklearn中保存MinMaxScaler模型,python,machine-learning,scikit-learn,normalization,Python,Machine Learning,Scikit Learn,Normalization,我正在使用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.

我正在使用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()
和训练数据。有没有办法保存定标器并稍后从其他文件加载

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

甚至比
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) 

注意:
sklearn.externals.joblib
不推荐使用。安装并使用纯
joblib
而不是所以我实际上不是这方面的专家,但通过一些研究和一些有用的信息,我认为
pickle
sklearn.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 externals的信息

如果没有帮助或者我不了解你的模型,请告诉我


注意:
sklearn.externals.joblib
不推荐使用。请注意,
sklearn.externals.joblib
已被弃用,并被普通的旧版本取代,可与
pip Install joblib
一起安装:

import joblib
joblib.dump(my_scaler, 'scaler.gz')
my_scaler = joblib.load('scaler.gz')
请注意,文件扩展名可以是任何内容,但如果它是
['.z'、'.gz'、'.bz2'、'.xz'、'.lzma']
中的一个,则将使用相应的压缩协议。文档和方法。

最好的方法是创建如下所示的ML管道: 现在,您可以将其保存到文件中: 稍后,您可以按如下方式加载它:
出于某种原因,当我使用它保存
MinMaxScaler
时,加载的定标器不会将数据以相同的方式缩放到新安装的定标器。知道为什么吗?@BallpointBen刚刚在一个单独的测试集上进行了测试,得到了相同的结果。也许你又使用了
np.random.rand
?这是一个很好的解决方案,但pickle也一样,不是吗?我是机器学习的初学者。它不是--
joblib。dump
是为转储sklearn对象而优化的,因此创建的文件比pickle小得多,pickle会转储对象及其所有依赖项等等。我对
pickle
的经验很差:它可能适用于短期导出,但时间较长,您必须处理协议版本(酸洗参数之一),我在加载旧导出时遇到了错误。因此,我更喜欢这个答案。您可以在这里使用joblib或pickle。关键是创建一个管道,这样就不必单独调用scaler。这不是保存模型,对吗?如果是这样,这似乎是一个比上述更好的答案,因为您不必管理两个单独的文件。
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')