线性回归案例分析-预测PM2.5

作业说明

给定训练集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

上一篇:drf 自定制频率、接口文档、JWT


下一篇:接口示例