文章目录

  • 一、问题描述
  • 二、设计简要描述
  • 三、程序清单
  • 四、结果分析
  • 五、调试报告
  • 六、实验总结

一、问题描述

希望用线性回归解决问题:
给定某个地区连续9小时包括PM2.5在内的18项污染物每小时的数据,预测第10个小时的PM2.5的值。

二、设计简要描述

机器学习的三个基本步骤——

程序设计思路——

三、程序清单

import pandas as pd
import numpy as np# 1 训练集处理
# 1.1 读取训练集数据,big5是针对于文档中存在繁体字的编码
train_data = pd.read_csv('./train.csv', usecols=range(2, 27), encoding='big5')  # 2~27,从测项到最后一小时数据
row = train_data['測項'].unique()  # 得到的row是一个list,存放了各个污染物的名字# 1.2训练数据规整化
# 定义18维空列表,每一个维度处理一种污染物
# DataFrame是一个二维表格,让它有18行,24*240列(240=12个月x每个月前20天)
new_train_data = pd.DataFrame(np.zeros([18, 24 * 240]))
# 计算维度?
n = 0
# 遍历18类污染物,将数据处理为 [18, 24*240]
for i in row:# 依照污染物名取出相同的行train_data1 = train_data[train_data['測項'] == i]  # 得到的train_data1是一个二维表格,每一行是一天24小时某项污染物的值,共240天# 删去多出的“测项”那一列(存放污染物的名字)train_data1.drop(['測項'], axis=1, inplace=True)# 格式处理,赋值到 new_train_datatrain_data1 = np.array(train_data1)  # 刚刚的二维表格依然是二维表格,只不过可以处理了train_data1[train_data1 == 'NR'] = '0'  # 将降雨量NR替换为0train_data1 = train_data1.astype('float')# 24*240=5760# 二维列表原先包含240个含24个元素的一维列表,现在包含5760个含1个元素的一维列表train_data1 = train_data1.reshape(5760, 1)# 进行转置,二维列表现在包含1个含5760个元素的一维列表train_data1 = train_data1.T# 将刚刚在一起的5760个相同污染物的量存放进预先设定好的DataFrame的一行new_train_data.loc[n] = train_data1# 下一类污染物处理n += 1# 可以将现在的new_train_data和train_array看成是包含18个含5760个元素的二维表格
train_array = np.array(new_train_data).astype(float)# 1.3 处理训练集
# 训练样本features集合
X_train = []
# 训练样本目标PM2.5集合
y_train = []
for i in range(new_train_data.shape[1] - 9):# 每次取9个小时的数据作训练集# 每次数据遍历每行前9个数据,全部加入到训练集中,18 X 9X_temp = np.ones(18 * 9)# 记录count = 0  # count的取值是0~161(18*9=162)for j in range(18):x = train_array[j, i:i + 9]for k in range(9):X_temp[count] = x[k]count += 1# 将样本分别存入X_train中X_train.append(X_temp)# 取本次第10个小时的 PM2.5 的值作为训练的真实值y = int(train_array[9, i + 9])  # 第一个9是PM2.5,第二个+9是找到第十个小时# 将样本分别存入X_train、y_train中y_train.append(y)
X_train = np.array(X_train)  # X_train里面是由5751个含有172个元素的一维列表组成的二维列表
y_train = np.array(y_train)  # X_train里面是由5751个含有1个元素的一维列表组成的二维列表# 2.训练模型
# 训练轮数
epoch = 1000(第一次)
epoch = 2000(第二次)
# 开始训练
# 更新参数,训练模型
# 偏置值初始化
bias = 0
# 权重初始化
weights = np.ones(18 * 9)
# 初始学习率
learning_rate = 1
# 用于存放偏置值的梯度平方和
bg2_sum = 0
# 用于存放权重的梯度平方和
wg2_sum = np.zeros(18 * 9)for i in range(epoch):b_g = 0w_g = np.zeros(18 * 9)# 在所有数据上计算Loss_label的梯度for j in range(len(X_train)):# weights.dot(X_train[j])是172个权重和对应的输入x相乘(dot的本意是点乘)b_g += (y_train[j] - weights.dot(X_train[j]) - bias) * (-1)for k in range(18 * 9):w_g[k] += (y_train[j] - weights.dot(X_train[j]) - bias) * (-X_train[j, k])# 求平均b_g /= len(X_train)  # 这个数字是5751w_g /= len(X_train)# adagradbg2_sum += b_g ** 2wg2_sum += w_g ** 2# 更新权重和偏置bias -= learning_rate / bg2_sum ** 0.5 * b_gweights -= learning_rate / wg2_sum ** 0.5 * w_g# 每训练10轮,输出一次在训练集上的损失if i % 10 == 0:loss = 0for j in range(len(X_train)):loss += (y_train[j] - weights.dot(X_train[j]) - bias) ** 2print('经过{}轮训练,训练集上的损失值为:'.format(i), loss / len(X_train))# 测试机处理
# 3.1读取测试数据
test_data = pd.read_csv('./train2.csv', usecols=range(2, 27), encoding='big5')  # 用train的最后三个月作为test 3242-4321
row2 = test_data['測項'].unique()
# 3.2 测试数据规整化
new_test_data = pd.DataFrame(np.zeros([18, 24 * 60]))
# 计算维度
m = 0
# 遍历18类污染物,将数据处理为[18,24*60]
for i in row2:# 依照污染物名字取出相同的行test_data1 = test_data[test_data['測項'] == i]# 删去多出的“测项”那一列test_data1.drop(["測項"], axis=1, inplace=True)# 格式处理,赋值到new_train_datatest_data1 = np.array(test_data1)test_data1[test_data1 == "NR"] = "0"test_data1 = test_data1.astype("float")# 24*60=1440# 二维列表原先包含60个含24个元素的一维列表,现在包含1440个含1个元素的二维列表test_data1 = test_data1.reshape(1440, 1)# 转置test_data1 = test_data1.T# 将刚刚在一起的1440个相同污染物的量存放进预先设定好的new_test_data的一行new_test_data.loc[m] = test_data1# 下一类污染物处理m += 1
# 现在可以将new_test_data和test_array看成史包含18个含有1440个元素的二维表格
test_array = np.array(new_test_data).astype(float)
# 3.3 处理测试集
# 测试样本features集合
X_test = []  # 二维列表
# 测试样本PM2.5集合
y_test = []  # 一维列表
for i in range(new_test_data.shape[1] - 9):# 每次取9个小时的数据做测试集的输入# 每次数据遍历每行前9个数据,全部加入到测试集中,18x9X_temp = np.ones(18 * 9)# 记录count = 0for j in range(18):x = test_array[j, i:i + 9]for k in range(9):X_temp[count] = x[k]count += 1# 将样本分别存入X_test中X_test.append(X_temp)# 取本次第十个小时的PM2.5值作为测试的真实值y = int(test_array[9, i + 9])# 将样本存入y_test中y_test.append(y)
X_test = np.array(X_test)
y_test = np.array(y_test)# 4.测试训练好的模型
loss = 0
for i in range(len(X_test)):loss += (y_test[i] - weights.dot(X_test[i]) - bias) ** 2
print('测试集上的损失值为:', loss / len(X_test))

