问题描述

背景:

虽然细颗粒物只是地球大气成分中含量很少的组分,但它对空气质量和能见度等有重要的影响。与较粗的大气颗粒物相比,细颗粒物粒径小,富含大量的有毒、有害物质且在大气中的停留时间长、输送距离远,因而对人体健康和大气环境质量的影响更大。研究表明,颗粒越小对人体健康的危害越大。细颗粒物能飘到较远的地方,因此影响范围较大。

细颗粒物对人体健康的危害要更大,因为直径越小,进入呼吸道的部位越深。10μm直径的颗粒物通常沉积在上呼吸道,2μm以下的可深入到细支气管和肺泡。细颗粒物进入人体到肺泡后,直接影响肺的通气功能,使机体容易处在缺氧状态。

已经有大量流行病学证据表明,PM2.5有急性与慢性健康效应。急性健康效应体现在高PM2.5暴露增加患急性呼吸道疾病与心脑血管疾病的风险,慢性毒性体现在PM2.5可能诱发肺癌、COPD(慢性阻塞型肺炎)、心脑血管疾病等慢性疾病,也有研究表明对细颗粒物的暴露会影响人的免疫系统、神经系统等。

问题:

PM2.5粒径小,富含大量的有毒、有害物质且在大气中的停留时间长、输送距离远,因而对人体健康和大气环境质量的影响更大。所以如果能做到对PM2.5实时且准确的预测,那么就可以为人们的日常出行提供一些注意事项,该不该出门?出门应该准备什么?

有关数据

收集数据及数据来源

在机器学习平台Kaggle上下载中国2010-2015年五大城市的PM2.5数据集

样本名称

成都市草堂寺2010年1月1日至2015年12月31日的PM2.5的记录值

确定样本属性,所有属性名称以及每个属性取值范围

  1. 样本属性有:

    1. PM2.5平均值标准值:对于数据表中的PM_Caotangsi
    2. 季节:对于数据表中的season
    3. 露点(摄氏温度):对于数据表中的DEWP
    4. 温度(摄氏温度):对于数据表中的TEMP
    5. 湿度(%):对于数据表中的HUMI
    6. 压力(hPa):对于数据表中的PRES
    7. 组合风向:对于数据表中的cbwd
    8. 累积风速(m / s):对于数据表中的Iws
  2. 对于PM2.5的值有如下:

    空气质量等级 24小时PM2.5平均值标准值 值转换
    0~35 1
    35~75 2
    轻度污染 75~115 3
    中度污染 115~150 4
    重度污染 150~250 5
    严重污染 大于250及以上 6
  3. 对于组合风向的值有如下:

    风向 值转换
    cv 1
    NE 2
    NW 3
    SE 4
    SW 5
  4. 对于季节:

    取值范围1,2,3,4

  5. 对于露点:

    取值范围[-16,28]

  6. 对于温度(摄氏温度):

    取值范围[-2,38]

  7. 对于湿度(%):

    取值范围[12.78,100]

  8. 对于压力(hPa):

    取值范围[991,1041]

  9. 对于累积风速(m / s):

    取值范围[0,93]

样本数量

原始样本数量52583个,经处理去掉无效值共有21074 个

样本标记名称以及取值范围;

样本标记为PM2.5的值所代表的的等级对应转换的值,如下表:

空气质量等级 24小时PM2.5平均值标准值 值转换
0~35 1
35~75 2
轻度污染 75~115 3
中度污染 115~150 4
重度污染 150~250 5
严重污染 大于250及以上 6

数据处理

  1. 对原始数据进行处理

    在csv表格中将PM2.5及组合风向的值进行转换

  2. 获取数据进行处理

    # 1.从ChengduPM20100101_20151231.csv中读取训练数据
    data = pd.read_csv('./ChengduPM20100101_20151231.csv')
    # 2.通过.dropna(how='any')函数去除掉无效值
    data = data.iloc[:,1:].dropna(how='any')
    # 3.获取样本属性值 并转换为NumPy数组
    season = data['season']
    data1 = data.iloc[:,8:14]
    data1['season'] = season
    data1 = data1.to_numpy()
    # 4.获取样本标记值 并转换为NumPy数组
    PM_Caotangsi = data['PM_Caotangsi']
    PM_Caotangsi = PM_Caotangsi.to_numpy()
    # 5.通过train_test_split()划分训练集测试集
    X_train, X_test, y_train, y_test = train_test_split(data1, PM_Caotangsi, test_size=0.12, random_state=12)
    

设计模型,训练模型

第一个决策树分类

