波士頓房價預測(深度學習和最速下降法)與找到影響房價的決定性因素(最速下降法)
本文針對解決的問題:
波士頓房價進行預測采用了兩種方法:
? 1. 搭建神經網路進行預測(激活函式為線性回歸),
? 2. 最速下降法求得各屬性的權值(權值的大小決定房價的影響因素),然后根據各個屬性的值乘以權值加上偏置得到預測的值,
文章目錄
- 波士頓房價預測(深度學習和最速下降法)與找到影響房價的決定性因素(最速下降法)
- 一、深度學習房價預測
- 1. 匯入資料并處理
- 2. 歸一化
- 3. 搭建網路
- 4. 訓練資料
- 5. 結果分析
- 二、影響房價的決定性因素
- 1. 最速下降法原理及其代碼
- 2.代碼演示
- 3. 結果展示
- 三、總結
一、深度學習房價預測
首先還是先匯入本文所需要得包
from keras.datasets import boston_housing # 波士頓房價
import pandas as pd
from keras.models import Sequential # 構建神經網路
from keras.layers import Dense,Dropout # 全連接層和遺棄資料
from keras.optimizers import Adam # 優化器
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler # 歸一化
import numpy as np
1. 匯入資料并處理
? 直接將資料集的內容匯入
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
x_train = pd.DataFrame(train_data) # 每座房子的13個屬性(訓練集)
y_train = pd.DataFrame(train_targets) # 每座房子的價格(訓練集)
x_test = pd.DataFrame(test_data) # 每座房子的13個屬性(測驗集)
y_test = pd.DataFrame(test_targets) # 每座房子的價格(測驗集)
2. 歸一化
? 歸一化的目的就是消除量綱的影響,因為在資料中存在著不同的型別的資料,直接使用會有量綱的影響,
- 錯誤示范
sc1 = MinMaxScaler(feature_range=(0,1)) # 歸一化范圍在0到1
sc2 = MinMaxScaler(feature_range=(0,1))
x_train = sc1.fit_transform(x_train).reshape(x_train.shape[0],x_train.shape[1])
y_train = sc2.fit_transform(y_train).reshape(-1,1)
x_test = sc1.fit_transform(x_test).reshape(x_test.shape[0],x_test.shape[1])
注意要是使用以上的這種歸一化方法會使得損失值偏大,因為當我們直接使用歸一化會對所有的值歸一化,就沒有消除量綱的影響,以上這種就是根據最大最小值歸一化的,
-
正確歸一化
dataset = load_boston() x = dataset.data y = dataset.target mean = x.mean(axis=0) # 求平均值axis=0表示縱向,1橫向 std = x.std(axis=0) # 求方差 x = (x - mean) / std x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2)如下圖,13個屬性值,我們首先需要按照縱向求得平均值,然后求得方差,最后標準化,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ORDVzGCD-1630643825686)(波士頓房價預測(深度學習)與找到影響房價的決定性因素.assets/image-20210902231546653-16306431699791-16306431699792.png)]](https://img.uj5u.com/2021/09/04/261649040852412.png)
3. 搭建網路
在講搭建模型之前,我們先來了解一下全連接層Dense,簡單的說就是output = activation(dot(input, kernel) + bias),其中activation為激活函式,dot(input, kernel)輸入與權重點乘,最后加上偏置,
Dense的引數:
- units: 正整數,輸出空間維度或者稱為神經元的個數,
- activation: 激活函式 ,
- use_bias: 布林值,該層是否使用偏置向量,
- kernel_initializer: kernel 權值矩陣的初始化器 (詳見 initializers),
- bias_initializer: 偏置向量的初始化器 (詳見 initializers).
- kernel_regularizer: 運用到 kernel 權值矩陣的正則化函式 (詳見 regularizer),
- bias_regularizer: 運用到偏置向的的正則化函式 (詳見 regularizer),
- activity_regularizer: 運用到層的輸出的正則化函式 (它的 “activation”), (詳見 regularizer),
- kernel_constraint: 運用到 kernel 權值矩陣的約束函式 (詳見 constraints),
- bias_constraint: 運用到偏置向量的約束函式 (詳見 constraints),
model = Sequential()
# 全連接層
model.add(Dense(units=64, # 神經元個數
activation='relu', # 激活函式
kernel_regularizer=None, # 權重
use_bias=True,
input_shape=(x_train.shape[1],) # 輸入形狀
))
model.add(Dense(units=64,
activation='relu'))
model.add(Dropout(0.2)) # 舍棄輸出的20%的資料
model.add(Dense(units=1,
activation=None))
4. 訓練資料
model.compile(loss='mse', # 均方誤差
optimizer='adam' # 指定優化器
)
model.fit(x_train,
y_train,
epochs=300,
batch_size=50, # 一次訓練所選取的樣本數
)
這里的batch_size可以去 神經網路中Batch Size的理解_myc的博客-CSDN博客 查看更加詳細的用法,
5. 結果分析
total_loss = 0
for i in range(len(predict)):
total_loss += (predict[i] - y_test[i]) ** 2
avg_loss = total_loss/len(predict)
print(avg_loss)
平均的損失值為 8.815071
predict = model.predict(x_test)
predict = sc2.inverse_transform(predict) # 還原資料
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(y_test, color="red")
plt.plot(predict, color="blue")
plt.legend(['真實值','預測值'])
plt.show()
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mTYE0ARi-1630643825690)(波士頓房價預測(深度學習)與找到影響房價的決定性因素.assets/image-20210902232035590-16306432362503.png)]](https://img.uj5u.com/2021/09/04/261649040852413.png)
可以看出模型已經很好了,
二、影響房價的決定性因素
? 原理:根據梯度下降法計算出最后的權重,根據屬性的權重的大小推斷出是否是決定性因素,
from sklearn.datasets import load_boston
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
1. 最速下降法原理及其代碼
? 首先定義初值
w = np.random.rand(13) # 隨機生成權重
b = 1.0 # 隨機設定偏置
lr = 0.0001 # 學習率
epochs = 3000 # 迭代次數
reg = 0.5 # 正則運算式lambda
?
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fYiCXO7Z-1630643825693)(波士頓房價預測(深度學習)與找到影響房價的決定性因素.assets/image-20210903122816768.png)]](https://img.uj5u.com/2021/09/04/261649040852411.png)
對L(w,b)分別求w1,w2,…,wn和b的偏導
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4A38TBuW-1630643825697)(波士頓房價預測(深度學習)與找到影響房價的決定性因素.assets/image-20210903122854263.png)]](https://img.uj5u.com/2021/09/04/261649040852414.png)
然后可以最速下降法求得下一個權重值
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9ylhmEjO-1630643825699)(波士頓房價預測(深度學習)與找到影響房價的決定性因素.assets/image-20210903122929945.png)]](https://img.uj5u.com/2021/09/04/261649040852415.png)
for epoch in range(epochs):
sum_w = 0
sum_b = 0
for i in range(x_train.shape[0]):
xi = x_train[i]
yi = y_train[i]
yi_hat = model(xi)
sum_w += (yi_hat - yi) * xi
sum_b += (yi_hat - yi)
grad_w = (2 / x_train.shape[1]) * sum_w + (2.0 * reg * w) # 梯度
grad_b = (2 / x_train.shape[1]) * sum_b
w = w - lr * grad_w
b = b - lr * grad_b
注意:lr可以理解為步長,lr后面的偏導就相當于方向,意思是w0向著這個方向下降了lr個距離
為了防止過擬合,加入λw**2,求導得2λw,定義λ的值,當λ越大時降低訓練時的損失值,如λ=1000;當λ越小時降低預測時的損失值,如λ=0.01,
2.代碼演示
dataset = load_boston()
x = dataset.data
y = dataset.target
mean = x.mean(axis=0) # 上部同樣的方法
std = x.std(axis=0)
x = (x - mean) / std
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2)
'''
x_train (404,13)
x_test (404,)
'''
w = np.random.rand(13) # 隨機生成權重
b = 1.0 # 隨機設定偏置
lr = 0.0001 # 學習率
epochs = 3000 # 迭代次數
reg = 0.5 # 正則運算式lambda
def model(x):
y_hat = w.dot(x) + b
return y_hat
list_w,list_b = [],[]
for epoch in range(epochs):
sum_w = 0
sum_b = 0
for i in range(x_train.shape[0]):
xi = x_train[i]
yi = y_train[i]
yi_hat = model(xi)
sum_w += (yi_hat - yi) * xi
sum_b += (yi_hat - yi)
grad_w = (2 / x_train.shape[1]) * sum_w + (2.0 * reg * w) # 梯度
grad_b = (2 / x_train.shape[1]) * sum_b
w = w - lr * grad_w
b = b - lr * grad_b
list_w.append(w)
list_b.append(b)
print(list_w[-1],list_b[-1])
def loss_function(x,y):
total_loss = 0
for i in range(len(x)):
xi = x[i]
yi = y[i]
yi_hat = model(xi)
total_loss += (yi_hat - yi) ** 2
avg_loss = total_loss/len(x)
return avg_loss
train_loss = loss_function(x_train,y_train) # 訓練集平均損失值
test_loss = loss_function(x_test,y_test) # 測驗集平均損失值
print(train_loss,test_loss)
predict_2 = x_test.dot(list_w[-1]) + list_b[-1]
print(predict_2)
print(y_test)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(y_test, color="red")
plt.plot(predict_2, color="blue")
plt.legend(['真實值','預測值'])
plt.show()
3. 結果展示
訓練集和測驗集的平均損失值分別為20.886724867938153和27.05772042864247
上面的神經網路的平均的損失值為 8.815071 比這里的27小得多,說明這里的預測的模型沒有神經網路好,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bvkAzDXb-1630643825701)(波士頓房價預測(深度學習)與找到影響房價的決定性因素.assets/image-20210902234150593-16306434093055.png)]](https://img.uj5u.com/2021/09/04/261649040852416.png)
經過線性回歸的預測13個屬性的權重:
[-0.72108399 0.69643086 -0.0926451 0.29574251 -1.29656288 3.48564137
-0.62116863 -2.3274482 1.21939315 -1.48616123 -2.0008885 1.0035156
-2.29973511]
可以明確得出第2、4、6、9、12因素為主要影響因素,
三、總結
- 利用神經網路和最速下降法預測,神經網路預測的結果較好,
- 最速下降法求得權重,可以確定屬性的重要因素,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297409.html
標籤:AI
上一篇:估值高達 380 億美元!Spark 商業化公司 Databricks 再獲 16 億美元融資
下一篇:演算法的開始第二版
