【深度学习】李宏毅老师课程作业第一题

题目要求:

【深度学习】李宏毅老师课程作业第一题_第1张图片

 先打开train数据如图

【深度学习】李宏毅老师课程作业第一题_第2张图片

拿到数据后先对数据进行预处理

导入数据

import sys
import pandas as pd
import numpy as np
# 读入train.csv,繁体字以big5编码
data = pd.read_csv('C:/Users/Lenovo/Desktop/shuzizuoye/huigui/hw1/hw1/train.csv', encoding = 'big5')#导入数据
data.shape #输出行数列数

 整个训练集有4320行27列

去掉没有用的数据,将rainfall中的nr改为0

# 丢弃前三列,需要的是从第四列开始的数值
data = data.iloc[:, 3:]
# 把降雨的NR字符变成数值0
data[data == 'NR'] = 0
# 把dataframe转换成numpy的数组
raw_data = data.to_numpy()
print(raw_data)

【深度学习】李宏毅老师课程作业第一题_第3张图片

此时的数据集为4320×24 

预处理结束后需要对训练集的特征进行提取,

【深度学习】李宏毅老师课程作业第一题_第4张图片

【深度学习】李宏毅老师课程作业第一题_第5张图片 

因为一天24个小时测量的数据有18个,因此根据这个分组,一组数据为18×24,一个月20天,一年12个月,因此将数据变为水平后的矩阵为18×(24*20*12)。变化代码如下:

month_data = {}#建立一个名为 month_data的字典,将数据集放入字典中
for month in range(12):
    sample = np.empty([18, 480])#建立一个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

搭建一个下,x,y的训练集,x为数据,y为标签,通过前9个小时的数据来验证第10个小时的标签,x存放的是连续9个小时的数据,y存放的是对应第10个小时的数据。因为数据都是连续的,以10个小时为一个窗口,每次向右滑动1个小时,所以一个月内的480个小时可以分成480-9=471组数据。

【深度学习】李宏毅老师课程作业第一题_第6张图片

 

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)
            #day * 24 + hour : day * 24 + hour + 9 通过9个小时数据计算第十个小时
            #reshape(1, -1) 将x数组拉伸成1行
            y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9] #value
            #PM2.5在第九行
print(x)
print(y)

【深度学习】李宏毅老师课程作业第一题_第7张图片

 数据集以及标签集创建完后需将数据归一化,以保证每个数据对结果都有相同的影响。常见的归一化公式为:x= (x - μ ) / σ,μ是x的均值,σ 是x的标准差。
 

mean_x = np.mean(x, axis = 0) #18 * 9 将测试集x对列取平均值
std_x = np.std(x, axis = 0) #18 * 9 将测试集x对列去标准差
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]# 归一化处理
print(x)

【深度学习】李宏毅老师课程作业第一题_第8张图片

 归一化处理之后将x与y分为测试集与验证集,这里按照8:2的比例分配

import math
#将测试集与验证集按照8:2的比例分配
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): , :]
print(x_train_set)
print(y_train_set)
print(x_validation)
print(y_validation)
print(len(x_train_set))
print(len(y_train_set))
print(len(x_validation))
print(len(y_validation))

【深度学习】李宏毅老师课程作业第一题_第9张图片

 处理完后开始训练模型

【深度学习】李宏毅老师课程作业第一题_第10张图片

【深度学习】李宏毅老师课程作业第一题_第11张图片

 【深度学习】李宏毅老师课程作业第一题_第12张图片

 dim表示维度,因为存在偏置项b因此维度需要加1为18*9+1,采用adagrad算法优化,这个算法的核心思想时通过自变量在每一个维度的梯度值来调整各个维度上的学习率,避免统一的学习率难以适应所有维度的问题。

dim = 18 * 9 + 1#参数的维度
w = np.zeros([dim, 1])#定义一个参数矩阵
x_train_set=  np.concatenate((np.ones([len(x_train_set), 1]), x_train_set), axis=1).astype(float)#将x_train_set矩阵前添加1列全为1的数据
learning_rate = 100#学习率
iter_time = 1000#迭代次数
adagrad = np.zeros([dim, 1])#采用adagrad更新学习率
eps = 0.0000000001#在adagard方法中,需要用梯度值的平方之和作为分母,为了防止分母为0,加上一个极小值
for t in range(iter_time):
    loss = np.sqrt(np.sum(np.power(np.dot(x, w) - y, 2))/471/12)#rmse损失函数
    if(t%100==0):
        print("迭代次数为:"+str(t),"    " ,"损失值为:" + str(loss))
    gradient = 2 * np.dot(x.transpose(), np.dot(x, w) - y) #dim*
    adagrad += gradient ** 2
    w = w - learning_rate * gradient / np.sqrt(adagrad + eps)
np.save('weight.npy', w)
print(w)

【深度学习】李宏毅老师课程作业第一题_第13张图片

 开始测试test文件

# 读入测试数据test.csv
testdata = pd.read_csv('C:/Users/Lenovo/Desktop/shuzizuoye/huigui/hw1/hw1/test.csv', header = None, encoding = 'big5')
# 丢弃前两列,需要的是从第3列开始的数据
test_data = testdata.iloc[:, 2:]
# 把降雨为NR字符变成数字0
test_data[test_data == 'NR'] = 0
# 将dataframe变成numpy数组
test_data = test_data.to_numpy()
# 将test数据也变成 240 个维度为 18 * 9 + 1 的数据。
test_x = np.empty([240, 18*9], dtype = float)
for i in range(240):
    test_x[i, :] = test_data[18 * i: 18* (i + 1), :].reshape(1, -1)
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

【深度学习】李宏毅老师课程作业第一题_第14张图片

对预测值进行计算

w = np.load('weight.npy')
ans_y = np.dot(test_x, w)
ans_y

 【深度学习】李宏毅老师课程作业第一题_第15张图片

 将预测值保存

import csv
with 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)

你可能感兴趣的:(深度学习,人工智能)