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