用pickle保存機器學習模型


在機器學習中,當確定好一個模型后,我們需要將它保存下來,這樣當新數據出現時,我們能夠調出這個模型來對新數據進行預測。同時這些新數據將被作為歷史數據保存起來,經過一段周期后,使用更新的歷史數據再次訓練,得到更新的模型。

 

如果模型的流轉都在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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM