# 簡易神經網路回歸模型預測
根據博客來電腦書籍排行榜前50名的銷量進行預測
資料集只有16筆,所以我們要根據現有資料來預測剩餘名次的實際銷量。
現有資料如下:
名次: 1,5,11,12,20,21,23,24,26,28,34,36,37,39,42,50
銷量: 2053,1645,1041,945,581,787,799,640,705,665,543,626,514,474,493,388
## 匯入函式庫
```=python
import numpy as np # 匯入 numpy 縮減名稱為 np
from keras.models import Sequential # 從 keras 匯入模型
from keras.layers import Dense # 從 keras 匯入神經層
import matplotlib.pyplot as plt # 匯入 matplotlib 繪圖工具縮減名稱為 plt
```
## 建立資料集
```=python
# 訓練集 data(名次)
x_train = [1,5,11,12,20,21,23,24,26,28,34,36,37,39,42,50]
# 訓練集 label(銷量)
y_train = [2053,1645,1041,945,581,787,799,640,705,665,543,626,514,474,493,388]
```
## 建立預測集
```python
# 測試集 data(名次)設定1到50名
x_test = range(1,51)
# 測試集 label(銷量)未知
y_test = []
```
## 資料預處理
```=python
# 將數據轉成ndarray形式
x_train,y_train = np.array(x_train),np.array(y_train)
x_test,y_test = np.array(x_test),np.array(y_test)
# 將資料歸一化 data/50 label/2053
x_train,y_train = x_train/50,y_train/2053
x_test,y_test = x_test/50,y_test/2053
# 將資料轉成16筆陣列,原始資料維16筆資料同一陣列
x_train = np.reshape(x_train,(-1,1))
y_train = np.reshape(y_train,(-1,1))
x_test = np.reshape(x_test,(-1,1))
y_test = np.reshape(y_test,(-1,1))
```
## 建構神經網路模型
```=python
model=Sequential() # 建立線性堆疊模型
model.add(Dense(input_dim=1,units=1)) # 建立輸入層 1維輸入,1維輸出
model.add(Dense(20, activation= "relu")) # 建立隱藏層 20個神經元 激活函數維relu
model.add(Dense(40, activation= "relu")) # 建立隱藏層 40個神經元 激活函數維relu
model.add(Dense(35, activation= "relu")) # 建立隱藏層 35個神經元 激活函數維relu
model.add(Dense(1)) # 建立輸出層 1個神經元
# 模型設定 損失函數為mse 優化器為Adam 顯示準確率(如果有驗證集才有值)
model.compile(loss='mse',optimizer='adam', metrics = ["accuracy"])
# 輸出神經網路模型細節
model.summary()
```
![](https://hackmd.io/_uploads/HJJ1EpBpn.png)
## 訓練神經網路
```=python
print('Training--------------')
# 訓練1000次
history = model.fit(x_train, y_train, epochs= 1000)
```
顯示部分訓練資料
![](https://hackmd.io/_uploads/HkH-NaHan.png)
## 顯示最後的權重與偏值
```=python
W, b=model.layers[0].get_weights()
print('weight= ',W,'\nbiases=',b)
```
![](https://hackmd.io/_uploads/BJCNETS6n.png)
## 用神經網路來預測前50名的銷量
```=python
# 將1~50的資料放入神經網路
y_pred=model.predict(x_test)
# 將輸出結果進行資料還原
y_pred = y_pred*2053
x_test = x_test*50
# 在圖上畫訓練資料集的點
plt.scatter(x_train*50,y_train*2053)
# 在圖上畫測試資料集擬合線
plt.plot(x_test,y_pred)
# 顯示圖形
plt.show()
# 輸出預測值
print(y_pred)
```
顯示前10名的預測銷量
![](https://hackmd.io/_uploads/S1CLV6Bp2.png)
## 名次-銷量圖
橫軸為名次,縱軸為銷量,擬合線為預測線
![](https://hackmd.io/_uploads/r1vF4aBTn.png)