李宏毅老师ML_HW1——PM2.5预测
生活随笔
收集整理的這篇文章主要介紹了
李宏毅老师ML_HW1——PM2.5预测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0、處理數據之前的pre-process
觀察下載的數據文件train.csv
train.csv只有每個月前20天的數據,另外每個月剩下10天數據用于作業結果評估,對學生不可見
觀察數據發現rainfall欄有很多NR表示沒有降雨,但是我們只需要數字,因此可以使用excel的替換將NR替換為0,之后再進行處理
作業要求:前9小時作為訓練集,第10小時的PM2.5作為實際結果,實際一共有18個特征——CH4、CO、CO2、NO等,但是這里我們只取相關性最高的PM2.5自身作為feature,實際如果對PM2.5的影響因素很了解,可以在另外的17個特征進行選取。
我們第一次取0 ~ 8時PM2.5作為訓練集feature,9時PM2.5作為其label,第二次取1 ~ 9時作為feature,10時的PM2.5作為label…直至feature取到22時,label取到23時,一共features為(3600, 9)的矩陣,labels為(3600, 1)的矩陣
import pandas as pd import numpy as np import matplotlib.pyplot as pltnp.set_printoptions(precision=3) # 設置array顯示精度,只能設置顯示精度不能實際更改其數值精度 np.set_printoptions(suppress=True) # 抑制小數的科學計數法顯示df = pd.read_csv("HW1_data_1.csv")# 數據處理,數據集中包含18個特征,本次訓練只使用PM2.5計算和預測 def dataprocess():# feature:feature_data = np.array(df.loc[:, "0":"22"]).reshape([240, 18, 23]) # 取所有行,首index"0"-"14", 尾index"14"-"22"feature = np.zeros((3600, 18, 9)) # 定義feature 容器for i in range(0, 15):feature[240 * i:240 * (i + 1)] = feature_data[:, :, i:9 + i] # axis=0和1的所有值的每9小時為一組數據,取左不取右feature = feature[:, 9, :] # 取所有維度的第9行,就是PM2.5的數值(240×15×9個PM2.5)# label:# 9時到23時所有特征數據(包含PM2.5在內所有特征量),因為loc無法操作細致切片,先轉成array再切# 只取PM2.5的數據用作預測,所以取[:, 9]240×18每18個中的第10個特征label_data = np.array(df.loc[:, "9":"23"]).reshape([240, 18, 15])[:, 9]label = label_data.reshape(3600, 1)return feature, labelclass Regression:def gradientdescent(self, x, y, epoch=1000, l=10, reg_rate=0.001):'''初始化誤差bias:3600個; 初始化weight:9個; 手動調整學習次數epoch; 手動調整學習率l,reg_rate正則化的系數'''n = len(x) # 實例個數n=3600weights = np.random.randn(x.shape[1], 1) # y.shape[0]行,1列的數,這些數從均值為0,方差為1的正態分布中生成用來初始化wbiases = np.random.randn(y.shape[0], 1) # 同樣初始化b# biases = np.zeros((y.shape[0], 1)) # 所有的bias都是相同的# 將x*weights+biases變形成X_new*theta,一起更新,同時便于cost求導X_new = np.ones((x.shape[0], x.shape[1] + 1)) # 定義X_new,比x多一列,第一列全為1,后面的列為xX_new[:, 1:] = x # (3600, 10),除了第一列是1,后面就是就是和x值一樣theta = np.full((weights.shape[0] + 1, weights.shape[1]), biases[0]) # 創建比weight多一行的矩陣theta[1:, ] = weights # 除了第一行是biases的值,后面9行都是weightgrad_sum = np.zeros(theta.shape)# print("weights:", weights.shape, "biases:", biases.shape) # weights: (9, 1) biases: (3600, 1)# print("X_new:", X_new.shape, "theta:", theta.shape) # X_new:(3600, 10) theta: (10, 1)# print(f"theta{theta},和weights{weights}{theta[1:]==weights}")for i in range(epoch):# 第一步:y = w1x1+w2x2+...+w9x9 + b1,一共3600次向量相乘算出初步的預測值a,然后慢慢優化# y_hat = np.dot(x, weights) + biases # 先x后weights避免shape對應不上y_hat1 = np.dot(X_new, theta) # 等同于xw+bloss = y_hat1 - y# Adagrad更新θ(權重和偏向)# 這里grad是每一次的梯度,而grad_sum是所有之前的梯度之和grad = 2 * (X_new.transpose().dot(loss))grad_sum += grad ** 2theta -= l * grad / np.sqrt(grad_sum)# cost函數cost = (1 / (2 * n)) * np.linalg.norm(loss) # np.linalg.norm是numpy自帶的歐氏距離計算方法# cost = (1/(2*n))*np.sqrt(np.sum(np.square(y - y_hat))) # 這個是直接數學運算求向量的歐氏距離,系數是1/(2*n)if (i + 1) % 100 == 0:print(f"經過第{i+1}次訓練,cost變為:{cost}")print(f"經過第{i + 1}次訓練,y_hat1均值:{round(np.sum(y_hat1)/3600, 4)}與y均值:{round(np.sum(y)/3600, 4)}"f"之差loss平均差變為:{np.sum(loss) / 3600}")print(f"經過第{i + 1}次訓練,本次梯度grad變為:{np.sum(grad)/3600}")DP = dataprocess() R = Regression() R.gradientdescent(DP[0], DP[1])輸出結果:
經過第100次訓練,cost變為:0.17832930592812254 經過第200次訓練,cost變為:0.1660618393695226 經過第300次訓練,cost變為:0.15927505672924216 經過第400次訓練,cost變為:0.15489108318605818 經過第500次訓練,cost變為:0.15184467687762343 經過第600次訓練,cost變為:0.14964991588379611 經過第700次訓練,cost變為:0.14804105402447518 經過第800次訓練,cost變為:0.14685216677724566 經過第900次訓練,cost變為:0.14597040063815991 經過第1000次訓練,cost變為:0.14531528068944696 經過第100次訓練,y_hat1均值:17.8139與y均值:24.0569之差平均差loss變為:-6.24304257009874 經過第200次訓練,y_hat1均值:18.653與y均值:24.0569之差平均差loss變為:-5.403915186992251 經過第300次訓練,y_hat1均值:19.4186與y均值:24.0569之差平均差loss變為:-4.638329558163197 經過第400次訓練,y_hat1均值:20.0769與y均值:24.0569之差平均差loss變為:-3.9800706681641165 經過第500次訓練,y_hat1均值:20.6393與y均值:24.0569之差平均差loss變為:-3.417681572977715 經過第600次訓練,y_hat1均值:21.12與y均值:24.0569之差平均差loss變為:-2.9369228516813766 經過第700次訓練,y_hat1均值:21.5316與y均值:24.0569之差平均差loss變為:-2.5253134626240024 經過第800次訓練,y_hat1均值:21.8845與y均值:24.0569之差平均差loss變為:-2.172397192822715 經過第900次訓練,y_hat1均值:22.1875與y均值:24.0569之差平均差loss變為:-1.8694547147842282 經過第1000次訓練,y_hat1均值:22.4478與y均值:24.0569之差平均差loss變為:-1.609182858159369 經過第100次訓練,本次梯度grad變為:0.15936844318025478 經過第200次訓練,本次梯度grad變為:0.05629405865738792 經過第300次訓練,本次梯度grad變為:0.03547007720060113 經過第400次訓練,本次梯度grad變為:0.025188272217026478 經過第500次訓練,本次梯度grad變為:0.01861384588607305 經過第600次訓練,本次梯度grad變為:0.014144000392948834 經過第700次訓練,本次梯度grad變為:0.011006343985549796 經過第800次訓練,本次梯度grad變為:0.008740552807814514 經過第900次訓練,本次梯度grad變為:0.0070594976666507134 經過第1000次訓練,本次梯度grad變為:0.005780481608253467這里還沒有使用交叉熵驗證和正則化,數據差異卻非常小,錯誤之處謝謝指出。
公式推導:
Regression_PM2.5
課程地址:
李宏毅老師機器學習教學網站
總結
以上是生活随笔為你收集整理的李宏毅老师ML_HW1——PM2.5预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 就业阶段-java语言进价_day02
- 下一篇: mysql全套基础知识_Mysql基础知