JSON

深度學習小技巧(二):如何保存和恢複scikit(2)

字号+ 作者:H5之家 来源:H5之家 2017-10-30 18:28 我要评论( )

由於我們想將所有這些數據保存在一個對象中,所以一個可能的方法是創建一個繼承我們的示例中的模型類的新類 LogisticRegression 。這個新類被 MyLogReg 調用,然後分別實現 save_json 和 load_json 的 方法以保存和

由於我們想將所有這些數據保存在一個對象中,所以一個可能的方法是創建一個繼承我們的示例中的模型類的新類LogisticRegression。這個新類被MyLogReg調用,然後分別實現save_jsonload_json方法以保存和恢複JSON文件。

為簡單起見,我們將隻保存三個模型參數和訓練數據。我們可以用這種方法存儲一些額外的數據,例如訓練集上的交叉驗證分數,測試數據,測試數據的準確度等等。


import json import numpy as np class MyLogReg(LogisticRegression): # Override the class constructor def __init__(self, C=1.0, solver='liblinear', max_iter=100, X_train=None, Y_train=None): LogisticRegression.__init__(self, C=C, solver=solver, max_iter=max_iter) self.X_train = X_train self.Y_train = Y_train # A method for saving object data to JSON file def save_json(self, filepath): dict_ = {} dict_['C'] = self.C dict_['max_iter'] = self.max_iter dict_['solver'] = self.solver dict_['X_train'] = self.X_train.tolist() if self.X_train is not None else 'None' dict_['Y_train'] = self.Y_train.tolist() if self.Y_train is not None else 'None' # Creat json and save to file json_txt = json.dumps(dict_, indent=4) with open(filepath, 'w') as file: file.write(json_txt) # A method for loading data from JSON file def load_json(self, filepath): with open(filepath, 'r') as file: dict_ = json.load(file) self.C = dict_['C'] self.max_iter = dict_['max_iter'] self.solver = dict_['solver'] self.X_train = np.asarray(dict_['X_train']) if dict_['X_train'] != 'None' else None self.Y_train = np.asarray(dict_['Y_train']) if dict_['Y_train'] != 'None' else None

現在我們來試一試MyLogReg。首先我們創建一個對象mylogreg,將訓練數據傳遞給它,並將其保存到文件中。然後我們創建一個新對象json_mylogreg並調用該load_json方法從文件加載數據。


filepath = "mylogreg.json" # Create a model and train it mylogreg = MyLogReg(X_train=Xtrain, Y_train=Ytrain) mylogreg.save_json(filepath) # Create a new object and load its data from JSON file json_mylogreg = MyLogReg() json_mylogreg.load_json(filepath) json_mylogreg

打印出新的對象,我們可以根據需要來查看我們的參數和訓練數據。

MyLogReg(C=1.0, X_train=array([[ 4.3, 3. , 1.1, 0.1], [ 5.7, 4.4, 1.5, 0.4], ..., [ 7.2, 3. , 5.8, 1.6], [ 7.7, 2.8, 6.7, 2. ]]), Y_train=array([0, 0, ..., 2, 2]), class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False)

由於使用JSON的數據序列化實際上是將對象保存為字符串格式,而不是字節流,所以'mylogreg.json'文件可以使用文本編輯器打開和修改。雖然這種方法對開發人員來說很方便,但是由於入侵者可以查看和修改JSON文件的內容,因此安全性較低。此外,這種方法更適合於具有少量實例變量的對象,例如scikit-learn模型,因為任何添加新變量都需要在保存和恢複方法中進行更改。

5.兼容性問題

盡管到目前為止,每個工具的優點和缺點已被介紹,但Pickle和Joblib工具的最大缺點可能是其與不同型號的Python版本的兼容性。

5.1:Python版本的兼容性——兩種工具的文檔都指出,不建議(de)在不同的Python版本之間對對象進行序列化,盡管它可能在低級的版本更改中起作用。

5.2:模型兼容性——最常見的錯誤之一是使用Pickle或Joblib保存模型,然後在嚐試從文件還原之前更改模型。模型的內部結構需要在保存和重新加載之間保持不變。

Pickle和Joblib的最後一個問題與安全性有關。這兩種工具都可能包含惡意代碼,因此不建議從不受信任或未經身份驗證的源代碼。

6.結論

在這篇文章中,我們描述了三種保存和恢複scikit學習模型的工具。Pickle和Joblib庫可以快速方便地使用,但是在不同的Python版本和學習模型的變化中存在兼容性問題。另一方麵,手動方法更難實現,需要在模型結構發生任何變化中進行修改,但在另一方麵,它可以輕鬆地適應各種需求,並且沒有任何兼容性問題。

作者信息

1d0a417647e2b22e534a83c43b1b726531e8f4b5


作者:Mihajlo Pavloski數據科學與機器學習的愛好者,博士生。

社區組織翻譯。

文章為簡譯,更為詳細的內容,請查看

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • PowerShell中的特殊变量$null介绍和创建多行注释小技巧 / jeepyu

    PowerShell中的特殊变量$null介绍和创建多行注释小技巧 / jeepyu

    2017-10-24 18:17

  • Backbone.js的一些使用技巧

    Backbone.js的一些使用技巧

    2017-10-24 13:07

  • javascript变量json对象等到路径

    javascript变量json对象等到路径

    2017-10-19 17:33

  • JS使用json数据自动填充表单

    JS使用json数据自动填充表单

    2017-10-13 09:02

网友点评