Hw1:pm2.5 Prediction
//李宏毅视频官网:http://speech.ee.ntu.edu.tw/~tlkagk/courses.html 点击此处返回总目录 //邱锡鹏《神经网络与深度学习》官网:https://nndl.github.io //李宏毅视频B站地址:https://www.bilibili.com/video/av10590361/?p=9 //作业一的链接:https://ntumlta.github.io/2017fall-ml-hw1/ //training data下载地址:https://ntumlta.github.io/2017fall-ml-hw1/train.csv //testing data下载地址:https://ntumlta.github.io/2017fall-ml-hw1/test.csv //testing data的实际结果:https://ntumlta.github.io/2017fall-ml-hw1/ans.csv
首先讲一下作业要求。 前面我们已经讲过利用Regression来预测宝可梦的CP值。我们现在要做真正有用的事,用Regression来预测PM2.5。上面有作业一的作业资料的链接。 ------------------------------------------------------------------------------------------------------------------------------------ 在作业一里面,要做的事情是,让机器可以预测丰源站在下一个小时的PM2.5。
举例来说,现在是2017年9月29号,上午8点。我们想让机器预测,在上午9点的时候PM2.5的值会是多少。如果不知道丰源在哪里的话,可以看一下左边的地图,丰源在蓝色框框、黄色实心的正方形这个地方(“中部”的左上角这个地方)。这个图上的黄点和绿点代表了气象观测站的位置。颜色代表了空气的品质指标,黄色代表比较差,绿色代表比较好。 ------------------------------------------------------------------------------------------------------------------------------------ 我们要大家做的事情,是预测某年某月某日N时的PM2.5。在测试数据集中,每一个要预测的时间点(比如2017年3月5号10时)都用一个ID来表示。共有240笔测试资料,也就是有240个时间点的PM2.5需要预测。我们用ID来表示一个时间点(并没有直接问具体哪个时间点的PM2.5,防止有的同学去政府网站上找真实的数据)。评价的标准就是,预测值与实际值的平方误差的平均值。
我们预测的根据,是要让机器根据观测站前9个小时观测到的数据去预测下一个时刻的PM2.5。也就是说呢,假设我们要预测第N时的PM2.5,那手上的数据是前9个时刻的PM2.5、CH4、NO、NO2... 我们用machine learning的方法来解,我们之前说过,machine learning的方法,就是找一个function,在这个task里面,他的output就是N时的PM2.5,他的input是前9个小时的观测数据。
------------------------------------------------------------------------------------------------------------------------------------ 我们看一下,测试数据长什么样子: 第一列是id,每一个id代表一个时间点(id_0代表一个时间点,比如2018年8月8日8时;id_1代表另一个时间点,比如2019年10月1日10时),图上红色框框里面就是一个时间点。我们要做的事情就是,用红色框框里面的数据来预测id_0这个时间点的PM2.5值。 第二列代表各种不同的指标。 接下来的9列数据,代表id_0这个时间点的前9个小时观测到的不同指标的值。比如,最后一列代表的是,N-1时观测到的值;倒数第二列代表,N-2时观测到的值;...。
------------------------------------------------------------------------------------------------------------------------------------ 那要怎么解这个问题呢? 我们之前说,machine learning 就是三个steps。 第一个step就是定义好你的function set,也就是设好你的model。输出y为N时的PM2.5的值。输入Xk,m表示前面第K个时刻,指标M的值。 step1里面,提示注意以下内容: 注意1. 在刚才的testing的表格里面,你可能发现说,某些指标不是数值,为NR。不是数值的话,你要怎么表示它呢?这个留给大家自己想,你可以做不同的尝试。比如说,rainfall为NR,要设成0还是设成-1?这个可以自己看。 注意2. 到底function set长什么样子,是要自己做多方尝试的。比如,你认为PM2.5只会跟过去的PM2.5的值有关,可以假设成下面的model: 再比如,你如果认为考虑前9个小时太多了,当前的PM2.5可能跟9个小时前的PM2.5没什么关系了,你可能写出下面的model: 再比如,你觉得当前的PM2.5不光跟过去的PM2.5有关,还与其他的指标相关,你可能写下面的model。至于跟哪个指标相关,你可以进行多方尝试。如果没有什么想法的话,你也可以把18种指标统统写进去。 你也可以加上正则化。要不要加,或者正则项的weight是多少,这个也是你自己决定的。
------------------------------------------------------------------------------------------------------------------------------------ machine learning的第二步,就是定义一个Loss function,根据你手上有的training data。 下面是我们提供给的,training data的样子。
第一列表示日期,训练集有2014年全年每个月前20天的数据。即:1.1~1.20、2.1~2.20、3.1~3.20、...、12.1~12.20。 第三列为不同的指标,共有18个指标。 后面24列为,为当天每个指标每个时间点观测到的值。比如,2014年1月1日0点,CO的值为0.51。
step2里面,提示注意以下内容: 注意1:训练时,你可能会用第0时到第8时的数据预测第9时的数据。但是这样还不够,还可以用第1时到第9时的数据预测第10时的数据,还可以用第2时到第10时的数据预测第11时的数据等等。一定要注意,千万不能只用第0到第8时的数据来预测第9时的数据,这样训练数据太少,不会得到好的结果。要充分利用training data中数据。 注意2:training data 来自于每个月的前20天,testing data来自于每个月的后10天。所以不会出现training data都来自于夏天、testing data都来自于冬天或者training data都来自于白天、testing data都来自于晚上这样的情况,导致预测出现问题。这里,training data和testing data的分布其实是比较一致的。 注意3:我们只给了大家training set,并没有帮大家 切好说要拿多少做validation,要那多少来做validation,请自己决定。你要切2比8或3比7都可以,请自己决定。还要注意一下,切的时候不要把白天的数据都当做training data,晚上的数据都当做validation data。这样validation data的结果就没有办法真正反映testing data的结果。所以切的时候要注意一下。
------------------------------------------------------------------------------------------------------------------------------------ 第三步就是找到一个最好的function。 要求,要用gradient descent来找出最好的function。当然有其他方法,但是希望练习的是gradient descent。 这里有一个建议,我们知道在做linear Regression的时候,你的error surface是convex的,不管你用的feature是什么样。 所以,他其实是有closed-form solution,学过线代的话,可以通过公式求出最佳解。虽然要求用gradient descent,不能用公式来求解。但是可以通过公式求的解来检查gradient descent的解是否OK。当我们昨晚gradient descent的时候,我们不知道做得好还是不好,这时候就可以用closed-form solution来check结果是不是正确的。看看他们是不是差太远,如果差太远的话,代表你的gradient descent 的实现在什么地方是有问题的,你再好好检查一下你的code或者你的learning rate或者加上一些adagrad等等的小技巧,让你的gradient descent的结果可以更好。
|