SKlearn:有没有办法保存预处理对象?

时间:2017-03-16 19:36:36

标签: machine-learning tensorflow scikit-learn preprocessor sklearn-pandas

我正在构建一个神经网络,目的是在将来对新数据进行预测。我首先使用sklearn.preprocessing预处理训练数据,然后训练模型,然后进行一些预测,然后关闭程序。将来,当新数据出现时,我必须使用相同的预处理比例来转换新数据,然后再将其放入模型中。目前,我必须加载所有旧数据,适合预处理器,然后使用这些预处理器转换新数据。有没有办法让我保存预处理对象对象(比如sklearn.preprocessing.StandardScaler),以便我可以加载旧对象而不必重新制作它们?

2 个答案:

答案 0 :(得分:3)

我认为,除了泡菜外,您还可以使用joblib来做到这一点。如Scikit-learn的手册3.4. Model persistence

中所述

在scikit-learn的特定情况下,最好使用joblib代替pickle(转储和加载),这在内部携带大型numpy数组的对象上效率更高,这通常是适合scikit-learn的情况估计量,但只能将其腌制到磁盘上,而不能腌制到字符串中:

from joblib import dump, load
dump(clf, 'filename.joblib') 

稍后,您可以使用以下方法重新加载腌制的模型(可能在另一个Python进程中):

clf = load('filename.joblib') 

有关其他信息,请参见其他帖子Saving StandardScaler() model for use on new datasetsSave MinMaxScaler model in sklearn

答案 1 :(得分:1)

如lejlot所述,您可以使用库pickle将经过训练的网络保存为硬盘中的文件,然后您只需加载它即可开始预测。

以下是如何使用pickle来保存和加载python对象的示例:

import pickle
import numpy as np

npTest_obj = np.asarray([[1,2,3],[6,5,4],[8,7,9]])

strTest_obj = "pickle example XXXX"


if __name__ == "__main__":
    # store object information
    pickle.dump(npTest_obj, open("npObject.p", "wb"))
    pickle.dump(strTest_obj, open("strObject.p", "wb"))

    # read information from file
    str_readObj = pickle.load(open("strObject.p","rb"))
    np_readObj = pickle.load(open("npObject.p","rb"))
    print(str_readObj)
    print(np_readObj)