###### 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