作业说明
给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量。
训练集介绍:
(1)、CSV文件,包含*丰原地区240天的气象观测资料(取每个月前20天的数据做训练集,12月X20天=240天,每月后10天数据用于测试,对学生不可见);
(2)、每天的监测时间点为0时,1时…到23时,共24个时间节点;
(3)、每天的检测指标包括CO、NO、PM2.5、PM10等气体浓度,是否降雨、刮风等气象信息,共计18项;
(4)、数据集地址:https://pan.baidu.com/s/1o2Yx42dZBJZFZqCa5y3WzQ,提取码:qgtm。
注意用notepad++打开 否则会乱码
源码:
import pandas as pd
import numpy as np
#数据预处理
def dataProcess(df):
#x_list,y_list分别为feature和label
x_list,y_list = [],[]
#没有数据的地方补0
df = df.replace(['NR'],[0.0])
#转换为numpy数组
array = np.array(df).astype(float)
#数据集拆分为训练集和测试集
for i in range(0,4320,18):
for j in range(24-9):
#18个有关特征,间隔九小时为一次feature
x_t = array[i:i+18,j:j+9]
#第10个指标为pm2.5,对应第十个小时为label
y_t = array[i+9,j+9]
#每次都插入到训练集和测试机
x_list.append(x_t)
y_list.append(y_t)
x = np.array(x_list)
y = np.array(y_list)
#转换为numpy数组返回
return x,y,array
def train(x_train,y_train,epoch):
#偏执值
bias = 0.0
#权重
weights = np.ones(9)
#学习率
learning_rate_bias = 1
learning_rate_weights = 1
#正则率
reg_rate = 0.001
#偏执值的平方和
b_sum = 0
#权重的平方和
w_sum = np.zeros(9)
#epoch为训练次数
for e in range(epoch):
#偏置值梯度
b = 0
#权重值梯度
w = np.zeros(9)
for i in range(3200):
b += (y_train[i]-weights.dot(x_train[i,9,:])-bias)*(-1)
for j in range(9):
w[j] +=(y_train[i]-weights.dot(x_train[i,9,:])-bias)*(-x_train[i,9,j])
for i in range(9):
w[i] += reg_rate*(w[i])
b /= 3200
w /= 3200
b_sum += b**2
w_sum += w**2
#偏置值更新
bias = bias - (learning_rate_bias/(b_sum**0.5))*b
#权重值更新
weights = weights -(learning_rate_weights/(w_sum**0.5))*w
#下面两行按照公式的方法更新学习率不知为何导致学习率直接降为0 有待继续研究
# learning_rate_bias = learning_rate_bias/(b_sum**0.5)
# learning_rate_weights = learning_rate_weights/(w_sum**0.5)
#每训练200轮,输出训练效果:
if(e%200==0):
loss = 0
for i in range(3200):
loss += (y_train[i]-weights.dot(x_train[i,9,:])-bias)**2
print(e)
print('训练工程中损失:',loss/3200)
return weights,bias
def check(x_val,y_val,weights,bias):
loss = 0
for i in range(400):
loss += (y_val[i]-weights.dot(x_val[i,9,:])-bias)**2
return loss/400
def main1():
#观察数据截取[3-26]列的数据是有用得数据
df = pd.read_csv('train.csv',usecols=range(3,27))
x,y,_ = dataProcess(df)
#训练集得截取
x_train,y_train = x[0:3200],y[0:3200]
#测试值得截取
x_val,y_val = x[3200:3600],y[3200:3600]
epoch = 2000
#开始训练
w,b = train(x_train,y_train,epoch)
#训练结束后算损失并输出最终得训练结果
loss = check(x_val,y_val,w,b)
print('训练2000轮后最终的损失:',loss)
if __name__ == '__main__':
main1()
训练结果:
0
训练工程中损失: 955.3009375
200
训练工程中损失: 49.86809717796437
400
训练工程中损失: 46.20086653422761
600
训练工程中损失: 44.88898286527247
800
训练工程中损失: 44.2688932142283
1000
训练工程中损失: 43.94997761843127
1200
训练工程中损失: 43.78081013521727
1400
训练工程中损失: 43.689726585603765
1600
训练工程中损失: 43.64023211743175
1800
训练工程中损失: 43.613159117601505
训练2000轮后最终的损失: 40.353623028655626