1.Runner類
一個任務應用機器學習方法流程:
數據集構建
模型構建
損失函數定義
優化器
模型訓練
模型評價
模型預測
所以根據以上,我們把機器學習模型基本要素封裝成一個Runner類(加上模型保存、模型加載等功能。)
Runner類的成員函數定義如下:
- __init__函數:實例化Runner類時默認調用,需要傳入模型、損失函數、優化器和評價指標等;
- train函數:完成模型訓練,指定模型訓練需要的訓練集和驗證集;
- evaluate函數:通過對訓練好的模型進行評價,在驗證集或測試集上查看模型訓練效果;
- predict函數:選取一條數據對訓練好的模型進行預測;
- save_model函數:模型在訓練過程和訓練結束后需要進行保存;
- load_model函數:調用加載之前保存的模型。
class Runner(object):def __init__(self, model, optimizer, loss_fn, metric):self.model = model # 模型self.optimizer = optimizer # 優化器self.loss_fn = loss_fn # 損失函數 self.metric = metric # 評估指標# 模型訓練def train(self, train_dataset, dev_dataset=None, **kwargs):pass# 模型評價def evaluate(self, data_set, **kwargs):pass# 模型預測def predict(self, x, **kwargs):pass# 模型保存def save_model(self, save_path):pass# 模型加載def load_model(self, model_path):pass
1.2Runner類流程
①初始化:傳入模型、損失函數、優化器和評價指標
②訓練:基于訓練集調用train()
函數訓練模型,基于驗證集通過evaluate()
函數驗證模型。通過save_model()
函數保存模型
③評價:基于測試集通過evaluate()
函數得到指標性能。
④預測:給定樣本,通過predict()
函數得到該樣本標簽
2.案例:波士頓房價預測
波士頓房價預測基于線性回歸模型和Runner類實現
2.1數據處理
2.1.1構建
開源庫pandas導入。
import pandas as pd # 開源數據分析和操作工具# 利用pandas加載波士頓房價的數據集
data=pd.read_csv("/home/aistudio/work/boston_house_prices.csv")
# 預覽前5行數據
data.head()
2.1.2數據集劃分
訓練集 和 測試集。
import paddlepaddle.seed(10)# 劃分訓練集和測試集
def train_test_split(X, y, train_percent=0.8):n = len(X)shuffled_indices = paddle.randperm(n) # 返回一個數值在0到n-1、隨機排列的1-D Tensortrain_set_size = int(n*train_percent)train_indices = shuffled_indices[:train_set_size]test_indices = shuffled_indices[train_set_size:]X = X.valuesy = y.valuesX_train=X[train_indices]y_train = y[train_indices]X_test = X[test_indices]y_test = y[test_indices]return X_train, X_test, y_train, y_test X = data.drop(['MEDV'], axis=1)
y = data['MEDV']X_train, X_test, y_train, y_test = train_test_split(X,y)# X_train每一行是個樣本,shape[N,D]
2.1.3特征化工程
避免數據之間的可比性:對特征數據進行歸一化處理,將數據縮放到[0, 1]區間
import paddleX_train = paddle.to_tensor(X_train,dtype='float32')
X_test = paddle.to_tensor(X_test,dtype='float32')
y_train = paddle.to_tensor(y_train,dtype='float32')
y_test = paddle.to_tensor(y_test,dtype='float32')X_min = paddle.min(X_train,axis=0)
X_max = paddle.max(X_train,axis=0)X_train = (X_train-X_min)/(X_max-X_min)X_test = (X_test-X_min)/(X_max-X_min)# 訓練集構造
train_dataset=(X_train,y_train)
# 測試集構造
test_dataset=(X_test,y_test)
2.2模型構建
rom nndl.op import Linear# 模型實例化
input_size = 12
model=Linear(input_size)
2.3完善Runner類
測試集上使用MSE對模型性能進行評估。本案例利用飛槳框架提供的MSELoss API實現
import paddle
import os
from nndl.opitimizer import optimizer_lsmclass Runner(object):def __init__(self, model, optimizer, loss_fn, metric):# 優化器和損失函數為None,不再關注# 模型self.model=model# 評估指標self.metric = metric# 優化器self.optimizer = optimizerdef train(self,dataset,reg_lambda,model_dir):X,y = datasetself.optimizer(self.model,X,y,reg_lambda)# 保存模型self.save_model(model_dir)def evaluate(self, dataset, **kwargs):X,y = datasety_pred = self.model(X)result = self.metric(y_pred, y)return resultdef predict(self, X, **kwargs):return self.model(X)def save_model(self, model_dir):if not os.path.exists(model_dir):os.makedirs(model_dir)params_saved_path = os.path.join(model_dir,'params.pdtensor')paddle.save(model.params,params_saved_path)def load_model(self, model_dir):params_saved_path = os.path.join(model_dir,'params.pdtensor')self.model.params=paddle.load(params_saved_path)optimizer = optimizer_lsm# 實例化Runner
runner = Runner(model, optimizer=optimizer,loss_fn=None, metric=mse_loss)
2.4模型訓練
組裝完成Runner
之后,我們將開始進行模型訓練、評估和測試
# 模型保存文件夾
saved_dir = '/home/aistudio/work/models'# 啟動訓練
runner.train(train_dataset,reg_lambda=0,model_dir=saved_dir)columns_list = data.columns.to_list()
weights = runner.model.params['w'].tolist()
b = runner.model.params['b'].item()for i in range(len(weights)):print(columns_list[i],"weight:",weights[i])print("b:",b)
2.5模型測試
加載訓練好的模型參數,在測試集上得到模型的MSE指標
# 加載模型權重
runner.load_model(saved_dir)mse = runner.evaluate(test_dataset)
print('MSE:', mse.item())
2.6模型預測
load_model
函數加載保存好的模型,使用predict
進行模型預測
runner.load_model(saved_dir)
pred = runner.predict(X_test[:1])
print("真實房價:",y_test[:1].item())
print("預測的房價:",pred.item())
真實房價: 33.099998474121094 預測的房價: 33.04654312133789