梯度下降法预测波士顿房价以及简单的模型评估
目錄
- 原理
- 代碼
- 關于歸一化的思考
原理
觀察數據可知屬性之間差距很大,為了平衡所有的屬性對模型參數的影響,首先進行歸一化處理。
每一行是一個記錄,每一列是個屬性,所以對每一列進行歸一化。
二維數組歸一化:1、循環方式2、廣播運算,這里使用廣播運算
代碼
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt boston_housing =tf.keras.datasets.boston_housing (train_x,train_y),(test_x,test_y)=boston_housing.load_data() print(train_x.shape,train_y.shape,test_x.shape,test_y.shape) num_train =len(train_x) num_test =len(test_x) #數據處理 x_train=(train_x-train_x.min(axis=0))/(train_x.max(axis=0)-train_x.min(axis=0)) y_train=train_yx_test=(test_x-test_x.min(axis=0))/(test_x.max(axis=0)-test_x.min(axis=0)) y_test=test_yx0_train=np.ones(num_train).reshape(-1,1) x0_test=np.ones(num_test).reshape(-1,1) X_train=tf.cast(tf.concat([x0_train,x_train],axis=1),tf.float32) X_test=tf.cast(tf.concat([x0_test,x_test],axis=1),tf.float32) print(X_train.shape,X_test.shape) #把房價轉換成列向量 Y_train =tf.constant(y_train.reshape(-1,1),tf.float32) Y_test =tf.constant(y_test.reshape(-1,1),tf.float32) print(Y_train.shape,Y_test.shape)#設置超參數 learn_rate=0.01 #迭代次數 iter=2000 #每10次迭代顯示一下效果 display_step=200 #設置模型參數初始值 np.random.seed(612) W=tf.Variable(np.random.randn(14,1),dtype=tf.float32) #訓練模型 #存放訓練誤差和泛化誤差 mse_train=[] mse_test=[] for i in range(0,iter+1):with tf.GradientTape() as tape:PRED_train=tf.matmul(X_train,W)Loss_train=0.5*tf.reduce_mean(tf.square(Y_train-PRED_train))PRED_test=tf.matmul(X_test,W)Loss_test=0.5*tf.reduce_mean(tf.square(Y_test-PRED_test))mse_train.append(Loss_train)mse_test.append(Loss_test)#更新參數dL_dW = tape.gradient(Loss_train,W)W.assign_sub(learn_rate*dL_dW)#plt.plot(x,pred)if i % display_step==0:print("i:%i, Train Loss:%f,Test Loss:%f"%(i,mse_train[i],mse_test[i])) #模型和數據可視化 plt.figure(figsize=(20,4)) #訓練誤差與泛化誤差的對比 plt.subplot(1,3,1) plt.ylabel("MSE") plt.plot(mse_train,color="blue",linewidth=3) plt.plot(mse_test,color="red",linewidth=3) #訓練集:實際房價與預測房價 plt.subplot(1,3,2) plt.ylabel("Price") plt.plot(y_train,color="blue",marker="o",label="true_price") plt.plot(PRED_train,color="red",marker=".",label="predict") plt.legend() #測試集:實際房價與預測房價 plt.subplot(1,3,3) plt.ylabel("Price") plt.plot(y_test,color="blue",marker="o",label="true_price") plt.plot(PRED_test,color="red",marker=".",label="predict") plt.legend() plt.show()效果:
接下來增加迭代次數、加大顯示間隔(iter=8000,display_step=500),觀察一下數據。
可以發現在迭代次數為2500——3000之間,測試誤差上升了,而訓練誤差一如既往地減少,說明產生過擬合了。從圖表也能看出來。
接下來把關注點聚焦于迭代次數為2500——3000之間,增加顯示間隔,找到測試集損失上升的點,得到最佳的迭代次數。
確定迭代次數為2520后,再看看效果如何:
這樣就是大概的流程了,要注意參數的得到與兩個參數有關,一個是迭代次數,一個是學習率,這里我們選擇控制變量法,控制學習率為一個較合適的參數之后固定不動,然后調節迭代次數。
關于歸一化的思考
對訓練集和測試集的歸一化可以采用以下3種方式:
1、先把測試集和訓練集放在一起,進行屬性歸一化,然后再分開。
2、先劃分訓練集和測試集,然后分別歸一化。
3、先劃分訓練集和測試集,歸一化訓練集,記錄訓練集的歸一化參數(最大值,最小值),然后再使用訓練集的參數去歸一化測試集。
第一種情況下,相當于強制把訓練集和測試集的數據分布統一化,造成訓練集和測試集的數據分布類似,測試誤差和訓練誤差關聯度高,測試誤差并不能很好地反映實際泛化誤差,不建議采用;
第二種情況下,訓練樣本和測試樣本獨立歸一化,保證了兩種數據分布的獨立性,測試誤差與訓練誤差獨立,測試誤差能夠較好反映泛化誤差,實際操作中多采用這種方法;
第三種情況下,由于訓練集和測試集都使用訓練集的參數進行歸一化,使得測試集的數據并不能真正被歸一化,只能近似歸一化,這種方式在batch_normal中有采用到,也能保證數據的獨立性,達到標準化的目的,而且能夠簡化計算,提高計算效率。
總結
以上是生活随笔為你收集整理的梯度下降法预测波士顿房价以及简单的模型评估的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow的可训练变量和自动求
- 下一篇: 2022王者操作设置怎么设置最佳