0、处理数据之前的pre-process
观察下载的数据文件train.csv
train.csv只有每个月前20天的数据,另外每个月剩下10天数据用于作业结果评估,对学生不可见
观察数据发现rainfall栏有很多NR表示没有降雨,但是我们只需要数字,因此可以使用excel的替换将NR替换为0,之后再进行处理

作业要求:前9小时作为训练集,第10小时的PM2.5作为实际结果,实际一共有18个特征——CH4、CO、CO2、NO等,但是这里我们只取相关性最高的PM2.5自身作为feature,实际如果对PM2.5的影响因素很了解,可以在另外的17个特征进行选取。

我们第一次取0 ~ 8时PM2.5作为训练集feature,9时PM2.5作为其label,第二次取1 ~ 9时作为feature,10时的PM2.5作为label…直至feature取到22时,label取到23时,一共features为(3600, 9)的矩阵,labels为(3600, 1)的矩阵

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltnp.set_printoptions(precision=3)  # 设置array显示精度,只能设置显示精度不能实际更改其数值精度
np.set_printoptions(suppress=True)  # 抑制小数的科学计数法显示df = pd.read_csv("HW1_data_1.csv")# 数据处理,数据集中包含18个特征,本次训练只使用PM2.5计算和预测
def dataprocess():# feature:feature_data = np.array(df.loc[:, "0":"22"]).reshape([240, 18, 23])  # 取所有行,首index"0"-"14", 尾index"14"-"22"feature = np.zeros((3600, 18, 9))  # 定义feature 容器for i in range(0, 15):feature[240 * i:240 * (i + 1)] = feature_data[:, :, i:9 + i]  # axis=0和1的所有值的每9小时为一组数据,取左不取右feature = feature[:, 9, :]  # 取所有维度的第9行,就是PM2.5的数值(240×15×9个PM2.5)# label:# 9时到23时所有特征数据(包含PM2.5在内所有特征量),因为loc无法操作细致切片,先转成array再切# 只取PM2.5的数据用作预测,所以取[:, 9]240×18每18个中的第10个特征label_data = np.array(df.loc[:, "9":"23"]).reshape([240, 18, 15])[:, 9]label = label_data.reshape(3600, 1)return feature, labelclass Regression:def gradientdescent(self, x, y, epoch=1000, l=10, reg_rate=0.001):'''初始化误差bias:3600个; 初始化weight:9个; 手动调整学习次数epoch; 手动调整学习率l,reg_rate正则化的系数'''n = len(x)  # 实例个数n=3600weights = np.random.randn(x.shape[1], 1)  # y.shape[0]行,1列的数,这些数从均值为0,方差为1的正态分布中生成用来初始化wbiases = np.random.randn(y.shape[0], 1)  # 同样初始化b# biases = np.zeros((y.shape[0], 1))  # 所有的bias都是相同的# 将x*weights+biases变形成X_new*theta,一起更新,同时便于cost求导X_new = np.ones((x.shape[0], x.shape[1] + 1))  # 定义X_new,比x多一列,第一列全为1,后面的列为xX_new[:, 1:] = x  # (3600, 10),除了第一列是1,后面就是就是和x值一样theta = np.full((weights.shape[0] + 1, weights.shape[1]), biases[0])  # 创建比weight多一行的矩阵theta[1:, ] = weights  # 除了第一行是biases的值,后面9行都是weightgrad_sum = np.zeros(theta.shape)# print("weights:", weights.shape, "biases:", biases.shape)  # weights: (9, 1) biases: (3600, 1)# print("X_new:", X_new.shape, "theta:", theta.shape)  # X_new:(3600, 10)  theta: (10, 1)# print(f"theta{theta},和weights{weights}{theta[1:]==weights}")for i in range(epoch):# 第一步:y = w1x1+w2x2+...+w9x9 + b1,一共3600次向量相乘算出初步的预测值a,然后慢慢优化# y_hat = np.dot(x, weights) + biases   # 先x后weights避免shape对应不上y_hat1 = np.dot(X_new, theta)   # 等同于xw+bloss = y_hat1 - y# Adagrad更新θ(权重和偏向)# 这里grad是每一次的梯度,而grad_sum是所有之前的梯度之和grad = 2 * (X_new.transpose().dot(loss))grad_sum += grad ** 2theta -= l * grad / np.sqrt(grad_sum)# cost函数cost = (1 / (2 * n)) * np.linalg.norm(loss)  # np.linalg.norm是numpy自带的欧氏距离计算方法# cost = (1/(2*n))*np.sqrt(np.sum(np.square(y - y_hat)))  # 这个是直接数学运算求向量的欧氏距离,系数是1/(2*n)if (i + 1) % 100 == 0:print(f"经过第{i+1}次训练,cost变为:{cost}")print(f"经过第{i + 1}次训练,y_hat1均值:{round(np.sum(y_hat1)/3600, 4)}与y均值:{round(np.sum(y)/3600, 4)}"f"之差loss平均差变为:{np.sum(loss) / 3600}")print(f"经过第{i + 1}次训练,本次梯度grad变为:{np.sum(grad)/3600}")DP = dataprocess()
R = Regression()
R.gradientdescent(DP[0], DP[1])

