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