# 簡易神經網路回歸模型預測 根據博客來電腦書籍排行榜前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)