输出结果:

经过第100次训练,cost变为:0.17832930592812254
经过第200次训练,cost变为:0.1660618393695226
经过第300次训练,cost变为:0.15927505672924216
经过第400次训练,cost变为:0.15489108318605818
经过第500次训练,cost变为:0.15184467687762343
经过第600次训练,cost变为:0.14964991588379611
经过第700次训练,cost变为:0.14804105402447518
经过第800次训练,cost变为:0.14685216677724566
经过第900次训练,cost变为:0.14597040063815991
经过第1000次训练,cost变为:0.14531528068944696
经过第100次训练,y_hat1均值:17.8139与y均值:24.0569之差平均差loss变为:-6.24304257009874
经过第200次训练,y_hat1均值:18.653与y均值:24.0569之差平均差loss变为:-5.403915186992251
经过第300次训练,y_hat1均值:19.4186与y均值:24.0569之差平均差loss变为:-4.638329558163197
经过第400次训练,y_hat1均值:20.0769与y均值:24.0569之差平均差loss变为:-3.9800706681641165
经过第500次训练,y_hat1均值:20.6393与y均值:24.0569之差平均差loss变为:-3.417681572977715
经过第600次训练,y_hat1均值:21.12与y均值:24.0569之差平均差loss变为:-2.9369228516813766
经过第700次训练,y_hat1均值:21.5316与y均值:24.0569之差平均差loss变为:-2.5253134626240024
经过第800次训练,y_hat1均值:21.8845与y均值:24.0569之差平均差loss变为:-2.172397192822715
经过第900次训练,y_hat1均值:22.1875与y均值:24.0569之差平均差loss变为:-1.8694547147842282
经过第1000次训练,y_hat1均值:22.4478与y均值:24.0569之差平均差loss变为:-1.609182858159369
经过第100次训练,本次梯度grad变为:0.15936844318025478
经过第200次训练,本次梯度grad变为:0.05629405865738792
经过第300次训练,本次梯度grad变为:0.03547007720060113
经过第400次训练,本次梯度grad变为:0.025188272217026478
经过第500次训练,本次梯度grad变为:0.01861384588607305
经过第600次训练,本次梯度grad变为:0.014144000392948834
经过第700次训练,本次梯度grad变为:0.011006343985549796
经过第800次训练,本次梯度grad变为:0.008740552807814514
经过第900次训练,本次梯度grad变为:0.0070594976666507134
经过第1000次训练,本次梯度grad变为:0.005780481608253467

这里还没有使用交叉熵验证和正则化,数据差异却非常小,错误之处谢谢指出。
公式推导:
Regression_PM2.5
课程地址:
李宏毅老师机器学习教学网站

