李宏毅作业(一)-----Regression

    科技2023-09-29  77

    作业题目

    本次作業的資料是從行政院環境環保署空氣品質監測網所下載的觀測資料。希望大家能在本作業實作 linear regression 預測出 PM2.5 的數值

    数据描述

    本次作業使用豐原站的觀測記錄,分成 train set 跟 test set,train set 是豐原站每個月的前 20 天所有資料。test set 則是從豐原站剩下的資料中取樣出來。train.csv: 每個月前 20 天的完整資料。test.csv : 從剩下的資料當中取樣出連續的 10 小時為一筆,前九小時的所有觀測數據當作 feature,第十小時的 PM2.5 當作 answer。一共取出 240 筆不重複的 test data,請根據 feature 預測這 240 筆的 PM2.5。Data 含有 18 項觀測數據 AMB_TEMP, CH4, CO, NHMC, NO, NO2, NOx, O3, PM10, PM2.5, RAINFALL, RH, SO2, THC, WD_HR, WIND_DIREC, WIND_SPEED, WS_HR

    Training Data

    Testing Data

    思路分析及代码实现

    一:浏览数据可知,数据中存在一定量的空数据NR,且多存在于RAINFALL一项。对于空数据,常规的处理方法无非就是删除法和补全法两种。查阅资料后发现,RAINFALL表示当天对应时间点是否降雨,有降雨值为1,无降雨值为NR,类似于布尔变量。因此可以采用补全法处理空数据:将空数据NR全部补为0即可。

    Load 'train.csv’

    import sys import pandas as pd import numpy as np # data = pd.read_csv('gdrive/My Drive/hw1-regression/train.csv', header = None, encoding = 'big5') data = pd.read_csv('./hw1/train.csv', encoding = 'big5')

    Preprocessing

    data = data.iloc[:, 3:] data[data == 'NR'] = 0 raw_data = data.to_numpy() raw_data

    將原始 4320 * 18 的資料依照每個月分重組成 12 個 18 (features) * 480 (hours) 的資料

    month_data = {} for month in range(12): sample = np.empty([18, 480]) for day in range(20): sample[:, day * 24 : (day + 1) * 24] = raw_data[18 * (20 * month + day) : 18 * (20 * month + day + 1), :] month_data[month] = sample

    每個月會有 480hrs,每 9 小時形成一個 data,每個月會有 471 個 data,故總資料數為 471 * 12 筆,而每筆 data 有 9 * 18 的 features (一小時 18 個 features * 9 小時)。對應的 target 則有 471 * 12 個(第 10 個小時的 PM2.5)

    x = np.empty([12 * 471, 18 * 9], dtype = float) y = np.empty([12 * 471, 1], dtype = float) for month in range(12): for day in range(20): for hour in range(24): if day == 19 and hour > 14: continue x[month * 471 + day * 24 + hour, :] = month_data[month][:,day * 24 + hour : day * 24 + hour + 9].reshape(1, -1) #vector dim:18*9 (9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9) y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9] #value print(x) print(y)

    Normalize (归一化)

    mean_x = np.mean(x, axis = 0) #18 * 9 std_x = np.std(x, axis = 0) #18 * 9 for i in range(len(x)): #12 * 471 for j in range(len(x[0])): #18 * 9 if std_x[j] != 0: x[i][j] = (x[i][j] - mean_x[j]) / std_x[j] x

    感悟

    偏差和方差的理解:

    偏差过大怎么解决: 方差过大怎么解决: 理解交叉验证:

    N折交叉验证:

    Processed: 0.018, SQL: 8