735 阿裏雲 技術社區[雲棲]
深度學習小技巧(二):如何保存和恢複scikit-learn訓練的模型更多深度文章,請關注雲計算頻道:https://yq.aliyun.com/cloud
深度學習小技巧(一):如何保存和恢複TensorFlow訓練的模型
在許多情況下,在使用scikit學習庫的同時,你需要將預測模型保存到文件中,然後在使用它們的時候還原它們,以便重複使用以前的工作。比如在新數據上測試模型,比較多個模型的優劣。這種保存過程也稱為對象序列化——表示具有字節流的對象,以便將其存儲在磁盤上,它可以通過網絡發送或保存到數據庫,而其恢複的過程被稱為反序列化。在本文中,我們將在Python和scikit學習中看到三種可能的方法,而且每種都有其優點和缺點。
1.保存和恢複模型的工具
庫,它提供了容易(de)序列化方法,其中包含了大數據數組的對象,最後我們會介紹一種手動方法來保存和恢複JSON對象(JavaScript Object Notation)。這些方法都不能代表最佳解決方案,但是可以根據項目的需要選擇合適的方案。
2.模型初始化
from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # Load and split data data = load_iris() Xtrain, Xtest, Ytrain, Ytest = train_test_split(data.data, data.target, test_size=0.3, random_state=4)
現在讓我們用一些非默認參數來創建模型,並用訓練數據來“喂養”它。我們假設你先前已經找到了模型的最優參數,即產生最高估計精度的參數。
# Create a model model = LogisticRegression(C=0.1, max_iter=20, fit_intercept=True, n_jobs=3, solver='liblinear') model.fit(Xtrain, Ytrain)
這是我們產生的模型:
LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=20, multi_class='ovr', n_jobs=3, penalty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False)
使用該fit方法,模型已經學習了存儲在其中的係數model.coef_。目標是將模型的參數和係數保存到文件中,因此你不需要再次對新數據重複模型訓練和參數優化的步驟。
3.Pickle模塊
在以下幾行代碼中,我們將上一步中創建的模型保存到文件中,然後作為一個新對象加載pickled_model。然後使用加載的模型計算準確度分數,並對新的未見(測試)數據進行預測結果。
運行此代碼應該會產生你的預測分數,並通過Pickle保存模型:
$ python save_model_pickle.py Test score: 91.11 %
使用Pickle來保存和恢複學習模型的好處在於它很快,並且你可以用兩行代碼完成。如果你已經對訓練數據上的模型參數進行了優化,那麼這是非常有用的,因此你不需要重複此步驟。不管如何,它都不保存測試結果和任何數據。但仍然可以保存多個對象的元組或列表(並記住哪個對象在哪裏),如下所示:
tuple_objects = (model, Xtrain, Ytrain, score) # Save tuple pickle.dump(tuple_objects, open("tuple_model.pkl", 'wb')) # Restore tuple pickled_model, pickled_Xtrain, pickled_Ytrain, pickled_score = pickle.load(open("tuple_model.pkl", 'rb'))
3.Joblib模塊
Joblib庫它的目的是替代Pickle,用於包含大數據的對象。我們將重複與Pickle一樣的保存和恢複過程。
$ python save_model_joblib.py Test score: 91.11 %
從示例中可以看出,與Pickle相比,Joblib庫提供了一個簡單的工作流程。雖然Pickle要求將文件對象作為參數傳遞,但是Joblib可與文件對象和字符串文件名一起使用。如果你的模型包含大量數據,則每個數組將存儲在單獨的文件中,但整體的保存和恢複過程將保持不變。Joblib還允許使用不同的壓縮方法,如“zlib”,“gzip”,“bz2”和不同的壓縮級別。
4.手動保存並還原到JSON
以下顯示了使用JSON手動保存和恢複對象的示例。這種方法允許我們選擇需要保存的數據,例如模型參數,係數,訓練數據以及我們需要的任何其他數據。