---
# System prepended metadata

title: 使用Keras建立回歸模型
tags: [AI神經網路]

---

###### tags: `AI神經網路`

# 使用Keras建立回歸模型
根據博客來電腦書籍排行榜前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 | 636 | 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]

# 測試集 data (名次),沒有 y_test 因為是要預測資料，無label
x_test = list(range(1,51))
```
## 資料預處理
```=python
# 將數據轉成ndarray形式
x_train,y_train = np.array(x_train),np.array(y_train)
x_test = np.array(x_test)

# 將資料歸一化 data/50  label/2053
x_train,y_train = x_train/50,y_train/2053
x_test = x_test/50

# 將資料轉成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))
```
## 建構神經網路模型
```=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 顯示準確率, metrics = ["accuracy"] (如果有驗證集才有值)
model.compile(loss='mse',optimizer='adam')
# 輸出神經網路模型細節
model.summary()  
```

## 訓練神經網路
```=python
print('Training--------------')
# 訓練1000次 如果需要切分出驗證集則加入:  validation_split= 0.2 # 訓練集20%為驗證集
history = model.fit(x_train, y_train, epochs= 1000)
```
## 顯示最後的權重與偏值
```=python
W, b=model.layers[0].get_weights()
print('weight= ',W,'\nbiases=',b)
```
## 用神經網路來預測前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()

# 輸出預測值 y_pred 為2維矩陣
# print(y_pred)
t = 1  # 名次
for i in y_pred:
    print('第',t,'名: ',i[0])
    t += 1
```


輸出結果
![](https://i.imgur.com/6yxIesR.png)

預測值
第 1 名:  2051.0571
第 2 名:  1951.1708
第 3 名:  1851.0898
第 4 名:  1749.663
第 5 名:  1648.2363
第 6 名:  1546.8099
第 7 名:  1445.3828
第 8 名:  1343.9564
第 9 名:  1242.5297
第 10 名:  1141.1028
第 11 名:  1039.6763
第 12 名:  944.9978
第 13 名:  894.7883
第 14 名:  863.33575
第 15 名:  831.8832
第 16 名:  803.35077
第 17 名:  778.65076
第 18 名:  761.7546
第 19 名:  745.4608
第 20 名:  732.762
第 21 名:  721.48956
第 22 名:  710.217
第 23 名:  698.94446
第 24 名:  687.672
第 25 名:  676.3994
第 26 名:  665.1269
第 27 名:  653.8545
第 28 名:  642.582
第 29 名:  631.30945
第 30 名:  620.0369
第 31 名:  608.76447
第 32 名:  597.49194
第 33 名:  586.2194
第 34 名:  574.947
第 35 名:  563.67444
第 36 名:  552.4019
第 37 名:  541.12933
第 38 名:  529.857
第 39 名:  518.5845
第 40 名:  507.31195
第 41 名:  496.03946
第 42 名:  484.76694
第 43 名:  473.49435
第 44 名:  462.22195
第 45 名:  450.9494
第 46 名:  439.67682
第 47 名:  428.40448
第 48 名:  417.13193
第 49 名:  405.8593
第 50 名:  394.5868