李宏毅老师ML_HW1——PM2.5预测相关推荐

  1. 李宏毅ML作业笔记1: 预测PM2.5(kaggle预测与报告题目)

    作业笔记被我手贱删了, 只能凭回忆重新总结个简洁版本的 我用的是kaggle提供的在线notebook, 代码与部分思路公开在: https://www.kaggle.com/laugoon/home ...

  2. 百度飞桨2021李宏毅机器学习特训营学习笔记之回归及作业PM2.5预测

    百度飞桨2021李宏毅机器学习特训营学习笔记之回归及作业PM2.5预测 前言 回归 什么是回归(Regression)? 怎么做回归? 线性回归(Linear Regression) 训练集与验证集 ...

  3. 李宏毅《机器学习》飞桨特训营(二)——回归(含作业:PM2.5预测)

    李宏毅<机器学习>飞桨特训营(二) 一. 回归-案例学习 二. 回归-演示 三. 误差从何而来? 3.1 误差的来源 3.2 误差出现的原因 3.3 欠拟合与过拟合 3.4 如何减小误差? ...

  4. 李宏毅老师官方授权!《李宏毅机器学习特训营》发布,放心免费学!

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 AlphaGo战胜"石神"李世石,人工智能开始闯进大众的视野,机器学习成为同学入门人工智 ...

  5. 李宏毅老师机器学习第二部分:回归问题

    李宏毅老师机器学习第二部分:回归问题 Let's go! 一.回归的定义 二.回归模型建立步骤 三.一元线性模型与多元线性模型 3.1 一元线性模型 3.2 多元线性模型 四.模型评估 4.1 损失函 ...

  6. 李宏毅老师《机器学习》课程笔记-5 Transformer

    注:本文是我学习李宏毅老师<机器学习>课程 2021/2022 的笔记(课程网站 ),文中图片除一张来自 transformer论文,其余均来自课程 PPT.欢迎交流和多多指教,谢谢! L ...

  7. 李宏毅老师《机器学习》课程笔记-3卷积神经网络

    注:本文是我学习李宏毅老师<机器学习>课程 2021/2022 的笔记(课程网站 ),文中图片除了一幅我自己绘制的图和一幅来自 Stanford cs231n 教程的图,其余图片均来自课程 ...

  8. 李宏毅老师《机器学习》课程笔记-2.1模型训练技巧

    注:本文是我学习李宏毅老师<机器学习>课程 2021/2022 的笔记(课程网站 ),文中图片除了两幅是我自己绘制外,其余图片均来自课程 PPT.欢迎交流和多多指教,谢谢! 文章目录 Le ...

  9. 李宏毅老师《机器学习》课程笔记-4.1 Self-attention

    注:本文是我学习李宏毅老师<机器学习>课程 2021/2022 的笔记(课程网站 ),文中有一张图片来自于 The Illustrated Transformer ,其余图片均来自课程 P ...

最新文章

  1. 21 window对象常见事件
  2. VMware网络配置详解
  3. Data Mining的十种分析方法
  4. schedule vs scheduleAtFixedRate
  5. 在statspack显示完整的SQL
  6. 鸿蒙手机是个噱头,华为鸿蒙不是谈判噱头 必要时会应用手机当中!
  7. 【 全干货 】5 分钟带你看懂 Docker ! 1
  8. boost serialization 运行错误_boost c++之事件处理
  9. lua与python结合_从Python到Lua
  10. impala查询数据与hive的查询数据比对(数据的校验)
  11. markdown_Latex各种符号
  12. Linux使用cups进行打印
  13. win10如何调整计算机时间同步,win10电脑时间与Internet同步的设置方法
  14. ContextCapture数据处理及电脑配置常见问题汇总
  15. ISO9000、CMM(I)、6sigma与对象分析技术
  16. 24点游戏(python)
  17. PS解决“无法使用快速选择,因为没有足够内存(RAM)”
  18. android平台开发板外接罗技C525摄像头不支持扫码有什么办法解决
  19. 让宝妈当“团长”卖菜给街坊,社区团购会诞生下一个拼多多吗?
  20. 基于单片机的红外遥控密码锁系统设计(#0407)

热门文章

  1. TCP如何利用不可靠的IP协议实现可靠传输
  2. java开发计算机考试服务器_2011计算机二级JAVA编程:取得服务器当前的各种具体时间...
  3. python线程状态_Python线程
  4. rabbitmq接口异常函数方法_RabbitMQ监控(三):监控队列状态
  5. Java笔记11-软件开发流程设计原则
  6. Deepin下java开发环境部署
  7. Djang重新整理migrations,解决:Django Table xxx already exist
  8. 8数据提供什么掩膜产品_博硕能为你提供什么产品?
  9. bat循环执行带参数_C++:main处理命令行选项/main函数的参数
  10. 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?