在機器學習中,當確定好一個模型后,我們需要將它保存下來,這樣當新數據出現時,我們能夠調出這個模型來對新數據進行預測。同時這些新數據將被作為歷史數據保存起來,經過一段周期后,使用更新的歷史數據再次訓練,得到更新的模型。
如果模型的流轉都在python內部,那么可以使用內置的pickle庫來完成模型的存儲和調取。
什么是pickle?pickle是負責將python對象序列化(serialization)和反序列化(de-serialization)的模塊。pickle模塊可以讀入任何python對象,然后將它們轉換成字符串,我們再使用dump函數將其儲存到文件中,這個過程叫做pickling;反之從文件中提取原始python對象的過程叫做unpickling。
picke.dump() --- 將訓練好的模型保存在磁盤上
with open(file_name, 'wb') as file: pickle.dump(model, file)
pickle.load() --- 讀取保存在磁盤上的模型
with open(file_name, 'rb') as file: model=pickle.load(file)
以線性回歸模型為例:
import numpy as np class Linear_Regression: def __init__(self): self._w = None def fit(self, X, y, lr=0.01, epsilon=0.01, epoch=1000): #訓練數據 #將輸入的X,y轉換為numpy數組 X, y = np.asarray(X, np.float32), np.asarray(y, np.float32) #給X增加一列常數項 X=np.hstack((X,np.ones((X.shape[0],1)))) #初始化w self._w = np.zeros((X.shape[1],1)) for _ in range(epoch): #隨機選擇一組樣本計算梯度 random_num=np.random.choice(len(X)) x_random=X[random_num].reshape(1,2) y_random=y[random_num] gradient=(x_random.T)*(np.dot(x_random,self._w)-y_random) #如果收斂,那么停止迭代 if (np.abs(self._w-lr*gradient)<epsilon).all(): break #否則,更新w else: self._w =self._w-lr*gradient return self._w def print_results(self): print("參數w:{}".format(self._w)) print("回歸擬合線:y={}x+{}".format(self._w[0],self._w[1])) def predict(self,x): x=np.asarray(x, np.float32) x=x.reshape(x.shape[0],1) x=np.hstack((x,np.ones((x.shape[0],1)))) return np.dot(x,self._w)
訓練並保存模型:
import pickle #創建數據 x=np.linspace(0,100,10).reshape(10,1) rng=np.random.RandomState(4) noise=rng.randint(-10,10,size=(10,1))*4 y=4*x+4+noise model=Linear_Regression() model.fit(x,y,lr=0.0001,epsilon=0.001,epoch=20) with open('model.pickle', 'wb') as file: pickle.dump(model, file)
然后調取模型並進行預測和打印結果:
with open('model.pickle', 'rb') as file: model=pickle.load(file) print(model.predict([50])) model.print_results()
輸出:
[[208.73892002]] 參數w:[[4.17372929] [0.05245564]] 回歸擬合線:y=[4.17372929]x+[0.05245564]
model是保存在磁盤上的一個python對象:
<__main__.Linear_Regression object at 0x0000009FA44B2F98>