最初模型
# 导入必要的模块
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier# 数据处理
# 1.从ChengduPM20100101_20151231.csv中读取训练数据
data = pd.read_csv('./ChengduPM20100101_20151231.csv')
# 2.通过.dropna(how='any')函数去除掉无效值
data = data.iloc[:,1:].dropna(how='any')
# 3.获取样本属性值 并转换为NumPy数组
season = data['season']
data1 = data.iloc[:,8:14]
data1['season'] = season
data1 = data1.to_numpy()
# 4.获取样本标记值 并转换为NumPy数组
PM_Caotangsi = data['PM_Caotangsi']
PM_Caotangsi = PM_Caotangsi.to_numpy()
# 5.通过train_test_split()划分训练集测试集
X_train, X_test, y_train, y_test = train_test_split(data1, PM_Caotangsi, test_size=0.12, random_state=12)# 建立模型
clf = DecisionTreeClassifier(criterion='entropy')
# 训练模型
clf.fit(X_train,y_train)
# 评分
clf.score(X_test,y_test)
Out[50]: 0.4638196915776987
修改模型
# 获取原始模型决策树深度
d=clf.get_depth()
# 建立新模型 最大深度和原始深度d一样  最小叶节点为d-14
model= DecisionTreeClassifier(criterion='entropy',max_depth=d,min_samples_leaf=d-14)
# 训练模型
model.fit(X_train,y_train)
# 评分
model.score(X_test,y_test)
Out[56]: 0.4693554764729142

第二个集成方法-极限随机树

关于集成方法

集成方法 的目标是把多个使用给定学习算法构建的基估计器的预测结果结合起来,从而获得比单个估计器更好的泛化能力/鲁棒性。

集成方法通常分为两种:

  • 平均方法,该方法的原理是构建多个独立的估计器,然后取它们的预测结果的平均。一般来说组合之后的估计器是会比单个估计器要好的,因为它的方差减小了。
  • 相比之下,在 boosting 方法 中,基估计器是依次构建的,并且每一个基估计器都尝试去减少组合估计器的偏差。这种方法主要目的是为了结合多个弱模型,使集成的模型更加强大。
关于极限随机树

在极限随机树中, 计算分割点方法中的随机性进一步增强。 在随机森林中,使用的特征是候选特征的随机子集;不同于寻找最具有区分度的阈值, 这里的阈值是针对每个候选特征随机生成的,并且选择这些随机生成的阈值中的最佳者作为分割规则。 这种做法通常能够减少一点模型的方差,代价则是略微地增大偏差。

实验代码
# 导入必要的模块
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import ExtraTreesClassifier# 数据处理
# 1.从ChengduPM20100101_20151231.csv中读取训练数据
data = pd.read_csv('./ChengduPM20100101_20151231.csv')
# 2.通过.dropna(how='any')函数去除掉无效值
data = data.iloc[:,1:].dropna(how='any')
# 3.获取样本属性值 并转换为NumPy数组
season = data['season']
data1 = data.iloc[:,8:14]
data1['season'] = season
data1 = data1.to_numpy()
# 4.获取样本标记值 并转换为NumPy数组
PM_Caotangsi = data['PM_Caotangsi']
PM_Caotangsi = PM_Caotangsi.to_numpy()
# 5.通过train_test_split()划分训练集测试集
X_train, X_test, y_train, y_test = train_test_split(data1, PM_Caotangsi, test_size=0.12, random_state=12)# 建立模型
etc = ExtraTreesClassifier(n_estimators=10, max_depth=None,min_samples_split=25, random_state=10)
# 训练模型
etc.fit(X_train,y_train)
# 评分
etc.score(X_test,y_test)
Out[58]: 0.5120601028074337

实验结果

结果截图

数据处理



实验结果

决策树

修改后决策树

极限随机树

根据实验结果

同过比较决策树的最大评估结果0.4693554764729142和极限随机树最大评估结果0.5120601028074337

可以得知极限随机树的评估效果较决策树要好一些

根据文献记载

随机森林算法

随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。是一个包含多个决策树的分类器,并且其输出类别是由个别树输出的类别的众数决定的。随机森林的每一颗决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一颗决策树分别进行判断,看看这个样本属于哪一类,然后看看哪一类被选择最多,则预测这个样本为那一类。一般来说,随机森林的判决性能优于决策树。

综合结果

根据实验结果和文献记载,使用随机森林(极限随机树)算法作为解决方案的效果要优于决策树算法作为解决方案,因此使用极限随机树算法作为解决方案。

总结

利用决策树和极限随机树去解决通过季节,露点,温度,湿度,压力,组合风向,累积风速来预测PM2.5标准值进而获得空气等级来判定如何出行的问题,通过实验,极限随机树较决策树评估效果要好一些,但是最高评估效果仅有51.2%,还是不能达到准确的评估PM2.5的标准值。在算法方面或许可以换其他的方法来提高评估值,数据方面可以用个更多的数据来训练或者对数据的值进行一些处理来提高评估值。

