2020李宏毅深度学习hw1
2020李宏毅深度學(xué)習(xí)hw1
1、導(dǎo)入包
import sys import pandas as pd import numpy as np2、加載數(shù)據(jù)
data = pd.read_csv('train.csv', encoding = 'big5')兩個參數(shù)分別是“文件路徑”和“文件編碼格式”,
‘big5’指的是繁體中文編碼,因?yàn)榻o的數(shù)據(jù)是TW那邊的,所以必須是用big5來進(jìn)行解碼。
3、無用數(shù)據(jù)去除
data = data.iloc[:, 3:] #iloc(行,列)data.iloc[:, 3:]:
iloc(行號,列號),這個函數(shù)的功能是根據(jù)行號和列號提取內(nèi)容。
行號傳遞的參數(shù)是“:”說明data的行內(nèi)容全部取出,
列號傳遞的參數(shù)“3:”表明數(shù)據(jù)從3這個標(biāo)號開始的列才拿出來,前面的0-3的列就全部去掉。
總結(jié):取data中所有行的從第三列之后的所有列數(shù)
data[data == 'NR'] = 0data[data == ‘NR’] = 0:
將數(shù)據(jù)中值為“NR”的數(shù)據(jù)全部賦值為0,去除特殊值。
raw_data = data.to_numpy():
將處理好的DataFrame的數(shù)據(jù)變成一個numpy矩陣。
事實(shí)證明raw_data = data.values這句話的效果和上面的這一句是一樣的效果。
4、提取特征
month_data = {} for month in range(12): # month 從0-11 共12個月sample = np.empty([18, 480]) # 返回一個18行480列的數(shù)組,用來保存一個月的數(shù)據(jù)(一個月只有20天,一天24個小時)for day in range(20): # day從0-19 共20天sample[:, day * 24: (day + 1) * 24] = raw_data[18 * (20 * month + day): 18 * (20 * month + day + 1),:]# raw的行每次取18行,列取全部列。# sample中(sample是18行480列)行給全部行,# 列只給24列,然后列往后增加month_data[month] = sample使用字典month_data來存儲數(shù)據(jù),先創(chuàng)建一個空字典
使用empty()來創(chuàng)建一個空的數(shù)組sample,用來存放最后的數(shù)據(jù)。
sample = np.empty([18,480])的參數(shù)是[18,480]就是要創(chuàng)建一個18行480列的數(shù)組來存放數(shù)據(jù)。
18行的意思是每天的一個小時的數(shù)據(jù)有18個特征數(shù)據(jù),
480的意思是一天有24個小時,我們?nèi)〉檬敲總€月得前面20天,所以列數(shù)就是24*20==480。
sample[:, day * 24 :(day+1) * 24]中的“,
”前面是":“表明行的內(nèi)容全部都要,”,
"后面的是列的內(nèi)容,就是按照0-24-48-…這樣將24小時的數(shù)據(jù)提取出來保存。
raw_data的數(shù)據(jù)是豎著排列的,
raw_data[18 * (20 * month + day) : 18 * (20 * month + day+1), :]的“,
”前面是0-18-36…這樣取得。
5、特征提取
x = np.empty([12 * 471, 18 * 9],dtype=float) # 一共480個小時,每9個小時一個數(shù)據(jù)(480列最后一列不可以計(jì)入,因?yàn)槿绻〉阶詈笠恍?# 那么最后一個數(shù)據(jù)便沒有了結(jié)果{需要9個小時的輸入和第10個小時的第10行作為結(jié)果}),# 480-1-9+1=471。471*12個數(shù)據(jù)集按行排列,每一行一個數(shù)據(jù);# 數(shù)據(jù)是一個小時有18個特征,而每個數(shù)據(jù)9個小時,一共18*9列 y = np.empty([12 * 471, 1], dtype=float) # 結(jié)果是471*12個數(shù)據(jù),每個數(shù)據(jù)對應(yīng)一個結(jié)果,即第10小時的PM2.5濃度 for month in range(12): # month 0-11for day in range(20): # day 0-19for hour in range(24): # hour 0-23if day == 19 and hour > 14: # 取到raw_data中的最后一塊行為18,列為9的塊之后,就不可以再取了,再取就會超過界限了#hour >14 表示每次取前9個小時,按滑動窗口方式依次向后滑動,當(dāng)hour >14時,后面的列數(shù)就不夠9列,所以不能>14continuex[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īng)month:行都要取,列取9個,依次進(jìn)行,最后將整個數(shù)據(jù)reshape成一行數(shù)據(jù)#(列數(shù)無所謂)。然后賦給x,x內(nèi)的坐標(biāo)只是為了保證其從0-471*12y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9] # value,結(jié)果對應(yīng)的行數(shù)一直是第9列(即第10行PM2.5)然后列數(shù)隨著取得數(shù)據(jù)依次往后進(jìn)行這一步的工作內(nèi)容為獲取x和y這兩個數(shù)據(jù),就相當(dāng)于得到訓(xùn)練的數(shù)據(jù)與目標(biāo)的結(jié)果。
x的維數(shù)是[12471,189],最后的數(shù)據(jù)格式應(yīng)該是行數(shù)代表的是按照9小時劃分出來的這么多的訓(xùn)練數(shù)據(jù),列的內(nèi)容是每個小時的18項(xiàng)特征的的值。這便是訓(xùn)練集的輸入?yún)?shù)。
y的維數(shù)是[12*471,1],代表和x對應(yīng)的輸入的PM2.5的數(shù)值,所以列數(shù)是1,就只是一個PM2.5的值。
整個循環(huán)其實(shí)就是遍歷month_data字典將數(shù)據(jù)分割為9小時一組的訓(xùn)練數(shù)據(jù)。
reshape(1,-1),就是將month_data[month][:,day * 24 + hour : day *24 + hour + 9]取出來的數(shù)據(jù)變換成1行的數(shù)據(jù),列數(shù)的參數(shù)給-1,就是說列數(shù)讓程序自己去算出來。
https://www.jianshu.com/p/fc2fe026f002 是reshape()函數(shù)的介紹的博客,貼在這里。
y的值取0-9者10個小時中的最后一個小時的PM2.5的值。
6、Normalize 歸一化
mean_x = np.mean(x, axis=0) # 18 * 9 求均值,axis = 0表示對各列求均值,返回 1* 列數(shù) 的矩陣 std_x = np.std(x, axis=0)# 18 * 9 求標(biāo)準(zhǔn)差,axis = 0表示對各列求均值,返回 1* 列數(shù) 的矩陣 for i in range(len(x)): # 12 * 471for j in range(len(x[0])): # 18 * 9if std_x[j] != 0:x[i][j] = (x[i][j] - mean_x[j]) / std_x[j] # 標(biāo)準(zhǔn)差歸一化mean_x = np.mean(x, axis=0)代碼解釋:
對x數(shù)據(jù)集中的每一列求平均值。
axis 不設(shè)置值,對 m*n 個數(shù)求均值,返回一個實(shí)數(shù)
axis = 0 : 壓縮行,對各列求均值,返回 1*n矩陣
axis = 1 : 壓縮列,對各行求均值,返回 m*1矩陣
https://www.cnblogs.com/LBSer/p/4440590.html 解釋了上面的一段代碼采用的是標(biāo)準(zhǔn)差歸一化。
7、拆分訓(xùn)練集和驗(yàn)證集
? 接下來是將訓(xùn)練數(shù)據(jù)按8:2拆成訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)。這樣的好處是因?yàn)樽罱K只給我們test data的輸入而沒有給我們輸出,所以我們無法定量我們模型的好壞,而使用驗(yàn)證數(shù)據(jù)可以簡單驗(yàn)證我們模型的好壞,讓我們自己心里有數(shù)。
# 將訓(xùn)練數(shù)據(jù)拆成訓(xùn)練數(shù)據(jù):驗(yàn)證數(shù)據(jù)=8:2,這樣用來驗(yàn)證 import math x_train_set = x[: math.floor(len(x) * 0.8), :] y_train_set = y[: math.floor(len(y) * 0.8), :] x_validation = x[math.floor(len(x) * 0.8):, :] y_validation = y[math.floor(len(y) * 0.8):, :]8、train 訓(xùn)練
np.zeros([m,n]):返回一個全0的mn數(shù)組。
??np.ones([m,n]):返回一個全1的mn維數(shù)組。
??np.concatenate((a,b),axis=1):a和b做行拼接,結(jié)果為[a,b]。
??np.dot(x,w):x和w點(diǎn)乘。
??np.power(x,n):x中各元素的n次方。
??np.sqrt(x):x中各元素的平方根。
??np.sum(x):x中所有元素的和,返回一個值。
??x.transpose():將x轉(zhuǎn)置。
9、載入驗(yàn)證集進(jìn)行驗(yàn)證
w = np.load('weight.npy')# 使用x_validation和y_validation來計(jì)算模型的準(zhǔn)確率,因?yàn)閄已經(jīng)normalize了,#所以不需要再來一遍,只需在x_validation上添加新的一列作為bias的乘數(shù)即可 x_validation = np.concatenate((np.ones([1131, 1]), x_validation),axis=1).astype(float) ans_y = np.dot(x_validation, w) loss = np.sqrt(np.sum(np.power(ans_y - y_validation, 2)) / 1131)print(loss)10、預(yù)測testdata得到預(yù)測結(jié)果
testdata = pd.read_csv('./dataset/test.csv', header=None, encoding='big5') test_data = testdata.iloc[:, 2:] # 取csv文件中的全行數(shù)即第3列到結(jié)束的列數(shù)所包含的數(shù)據(jù) test_data[test_data == 'NR'] = 0 # 將testdata中的NR替換為0 test_data = test_data.to_numpy() # 將其轉(zhuǎn)換為數(shù)組 test_x = np.empty([240, 18 * 9], dtype=float) # 創(chuàng)建一個240行18*9列的空數(shù)列用于保存textdata的輸入 for i in range(240): # 共240個測試輸入數(shù)據(jù)test_x[i, :] = test_data[18 * i: 18 * (i + 1), :].reshape(1, -1)# 下面是Normalize,且必須跟training data是同一種方法進(jìn)行Normalize for i in range(len(test_x)):for j in range(len(test_x[0])):if std_x[j] != 0:test_x[i][j] = (test_x[i][j] - mean_x[j]) / std_x[j] test_x = np.concatenate((np.ones([240, 1]), test_x), axis=1).astype(float) # 在test_x前面拼接一列全1數(shù)組,構(gòu)成240行,163列數(shù)據(jù)# 進(jìn)行預(yù)測 w = np.load('weight.npy') ans_y = np.dot(test_x, w) # test data的預(yù)測值ans_y=test_x與W的積# 將預(yù)測結(jié)果填入文件當(dāng)中 import csvwith open('submit.csv', mode='w', newline='') as submit_file:csv_writer = csv.writer(submit_file)header = ['id', 'value']print(header)csv_writer.writerow(header)for i in range(240):row = ['id_' + str(i), ans_y[i][0]]csv_writer.writerow(row)print(row)參考來源:
李宏毅深度學(xué)習(xí)課程作業(yè)hw1詳解
李宏毅機(jī)器學(xué)習(xí)-第一課作業(yè)
李宏毅機(jī)器學(xué)習(xí)2020春季作業(yè)一hw1
總結(jié)
以上是生活随笔為你收集整理的2020李宏毅深度学习hw1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李宏毅深度学习基础
- 下一篇: 新海诚没有参与制作的作品_全能的新海诚,