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