1.数据读取与整理
这部分数据看起来非常别扭,主要是因为不是单纯的二维或者三维数据。所以我们要先将数据变换一下:
两种做法:
1. 保留日期信息,将数据做成三维格式。这样看起来能够最大程度的保留信息,但实际上日期信息对我们来说似乎是无足轻重的,所以个人倾向于丢弃它,这就有了第二种做法
2. 丢弃日期信息,index改为1,2,3,4等序号,列名改为各种气象特征。
import numpy as np
import pandas as pd
data=pd.read_csv('train.csv')
data.drop(['ら戳','代'],axis=1,inplace=True)
column=data['代兜'].unique()
data_new=pd.DataFrame(np.zeros([24*240,18]),columns=column)
for i in column:
aa=data[data['代兜']==i]
aa.drop(['代兜'],axis=1,inplace=True)
aa=np.array(aa)
aa[aa=='NR']='0'
aa=aa.astype('float32')
aa=aa.reshape(1,5760)
aa=aa.T
data_new[i]=aa
label=np.array(data_new['PM2.5'][9:],dtype='float32')
2数据分析
在进行模型构建之前,我觉得应该先进行一波数据分析操作,最简单的,看看系数相关矩阵热力图:
可以看到,与PM2.5相关性较高的指标有PM10、NO2,NOx等。
import matplotlib.pyplot as plt
import seaborn as sns
# Draw a heatmap with the numeric values in each cell
f, ax = plt.subplots(figsize=(9, 6))
3.模型选择
3.1只使用PM2.5
直觉上,我们入门使用简单点的方法,用前九个小时的PM2.5去预测第十个小时的PM2.5.使用的模型很简单
注意,输入之前,我们会对x进行归一化处理,使用:
####模型1:只使用PM2.5指标
PM=data_new['PM2.5']
PM_mean=int(PM.mean())
PM_the=int(PM.var()**0.5)
PM=(PM-PM_mean)/PM_the
w=np.random.rand(1,10)
theta=0.1
m=len(label)
for i in range(100):
loss=0
i=i+1
gradient=0
for j in range(m):
x=np.array(PM[j:j+9])
x=np.insert(x,0,1)
error=label[j]-np.matmul(w,x)
loss+=error**2
gradient+=error*x
loss=loss/(2*m)
print(loss)
w=w+theta*gradient/m
输出之后发现loss大约是21.744左右
import numpy as np
import pandas as pd
data=pd.read_csv('train.csv')
data.drop(['ら戳','代'],axis=1,inplace=True)
column=data['代兜'].unique()
data_new=pd.DataFrame(np.zeros([24*240,18]),columns=column)
for i in column:
aa=data[data['代兜']==i]
aa.drop(['代兜'],axis=1,inplace=True)
aa=np.array(aa)
aa[aa=='NR']='0'
aa=aa.astype('float32')
aa=aa.reshape(1,5760)
aa=aa.T
data_new[i]=aa
label=np.array(data_new['PM2.5'][9:],dtype='float32')
'''
import matplotlib.pyplot as plt
import seaborn as sns
# Draw a heatmap with the numeric values in each cell
f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(data_new.corr(), fmt="d", linewidths=.5, ax=ax)
'''
####模型1:只使用PM2.5指标
PM=data_new['PM2.5']
PM_mean=int(PM.mean())
PM_the=int(PM.var()**0.5)
PM=(PM-PM_mean)/PM_the
w=np.random.rand(1,10)
theta=0.1
m=len(label)
for i in range(100):
loss=0
i=i+1
gradient=0
for j in range(m):
x=np.array(PM[j:j+9])
x=np.insert(x,0,1)
error=label[j]-np.matmul(w,x)
loss+=error**2
gradient+=error*x
loss=loss/(2*m)
print(loss)
w=w+theta*gradient/m