作業1:預測PM2.5的值
在這個作業中,我們將用梯度下降方法預測PM2.5的值
hw1要求:
1、要求python3.5+
2、只能用(1)numpy(2)scipy(3)pandas
3、請用梯度下降手寫線性迴歸
4、最好的公共簡單基線
5、對於想加載模型而並不想運行整個訓練過程的人:
請上傳訓練代碼並命名成 train.py
只要用梯度下降的代碼就行了
hw_best 要求:
1.要求python3.5
2.任何庫都可以使用
3.在kaggle上獲得你選擇的更高的分數
數據介紹:
本次作業使用豐原站的觀測記錄,分成train set跟test set,train set是豐原站每個月的前20天所有資料test set則是從豐原站剩下的資料中取樣出來。
train.csv:每個月前20天每個小時的氣象資料(每小時有18種測資)。共12個月。
test.csv:從剩下的資料當中取樣出連續的10小時為一筆,前九小時的所有觀測數據當作feature,第十小時的PM2.5當作answer。一共取出240筆不重複的test data,請根據feauure預測這240筆的PM2.5。
具體代碼
import pandas as pd
import numpy as np
train_data = pd.read_csv('train.csv')
PMdata = train_data[train_data['observation']=='PM2.5']
PMdata = PMdata.iloc[:, 3:]
train_x = []
train_y = []
for i in range(15):
x = PMdata.iloc[:, i:i+9]
x.columns = np.array(range(9))
y = PMdata.iloc[:,i+9]
y.columns = np.array(range(1))
train_x.append(x)
train_y.append(y)
train_x = pd.concat(train_x)
train_y = pd.concat(train_y)
train_x = np.array(train_x,float)
train_y = np.array(train_y, float)
train_x = np.concatenate((np.ones((train_x.shape[0], 1)),train_x),axis=1)
#上面是數據的讀取和簡單的處理
w = np.zeros(len(train_x[0]))
lr = 10
Iteration = 10000
sum_gra = np.zeros(len(train_x[0]))
for i in range(Iteration):
y_new = np.dot(train_x, w)
loss = y_new-train_y
gra = 2*np.dot(train_x.transpose(), loss)
sum_gra += gra**2
ada = np.sqrt(sum_gra)
w = w - lr*gra/ada
#訓練模型得到權重w
test_data = pd.read_csv('test.csv')
PMtest = test_data[test_data['AMB_TEMP'] == 'PM2.5']
PMtest = PMtest.iloc[:,2:]
test_x = np.array(PMtest, float)
test_x = np.concatenate((np.ones((test_x.shape[0],1)),test_x),axis=1)
y_pre = np.dot(test_x, w)
#同樣的處理,以及讓得到的模型權重w乘上特徵x,來得到預測值y
y_submit=pd.read_csv('sampleSubmission.csv')
y_submit.value = y_pre
y_submit.to_csv('ownSubmission.csv')
#生成上交文件
real = pd.read_csv('answer.csv')
error = abs(y_submit.value - real.value).sum()/len(real.value)
#得到損失值