李宏毅机器学习课程作业-HW1

整篇文章是笔者自我一点点学习和理解其所给指导代码的记录学习。

在读取文件的时候使用了pandas.read_csv()函数,其中enconding的参数时“big5”,这是因为在这份文件中里面含有繁体字,使用“gbk”编码时会报错

data = pd.read_csv('./train.csv', encoding='big5')

记事本打开是这样:

李宏毅机器学习课程作业-HW1_第1张图片

使用该函数打开后是这样:

李宏毅机器学习课程作业-HW1_第2张图片 PREPROCESSING部分

data = data.iloc[:, 3:]
data[data == 'NR'] = 0
raw_data = data.to_numpy()

        首先根据这份数据的存储格式提取出有用数据,横竖两条红线不是数据,而是数据的索引,数据的切片的计算是去除横竖两条数据开始计算的,因为这个数据是pd.DataFrame()的格式,因此得使用pandas函数中的.iloc()函数进行切片,将数据从第四列开始提取出来,从上面给出的记事本格式中,存在NR,因此将所有NR部分置零,同时将数据的格式改变为numpy数组格式。

李宏毅机器学习课程作业-HW1_第3张图片

 数据特点:

        由上面几张图片可以看到,整个数据的分布是,列为日期1.1号到12.20号,每一天中共有18中气体检测,而行为每一天24小时中每一小时18种气体的水平。

李宏毅机器学习课程作业-HW1_第4张图片

         将每一天的数据看成一个数据块,将由列排列的数据块重新改变分布为行排列的数据块。

month_data = {}
for month in range(12):
    sample = np.empty([18, 480]) #每个月20天
    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

训练集和标签设置:

         李宏毅机器学习课程作业-HW1_第5张图片

         上面将数据的分布进行了改变,以每一月内的数据作为一块,以行分布的形式拼接,其中行是空气中的18个指标而列是12个月每个月20天每天24个小数(12*20*24=12*480)。每一个数据块中有480个小数的数据。

        将每十个小时的数据作为一份数据,其中前9个小时作为训练集和第10个小时为标签,每一份数据之间只隔了一个小时,所以可以计算出每一个月中共有471份训练数据。其中标签仅需要18个指标中的PM2.5的数据作为标签。

x = np.empty([12 * 471, 18 * 9], dtype = float) #训练集为前9个小时的18个指标
y = np.empty([12 * 471, 1], dtype = float) #标签仅为第10小时的PM2.5的指标数据
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)
            y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9] #value

 归一化:

         

mean_x = np.mean(x, axis = 0) #18 * 9 axis=0对列进行求均值
std_x = np.std(x, axis = 0) #18 * 9
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]

 训练集验证集划分:

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): , :]

训练train:

李宏毅机器学习课程作业-HW1_第6张图片

李宏毅机器学习课程作业-HW1_第7张图片

 

使用梯度下降法进行训练

loss=(Y^{'}-Y)^{2}

\Delta w=\frac{\partial L}{\partial w}=2*XL 

dim = 18 * 9 + 1
w = np.zeros([dim, 1])
x = np.concatenate((np.ones([12 * 471, 1]), x), axis = 1).astype(float)
learning_rate = 100
iter_time = 1000
adagrad = np.zeros([dim, 1])
eps = 0.0000000001
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*1
    adagrad += gradient ** 2
    w = w - learning_rate * gradient / np.sqrt(adagrad + eps)
np.save('weight.npy', w)

测试TEST: 

testdata = pd.read_csv('./test.csv', header = None, encoding = 'big5')
test_data = testdata.iloc[:, 2:]
test_data[test_data == 'NR'] = 0
test_data = test_data.to_numpy()
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数据的处理方式与train数据相同,截取有用数据片段,对数据重新排列,多添加一维dimension,归一化

预测:

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

y=x*w 

文件保存:

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)

你可能感兴趣的:(机器学习,python)