訓練好了一個Model 以后總需要保存和再次預測, 所以保存和讀取我們的sklearn model也是同樣重要的一步。
比如,我們根據房源樣本數據訓練了一下房價模型,當用戶輸入自己的房子后,我們就需要根據訓練好的房價模型來預測用戶房子的價格。
這樣就需要在訓練模型后把模型保存起來,在使用模型時把模型讀取出來對輸入的數據進行預測。
這里保存和讀取模型有兩種方法,都非常簡單,差別在於保存和讀取速度的快慢上,因為有一個是利用了多進程機制,下面我們分別來看一下。
創建模型
首先我們創建模型並訓練數據:
from sklearn.datasets import load_digits from sklearn.svm import SVC # 加載數據 digits = load_digits() X = digits.data y = digits.target model = SVC() model.fit(X, y)
用pickle讀寫模型
pickle是python中用於數據序列化的模塊,因此,對於模型的序列化也可以用此模塊來進行:
import pickle # 以寫二進制的方式打開文件 file = open("D:/data/python/model.pickle", "wb") # 把模型寫入到文件中 pickle.dump(model, file) # 關閉文件 file.close()
這樣會創建D:/data/python/model.pickle的文件,大家可以自己去嘗試下看看,我這邊生成的文件大概1M左右。
有了模型文件之后,在進行預測時我們就不需要進行訓練了,而只要把這個訓練好的模型文件讀取出來,然后直接進行預測就可以:
import pickle # 以讀二進制的方式打開文件 file = open("D:/data/python/model.pickle", "rb") # 把模型從文件中讀取出來 model = pickle.load(file) # 關閉文件 file.close() # 用模型進行預測 from sklearn.datasets import load_digits digits = load_digits() X = digits.data y = digits.target print("預測值:", model.predict(X[15:20])) print("實際值:", y[15:20])
輸出為:
預測值: [5 6 7 8 9] 實際值: [5 6 7 8 9]
用joblib進行模型的讀寫
直接上代碼:
from sklearn.datasets import load_digits from sklearn.svm import SVC # 用模型進行訓練 digits = load_digits() X = digits.data y = digits.target model = SVC() model.fit(X, y) # 用joblib保存模型 from sklearn.externals import joblib joblib.dump(model, "D:/data/python/model.joblib")
這樣就會生成D:/data/python/model.joblib文件,看起來比pickle生成的文件大一點點。
讀取模型:
# 用joblib讀取模型 from sklearn.externals import joblib model = joblib.load("D:/data/python/model.joblib") # 對數據進行預測 from sklearn.datasets import load_digits digits = load_digits() X = digits.data y = digits.target print("預測值:", model.predict(X[15:20])) print("實際值:", y[15:20])
輸出為:
預測值: [5 6 7 8 9] 實際值: [5 6 7 8 9]
看起來也很簡單,同pickle的區別是joblib會以多進程方式來進行,據說性能會好些。
