李宏毅机器学习——课后作业1
李宏毅機器學(xué)習(xí)視頻地址:
【李宏毅 深度學(xué)習(xí)19(完整版)國語】
第一次作業(yè)參考地址:
線性回歸預(yù)測PM2.5----臺大李宏毅機器學(xué)習(xí)作業(yè)1(HW1)
文章目錄
- 作業(yè)要求:
- 作業(yè)分析:
- 模型分析:
- 代碼分析:
- 數(shù)據(jù)預(yù)處理:
- 模型建立:
- 完整代碼:
- 運行結(jié)果:
作業(yè)要求:
給定訓(xùn)練集train.csv,要求根據(jù)前9個小時的空氣監(jiān)測情況預(yù)測第10個小時的PM2.5含量。
訓(xùn)練集介紹:
作業(yè)分析:
先看tarin.csv,列是監(jiān)測數(shù)據(jù),行是檢測項目,共分為18個檢測項目,24時的監(jiān)測數(shù)據(jù)。
其中比較特殊的數(shù)據(jù)是RAINFALL,含義是:是否下雨,所以需要將其變成布爾值。
對于該數(shù)據(jù),我們需要準備一個二維數(shù)組(18,9)來包含每一天的信息。
而由于train.csv中給了24時的數(shù)據(jù),我們只需要9時數(shù)據(jù)來預(yù)測10時的PM2.5,因此,我們可以用滑動窗口的方法來擴展數(shù)據(jù):
這樣一來,一天中包含了15個(18,9)的數(shù)據(jù)幀,共計240天*15=3600個數(shù)據(jù)幀及其label。
模型分析:
請見:
線性回歸預(yù)測PM2.5----臺大李宏毅機器學(xué)習(xí)作業(yè)1(HW1)
代碼分析:
數(shù)據(jù)預(yù)處理:
# 數(shù)據(jù)預(yù)處理 def dataProcess(df):#建立兩個列表,跟數(shù)組類似,但當(dāng)中存放的是索引x_list, y_list = [], []# df替換指定元素,將空數(shù)據(jù)填充為0df = df.replace(['NR'], [0.0])# astype() 轉(zhuǎn)換array中元素數(shù)據(jù)類型array = np.array(df).astype(float)# 將數(shù)據(jù)集拆分為多個數(shù)據(jù)幀#從0開始,到4320行,步長為18for i in range(0, 4320, 18):#從0列開始,到第15列結(jié)束for j in range(15):#獲取一個二維列表,18行9列mat = array[i:i+18, j:j+9]# 取得PM2.5的數(shù)值作為標簽label = array[i+9, j+9]x_list.append(mat)y_list.append(label)x = np.array(x_list)y = np.array(y_list)return x, y, arraydf:是pd.read_csv()函數(shù)讀取train.csv獲得的DataFrame格式的類表格結(jié)構(gòu)。
其格式如下:
模型建立:
# 更新參數(shù),訓(xùn)練模型 def train(x_train, y_train, epoch):bias = 0 # 偏置值初始化weights = np.ones(9) # 權(quán)重初始化learning_rate = 1 # 初始學(xué)習(xí)率reg_rate = 0.001 # 正則項系數(shù)bg2_sum = 0 # 用于存放偏置值的梯度平方和wg2_sum = np.zeros(9) # 用于存放權(quán)重的梯度平方和for i in range(epoch):b_g = 0w_g = np.zeros(9)# 在所有數(shù)據(jù)上計算Loss_label的梯度for j in range(3200):b_g += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-1)for k in range(9):w_g[k] += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-x_train[j, 9, k])# 求平均b_g /= 3200w_g /= 3200# 加上Loss_regularization在w上的梯度for m in range(9):w_g[m] += reg_rate * weights[m]# adagradbg2_sum += b_g**2wg2_sum += w_g**2# 更新權(quán)重和偏置bias -= learning_rate/bg2_sum**0.5 * b_gweights -= learning_rate/wg2_sum**0.5 * w_g# 每訓(xùn)練200輪,輸出一次在訓(xùn)練集上的損失if i%200 == 0:loss = 0for j in range(3200):loss += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias)**2print('after {} epochs, the loss on train data is:'.format(i), loss/3200)return weights, bias完整代碼:
import pandas as pd import numpy as np# 數(shù)據(jù)預(yù)處理 def dataProcess(df):#建立兩個列表,跟數(shù)組類似,但當(dāng)中存放的是索引x_list, y_list = [], []# df替換指定元素,將空數(shù)據(jù)填充為0df = df.replace(['NR'], [0.0])# astype() 轉(zhuǎn)換array中元素數(shù)據(jù)類型array = np.array(df).astype(float)# 將數(shù)據(jù)集拆分為多個數(shù)據(jù)幀#從0開始,到4320行,步長為18for i in range(0, 4320, 18):#從0列開始,到第15列結(jié)束for j in range(15):#獲取一個二維列表,18行9列mat = array[i:i+18, j:j+9]# 取得PM2.5的數(shù)值作為標簽label = array[i+9, j+9]x_list.append(mat)y_list.append(label)x = np.array(x_list)y = np.array(y_list)return x, y, array# 更新參數(shù),訓(xùn)練模型 def train(x_train, y_train, epoch):bias = 0 # 偏置值初始化weights = np.ones(9) # 權(quán)重初始化learning_rate = 1 # 初始學(xué)習(xí)率reg_rate = 0.001 # 正則項系數(shù)bg2_sum = 0 # 用于存放偏置值的梯度平方和wg2_sum = np.zeros(9) # 用于存放權(quán)重的梯度平方和for i in range(epoch):b_g = 0w_g = np.zeros(9)# 在所有數(shù)據(jù)上計算Loss_label的梯度for j in range(3200):b_g += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-1)for k in range(9):w_g[k] += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-x_train[j, 9, k])# 求平均b_g /= 3200w_g /= 3200# 加上Loss_regularization在w上的梯度for m in range(9):w_g[m] += reg_rate * weights[m]# adagradbg2_sum += b_g**2wg2_sum += w_g**2# 更新權(quán)重和偏置bias -= learning_rate/bg2_sum**0.5 * b_gweights -= learning_rate/wg2_sum**0.5 * w_g# 每訓(xùn)練200輪,輸出一次在訓(xùn)練集上的損失if i%200 == 0:loss = 0for j in range(3200):loss += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias)**2print('after {} epochs, the loss on train data is:'.format(i), loss/3200)return weights, bias# 驗證模型效果 def validate(x_val, y_val, weights, bias):loss = 0for i in range(400):loss += (y_val[i] - weights.dot(x_val[i, 9, :]) - bias)**2return loss / 400def main():# 從csv中讀取有用的信息# 由于大家獲取數(shù)據(jù)集的渠道不同,所以數(shù)據(jù)集的編碼格式可能不同# 若讀取失敗,可在參數(shù)欄中加入encoding = 'gb18030'df = pd.read_csv('train.csv', usecols=range(3,27),encoding ='GBK')#print(df)x, y, _ = dataProcess(df)#劃分訓(xùn)練集與驗證集x_train, y_train = x[0:3200], y[0:3200]x_val, y_val = x[3200:3600], y[3200:3600]epoch = 2000 # 訓(xùn)練輪數(shù)# 開始訓(xùn)練w, b = train(x_train, y_train, epoch)# 在驗證集上看效果loss = validate(x_val, y_val, w, b)print('The loss on val data is:', loss)if __name__ == '__main__':main()運行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的李宏毅机器学习——课后作业1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java使用itextpdf生成PDF文
- 下一篇: android使用Itext库生成PDF