参考文献

  1. 关于PM2.5的十个问题 . 北京大学环境科学与工程学院 . [2017-1-3]
  2. 环境空气质量标准(GB 3095—2012).中华人民共和国环境生态部.[2016-01-01]
  3. 集成方法.Scikit-Learn (Sklearn) 官方文档中文版
  4. 决策树和随机森林算法.CSDN-TravisZeng的文章
  5. 十分钟入门Pandas.Pandas中文网

机器学习:PM2.5预测问题 (基于Sklearn Pandas)相关推荐

  1. ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测

    ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测 目录 输出结果 数据集展示 输出结果 1.k-NN 2.LoR 4.DT 5.RF ...

  2. python机器交易_[原创]Python 机器学习之 SVM 预测买卖 -- 基于 BotVS 量化平台

    Python 机器学习之 SVM 预测买卖 Python入门简单策略 sklearn 机器学习库的使用 回测系统自带的库有 numpy pandas TA-Lib scipy statsmodels  ...

  3. 机器学习算法(七): 基于LightGBM的分类预测(基于英雄联盟10分钟数据判断红蓝方胜负)

    机器学习算法(七)基于LightGBM的分类预测 1. 实验室介绍 1.1 LightGBM的介绍 LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个开源项目,由20 ...

  4. python基于机器学习的姓名预测性别网页app开发

    前言 做这个项目的起因是之前csdn给我推荐了一个问答:基于机器学习的姓名预测性别的手机app开发.我点进去发现已经有人回答了,链接点进去一看,好家伙,这不是查表算概率吗,和机器学习有半毛钱关系.而且 ...

  5. 泰坦尼克号生存预测python_基于Python sklearn应用逻辑回归对泰坦尼克乘客存活做预测(一)...

    Python 的sklearn库包含许多可用于机器学习的工具,本文以经典的泰坦尼克号问题为例,来说明在Python中使用sklearn做机器学习的一般流程.由于本人对机器学习了解还不深,对于本文内容如 ...

  6. ML机器学习算法(一): 基于逻辑回归的分类预测

    机器学习算法(一): 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个 ...

  7. A.机器学习入门算法[七]:基于英雄联盟数据集的LightGBM的分类预测

    [机器学习入门与实践]入门必看系列,含数据挖掘项目实战:数据融合.特征优化.特征降维.探索性分析等,实战带你掌握机器学习数据挖掘 专栏详细介绍:[机器学习入门与实践]合集入门必看系列,含数据挖掘项目实 ...

  8. 机器学习(一) 基于sklearn库的数据集划分(交叉验证)

    机器学习中首要环节就是数据集的处理,其中数据集的处理从个人理解(如有错误敬请谅解)的角度来说包括两个方面:数据集划分和数据清理.其中数据集划分是指训练集.验证集和测试集的数据类别划分:数据清理是指数据 ...

  9. 【综述 寿命预测】基于机器学习的设备剩余寿命预测方法综述

    论文题目:基于机器学习的设备剩余寿命预测方法综述 论文年份:2019 论文作者:裴洪/胡昌华/司小胜/张建勋/庞哲楠/张鹏 论文单位:火箭军工程大学导弹工程学院 DOI:10.3901/JME.201 ...

最新文章

  1. 2022-2028年中国胶片手套行业市场研究及前瞻分析报告
  2. 1:1 人脸比对 开源_Hacktoberfest:我的开源门户
  3. 操作系统-银行家算法
  4. 软件构造学习笔记-实验1
  5. java调用浏览器组件来_Java 网页浏览器组件介绍
  6. Oracle 统计信息备份/表分析
  7. 设计模式12-命令模式
  8. 【网络安全工程师面试合集】—谈一谈什么是网络安全?
  9. html遮罩层动画制作,《Flash遮罩层动画的制作》的教学反思
  10. 软件使用:如何彻底把VMware卸载干净
  11. 大学生python作业代做_代写COMP9021作业、代做Python编程语言作业、代写Python实验作业、代做program留学生作业...
  12. python 头条视频_今日头条python视频消重赞
  13. spark系列-应用篇之通过livy提交Spark任务
  14. ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7
  15. 好用的在线二维码生成器网站PHP源码
  16. 高通平台android开发总结 MSM平台上的AMSS
  17. 扫二维码访问网站、网页
  18. 数字电路实验 08 - | 555定时器及其应用
  19. 【ERP】常见错误收集
  20. java遍历数组的三种方式

热门文章

  1. 微博字数监听、昵称长度判断
  2. 基于EKF的锂离子电池SOC估计——Simulink建模仿真
  3. 锂电池SOC估计Simulink模型/卡尔曼滤波估算SOC
  4. Charles抓取浏览器https包
  5. 联想内部怎么做软件配置管理?
  6. 银河麒麟系统开机启动时间优化
  7. S7-200 SMART PLC 子程序功能块(阀门控制)
  8. 手机号如何批量导入通讯录?
  9. java房地产销售系统javaweb-sqlservice
  10. 群体遗传学--华伦德效应(Wahlund effect)