四、结果分析

  1. 训练轮数为1000时,在测试集上的损失函数结果为7.208519807515013
  2. 训练轮数为2000时,在测试集上的损失函数结果为测试集上的损失值为: 6.622474294012304

    分析 :从训练集和测试集上的损失值相近可知过程无误,但结果不是特别理想,可能原因有:处理训练集时把每一天的数据连在一起,增大了利用率,但未考虑到train.csv的数据是截取的每个月前20天的,也就是连接的过程把上个月的第二十天跟下个月第一天连在一起了,这是不合理的。
    weights是一个18*9=162维的向量,参数太多,可能过拟合了。

五、调试报告

  1. 数据集的编码方式一定要注意,如果pycharm一开始显示不出数据集编码方式,可以先用notepad++打开数据集,查看其编码方式。
  2. 阅读实验指导书上的代码时难以理解,可以通过确定数字的最大值来解决,例如这一段
count = 0
for j in range(18):
x = train_array[j, i:i + 9]for k in range(9):X_temp[count] = x[k]count += 1

起初无法理解X_temp是什么形状,但看到count经过两轮循环,数值变化范围是0~18*9。可知X_temp是把18项数据在9个小时里的连续值进行了首尾拼接,便于后续与权重72维向量相乘。
3. 打桩调试
训练轮数太多,想确定程序执行到哪一步了,可以对在一些数值处进行输出。例如

# 每训练10轮,输出一次在训练集上的损失
if i % 10 == 0:loss = 0for j in range(len(X_train)):loss += (y_train[j] - weights.dot(X_train[j]) - bias) ** 2
print('经过{}轮训练,训练集上的损失值为:'.format(i), loss / len(X_train))

六、实验总结

  1. 学到了一些数据处理知识
    ① .astype(‘float’)将数据转化为浮点型
    ② 对数据进行转置 train_data1 = train_data1.T
    ③ 根据列名得到表格中的某一项数据
    row = train_data[‘測項’].unique()
    ④ 删除某一列数据train_data1.drop([‘測項’], axis=1, inplace=True)
  2. 需要改进的地方
    ① 对测试集和验证集(后三个月)的处理出现大量的重复代码,应该编写函数,但是对于Python掌握还不够,遂放弃
    ② 把每天的数据连在一起增加了数据的利用率,但是每个月的应该分开
    ③ 采用前9个小时18项数据,权重作为一个72维的向量,参数过多,增加了训练成本,并且容易过拟合

