前言
目前有在 百度 的 AI Studio 上的李宏毅课程-机器学习特训营上学习,有练习到回归问题中的练习题,采用逻辑回归的方法去尝试编写程序回归预测PM2.5的值。尝试把一些心得记录下来!
项目描述
- 本次作业的资料是从行政院环境环保署空气品质监测网所下载的观测资料。
- 希望大家能在本作业实现 linear regression 预测出 PM2.5 的数值。
数据集介绍
- 本次作业使用丰原站的观测记录,分成 train set 跟 test set,train set 是丰原站每个月的前 20 天所有资料。test set 则是从丰原站剩下的资料中取样出来。
- train.csv: 每个月前 20 天的完整资料。
- test.csv : 从剩下的资料当中取样出连续的 10 小时为一笔,前九小时的所有观测数据当作 feature,第十小时的 PM2.5 当作 answer。一共取出 240 笔不重複的 test data,请根据 feature 预测这 240 笔的 PM2.5。
- Data 含有 18 项观测数据 AMB_TEMP, CH4, CO, NHMC, NO, NO2, NOx, O3, PM10, PM2.5, RAINFALL, RH, SO2, THC, WD_HR, WIND_DIREC, WIND_SPEED, WS_HR。
载入数据集并转化为Pandas表格
import pandas as pd
import numpy as np
import math
# train.csv 数据 的表头 为
# 日期 测站 测项 0 1 2 3 4 5 ..... 21 22 23
# 因为每个月抽取20天的数据,一年有12个月,所以为 12 * 20 * 18(测项) = 4320 行
# 因为从数据的表头观察 有 3(日期、测站、测项) + 24(小时) = 27 列
# 数据表为:4320(行) * 27(列)
data = pd.read_csv('data/train.csv', encoding='big5')
查看数据集资料栏位
# 查看 train.csv 数据 的表头
data.columns
Index(['日期', '測站', '測項', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21',
'22', '23'],
dtype='object')
# 查看 train.csv 数据 的结构
print("train.csv 的 数据表结构: " + str(data.shape))
train.csv 的 数据表结构: (4320, 24)
查看数据表大致情况
# 查看数据的 前18行
print(data.head(18))
日期 測站 測項 0 1 ... 19 20 21 22 23
0 2014/1/1 豐原 AMB_TEMP 14 14 ... 16 15 15 15 15
1 2014/1/1 豐原 CH4 1.8 1.8 ... 1.8 1.8 1.8 1.8 1.8
2 2014/1/1 豐原 CO 0.51 0.41 ... 0.45 0.38 0.35 0.36 0.32
3 2014/1/1 豐原 NMHC 0.2 0.15 ... 0.12 0.1 0.09 0.1 0.08
4 2014/1/1 豐原 NO 0.9 0.6 ... 1.9 1.5 1.6 1.8 1.5
5 2014/1/1 豐原 NO2 16 9.2 ... 12 8.1 7 6.9 6
6 2014/1/1 豐原 NOx 17 9.8 ... 13 9.7 8.6 8.7 7.5
7 2014/1/1 豐原 O3 16 30 ... 34 37 38 38 36
8 2014/1/1 豐原 PM10 56 50 ... 63 46 36 42 42
9 2014/1/1 豐原 PM2.5 26 39 ... 44 41 30 24 13
10 2014/1/1 豐原 RAINFALL NR NR ... NR NR NR NR NR
11 2014/1/1 豐原 RH 77 68 ... 69 70 70 70 69
12 2014/1/1 豐原 SO2 1.8 2 ... 2.3 2 1.9 1.9 1.9
13 2014/1/1 豐原 THC 2 2 ... 1.9 1.9 1.9 1.9 1.9
14 2014/1/1 豐原 WD_HR 37 80 ... 121 113 112 106 110
15 2014/1/1 豐原 WIND_DIREC 35 79 ... 118 114 108 102 111
16 2014/1/1 豐原 WIND_SPEED 1.4 1.8 ... 3 2.6 2.7 2.1 2.1
17 2014/1/1 豐原 WS_HR 0.5 0.9 ... 2.5 2.8 2.6 2.4 2.3
[18 rows x 27 columns]
Loss (损失函数)介绍
在本次的线性回归中,使用RMSE(均方根误差)定义损失函数,用来度量模型性能的指标。
使用RMSE(均方根误差)来定义损失函数是具有平滑可微的特性。
AdaGrad 算法介绍
对于模型参数的权重值的优化,常常使用梯度下降法来进行优化,而在SGD随机梯度下降法的基础之上,使用AdaGrad算法,可以在参数空间中,对于想对平缓的方向,可以取得更大的进步。
AdaGrad算法与SGD梯度下降法相比,采用了累积平方梯度。
举例讲解不同:
假设参数空间中,有两个参数为 w 和 b,其中从图中看出,b方向的比较陡峭,而w方向比较平缓。
使用小批量梯度下降法(Mini-batch GD),移动的方向如上面的蓝色轨迹所示。
使用AdaGrad算法后,会使用累积平方梯度
在下次计算更新的时候,r是作为分母出现的,越大的反而更新越小,越小的值反而更新越大,那么后面的更新则会像上面绿色线更新一样,明显就会好于蓝色更新曲线。
在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。
所以,一般来说AdaGrad算法一开始是激励收敛,到了后面就慢慢变成惩罚收敛,速度越来越慢。
程序码展示
import pandas