思考:
- 如何处理原始数据,空值?无意义列?数据归一化?异常值?
- 时序数据预测问题的数据格式如何构造(X,Y);
- 如何使用LSTM来预测时序数据(输入输出?多加几成lstm注意什么?return_sequences=True?);
- 如何用模型预测?生成结果注意什么?反归一化再进行比较。
- 归(反归)一化注意什么?
- 模型参数如何调整?例如:学习率如何调整?
1.使用lstm进行空气污染预测介绍
- 采用空气质量数据集。数据来源自位于北京的美国大使馆在2010年至2014年共5年间每小时采集的天气及空气污染指数。
- 目的:利用前一个或几个小时的天气条件和污染数据预测下一个(当前)时刻/(或者后几个时刻的数据)的污染程度(预测PM2.5浓度)(本文示例用前五个时刻的数据预测后五个时刻的数据)
- 原始数据如下:
1.No 行数 2.year 年 3.month 月 4.day 日 5.hour 小时 6.pm2.5 PM2.5浓度 7.DEWP 露点 8.TEMP 温度 9.PRES 大气压 10.cbwd 风向 11.lws 风速 12.ls 累积雪量 13.lr 累积雨量
2.数据预处理
1. 数据清洗
- 将日期(年月日时)合并为一个日期,并作为表的索引
- 删除没有意义的NO列
- 为列名重起好理解的名字
- 空值处理(NA),充填0
- 观察到2010年1月1日pm2.5为NA,将该天数据删除
- 形成一个新表
导入包
#导入用到的包
import pandas as pd
from datetime import datetime
from matplotlib import pyplot
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
from sklearn.metrics import mean_squared_error
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM, Dropout
from numpy import concatenate
from math import sqrt
from keras.callbacks import ReduceLROnPlateau
数据清洗(详细注释):
def parse(x):
return datetime.strptime(x, '%Y %m %d %H')
def read_raw():
dataset = pd.read_csv('raw.csv', parse_dates=[['year', 'month', 'day', 'hour']], index_col=0, date_parser=parse) #将日期合并
dataset.drop('No', axis=1, inplace=True) #删除no列(无意义)
# manually specify column names
dataset.columns = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain'] #给每列换个好理解的名
dataset.index.name = 'date' #行的索引名为name,解析得到的日期格式列会作为DataFrame的第一列。则此时会以新生成的time_date列而不是name作为Index。因此保险的方法是指定列名,如index_col = 'name'
# mark all NA values with 0
dataset['pollution'].fillna(0, inplace=True)
# drop the first 24 hours
dataset = dataset[24:] #删除第一天的数据,取列表24行之后的数据
# summarize first 5 rows
print(dataset.head(5))
# save to file
dataset.to_csv('pollution.csv')
形成的数据格式:
2.对每列数据进行绘图观测(5年数据),除了日期。
绘图代码:
def drow_pollution():
dataset = pd.read_csv('pollution.csv', header=0, index_col=0)
values = dataset.values