PaddlePaddle实现波士顿房价预测
PaddlePaddle實現波士頓房價預測
AIStudio地址
Github地址
數據預處理
??數據預處理主要包含五個部分:數據導入、數據形狀變換、數據集劃分、數據歸一化處理、封裝 load_data 函數。
# 數據預處理def load_data():# 從文件讀取數據datafile = './work/housing.data'data = np.fromfile(datafile, sep=" ") # 從文本或二進制文件中構造一個數組# 每條數據包括14項,其中前面13項是影響因素,第14項是相應的房屋價格中位數feature_name = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']# 統計字段個數feature_num = len(feature_name)# 將原始數據進行reshape, 變成 [N, 14]的形狀# N = data.shape[0]//feature_numdata = data.reshape([data.shape[0]//feature_num, feature_num])# 將原始數據及拆分為訓練集和測試集(8:2)ratio = 0.8offset = int(data.shape[0]*ratio)training_data = data[:offset]# 計算訓練集的max, min, meanmaximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \training_data.sum(axis=0) / training_data.shape[0]# 記錄數據的歸一化參數,在預測時對數據做歸一化global max_valuesglobal min_valuesglobal avg_valuesmax_values = maximumsmin_values = minimumsavg_values = avgs# 對數據進行歸一化處理for i in range(feature_num):data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])# 訓練集和測試集的化分training_data = data[:offset]test_data = data[offset:]return training_data, test_data # 查看數據 training_data , test_data = load_data() print(training_data,test_data)print("~"*20)# 查看第一個訓練樣本數據 x = training_data[:, :-1] y = training_data[:, -1:] print(x[0]) #前13個影響因素 print(y[0]) #第14個房價中位數搭建神經網絡
??線性回歸模型采用線性激活函數( linear activation )的全連接層 ( fully-connected layer, fc_layer ),因此在飛槳中利用全連接層模型構造線性回歸,這樣,一個全連接層就可以看作一個簡單的神經網絡。
??搭建神經網絡類似于使用積木搭建寶塔。在飛槳中,網絡層(layer)是積木,而神經網絡是要搭建的寶塔。我們使用不同的layer進行組合,來搭建神經網絡。飛槳建議通過創建Python類的方式完成模型網絡的定義,即__init__函數和forward函數。
??forward函數是框架指定實現前向計算邏輯的函數,程序在調用模型實例時會自動執行forward方法。在forward函數中使用的網絡層需要在__init__函數中聲明。
??定義init函數:在類的初始化函數中聲明每一層網絡的實現函數。
??定義forward函數:構建神經網絡結構,實現前向計算過程,并返回預測結果。
# 配置網絡結構 class Regressor(fluid.dygraph.Layer):def __init__(self,name_scope):super(Regressor,self).__init__(name_scope)name_scope = self.full_name()# 定義一層全連接層,輸出維度是1, 激活函數為None, 即不使用激活函數self.fc = Linear(input_dim = 13, output_dim = 1,act = None)# 網絡的前向計算函數def forward(self,input):x = self.fc(input)return x訓練配置
模型訓練
??模型訓練過程采用內層循環和外層循環嵌套的方式。
??內層循環負責整個數據集的一次遍歷,采用分批次(batch)方式。Batch的取值會影響模型訓練效果:batch過大,會增大內存消耗和計算時間,且效果不會明顯提升;batch過小,每個batch的樣本數據將沒有統計意義。
??內循環四個步驟:
??外層循環定義遍歷數據集的次數,通過參數EPOCH_NUM設置。
# 定義訓練過程 with dygraph.guard(fluid.CPUPlace()):EPOCH_NUM = 10 # 設置外層循環次數BATCH_SIZE = 10 # 設置batch大小# 定義外層循環for epoch_id in range(EPOCH_NUM):# 在每輪迭代開始之前,將訓練數據的順序隨機打亂np.random.shuffle(training_data)# 將訓練數據進行拆分,每個batch包含10條數據mini_batches = [training_data[k:k+BATCH_SIZE] for k in range(0,len(training_data),BATCH_SIZE)]# 定義內層循環for iter_id, mini_batch in enumerate(mini_batches):# 獲得當前批次訓練數據x = np.array(mini_batch[:,:-1]).astype('float32')# 獲得當前批次訓練標簽(真是房價)y = np.array(mini_batch[:,-1:]).astype('float32')# 將numpy數據轉為飛槳動態圖variable形式house_features = dygraph.to_variable(x)prices = dygraph.to_variable(y)# 正向計算predicts = model(house_features)# 計算損失loss = fluid.layers.square_error_cost(predicts, label=prices)avg_loss = fluid.layers.mean(loss)if iter_id % 20 == 0:print("epoch:{}, iter:{}, loss is:{}".format(epoch_id,iter_id,avg_loss.numpy()))#反向傳播avg_loss.backward()# 最小化loss, 更新參數opt.minimize(avg_loss)# 清除梯度model.clear_gradients()fluid.save_dygraph(model.state_dict(),"LR_model")保存并測試模型
??首先我們將模型當前的參數數據model.state_dict()保存在文件中(通過參數指定保存的文件LR_model),以備預測或校驗的程序調用。
# 定義飛槳動態圖工作環境 with fluid.dygraph.guard():# 保存模型參數,文件為LR_modelfluid.save_dygraph(model.state_dict(),'LR_model')print("模型保存成功,模型參數保存在LR_model中") 模型保存成功,模型參數保存在LR_model中??然后可以對模型進行測試,測試過程與在應用場景中使用模型的過程一致,主要分為如下三個步驟:
(1)、配置模型預測的機器資源;
(2)、將訓練好的模型參數加載到模型。加載完畢后,需要將模型的狀態調整為evaluation(校驗)。
(3)、將待預測的樣本特征輸入模型中,打印輸出的預測結果。
??通過load_one_example函數從數據集中抽出一條樣本作為測試樣本。
# 讀取測試樣本 def load_one_example(data_dir):f = open(data_dir, 'r')datas = f.readlines()# 選擇倒數第十條數據用于測試tmp = datas[-10]tmp = tmp.strip().split()one_data = [float(v) for v in tmp]# 對數據進行歸一化處理for i in range(len(one_data)-1):one_data[i] = (one_data[i] - avg_values[i]) / (max_values[i] - min_values[i])data = np.reshape(np.array(one_data[:-1]), [1,-1]).astype(np.float32)label = one_data[-1]return data, label# 測試模型 with dygraph.guard():# 參數為保存模型參數的文件地址model_dict, _ = fluid.load_dygraph("LR_model")model.load_dict(model_dict)model.eval()# 參數為數據集的文件地址test_data, label = load_one_example('./work/housing.data')# 將數據轉為動態圖的variable格式test_data = dygraph.to_variable(test_data)results = model(test_data)# 對結果進行反歸一化處理results = results*(max_values[-1] - min_values[-1]) +avg_values[-1]print("Inference result is {}, the corresponding label is {}".format(results.numpy(),label)) Inference result is [[14.326102]], the corresponding label is 19.7總結
以上是生活随笔為你收集整理的PaddlePaddle实现波士顿房价预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DeepLearning based o
- 下一篇: 一个垃圾分类项目带你玩转飞桨(1)