线性回归预测PM2.5值相关推荐

  1. python线性回归预测pm2.5_李宏毅 线性回归预测PM2.5

    作业说明 给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量. 训练集介绍: (1):CSV文件,包含台湾丰原地区240天的气象观测资料(取每个月前20天的 ...

  2. python线性回归预测pm2.5_线性回归预测PM2.5----台大李宏毅机器学习作业1(HW1)

    一.作业说明 给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量. 训练集介绍: (1).CSV文件,包含台湾丰原地区240天的气象观测资料(取每个月前20 ...

  3. python线性回归预测pm2.5_李洪义——机器学习作业——1-线性回归:预测PM2.5,李宏毅,1LinearRegression,PM25...

    1-Linear Regression:预测PM2.5 注意 :这篇博客的任何操作是在已经下载好Python的前提下,如果还没有下载Python,可以参考以下链接下载Python https://bl ...

  4. python线性回归预测pm2.5_线性回归--PM2.5预测--李宏毅机器学习

    一.说明 给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量. 训练集介绍: (1).CSV文件,包含台湾丰原地区240天的气象观测资料(取每个月前20天的 ...

  5. python线性回归预测pm2.5_基于随机森林算法的PM2.5预测

    空气质量指数(AQI)是衡量空气质量好坏的重要指数,它是依据空气中污染物浓度的高低来判断的. 但是因为空气污染本身是一个较为复杂的现象,来自固定和流动污染源的人为污染物排放大小是影响空气质量的最主要因 ...

  6. 线性回归预测PM2.5

    一.题目: 二.代码 import csv import numpy as np# 处理训练数据,得到train_x,train_y # 其中,train_x(12×471,18×9),train_y ...

  7. python预测股票价格_python用线性回归预测股票价格

    原标题:python用线性回归预测股票价格 线性回归在整个财务中广泛应用于众多应用程序中.在之前的教程中,我们使用普通最小二乘法(OLS)计算了公司的beta与相对索引的比较.现在,我们将使用线性回归 ...

  8. 大数据线性回归预测学生成绩

    通过训练集训练和测试集测试来生成多个线性模型,从而预测学生成绩,本文所有代码请点击Github 1. 实验数据背景 1.1 数据来源 本项目的数据来源于kaggle.com,数据集的名称为Studen ...

  9. 机器学习:使用scikit-learn的线性回归预测Google股票

    这是机器学习系列的第一篇文章. 本文将使用Python及scikit-learn的线性回归预测Google的股票走势.请千万别期望这个示例能够让你成为股票高手.下面按逐步介绍如何进行实践. 准备数据 ...

最新文章

  1. linux+cp+吃内存怎么办,Linux吃掉了我的内存
  2. 初学者学python好还是c-入门是不是应该选择C而不是直接学Python?
  3. AI监测分析课堂背后的旷视科技:清华学霸创立,半年亏损52亿
  4. 二叉搜索树C++(VS2017)
  5. DM8168学习--内存烧写位置
  6. 第二个spring冲刺总结
  7. 《软件项目管理(第二版)》第 10 章——项目收尾 重点部分总结
  8. 浅谈浏览器端JavaScript跨域解决方法
  9. 超级电容怎么才能把内阻做小_超级电容器内阻测定方法
  10. 友情检测北京某大学网站
  11. 平面设计素材|黑白海报设计,暗黑潮流
  12. Excel 2016图表标题不能输入中文,图表一直闪动
  13. k8s集群部署中etcd启动报错request sent was ignored (cluster ID mismatch: peer[c39bdec535db1fd5]=cdf818194e3a8c
  14. 使用Android的Service实现后台定时检测并重启应用
  15. 软件开发工程师转正申请书
  16. 易语言连接mysql学习_[易语言]连接MYSQL数据库学习
  17. 如何快速编译android,MTKandroid快速编译方法.doc
  18. USB PC to PC通讯、USB互联线API简介.doc
  19. csdn搬迁至博客园
  20. Unicode对汉字的编码 1

热门文章

  1. php 4 创建公共的链接数据库php文件并在其它文件引用它
  2. 【微信小程序】侧滑栏,手动侧滑出个人中心(完整代码附效果图)
  3. C#反射使用时注意BindingFlags的用法(转载)
  4. 理解 CSS 布局和块级格式上下文
  5. Windows Server 2012关闭Server Manager开机自启动
  6. mysql高可用之MMM
  7. Fragment 和 FragmentActivity的使用
  8. Oracle 10g配置RMAN RECOVERY CATALOG
  9. Swift 中使用 SQLite——批量更新(事务处理)
  10. Google I/O 2017 大会时间表出炉:安卓 8.0 时代来临