由於我們想將所有這些數據保存在一個對象中,所以一個可能的方法是創建一個繼承我們的示例中的模型類的新類LogisticRegression。這個新類被MyLogReg調用,然後分別實現save_json和load_json的方法以保存和恢複JSON文件。
為簡單起見,我們將隻保存三個模型參數和訓練數據。我們可以用這種方法存儲一些額外的數據,例如訓練集上的交叉驗證分數,測試數據,測試數據的準確度等等。
現在我們來試一試MyLogReg。首先我們創建一個對象mylogreg,將訓練數據傳遞給它,並將其保存到文件中。然後我們創建一個新對象json_mylogreg,並調用該load_json方法從文件加載數據。
打印出新的對象,我們可以根據需要來查看我們的參數和訓練數據。
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版本和學習模型的變化中存在兼容性問題。另一方麵,手動方法更難實現,需要在模型結構發生任何變化中進行修改,但在另一方麵,它可以輕鬆地適應各種需求,並且沒有任何兼容性問題。
作者信息
作者:Mihajlo Pavloski,數據科學與機器學習的愛好者,博士生。
社區組織翻譯。
文章為簡譯,更為詳細的內容,請查看