李宏毅機器學習3(HW1)

作業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)
#得到損失值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章