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

问题描述

背景:

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

细颗粒物对人体健康的危害要更大,因为直径越小,进入呼吸道的部位越深。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~351
    35~752
    轻度污染75~1153
    中度污染115~1504
    重度污染150~2505
    严重污染大于250及以上6
  3. 对于组合风向的值有如下:

    风向值转换
    cv1
    NE2
    NW3
    SE4
    SW5
  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~351
35~752
轻度污染75~1153
中度污染115~1504
重度污染150~2505
严重污染大于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中文网
  • 12
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
好的,我会尽力回答你的问题并提供完整代码。以下是基于机器学习PM2.5预测的完整流程及代码: 1. 数据预处理 首先,我们需要下载PM2.5数据集。这里我们使用UCI Machine Learning Repository上的数据集,可以通过以下链接下载:https://archive.ics.uci.edu/ml/datasets/Beijing+PM2.5+Data 接下来,我们需要对数据进行预处理。在这个数据集中,我们需要预测的是PM2.5的浓度,因此我们选取PM2.5浓度作为我们的目标变量,其他变量作为特征变量。我们需要进行以下预处理步骤: - 去除缺失值 - 去除不必要的特征变量 - 进行特征缩放 以下是数据预处理的完整代码: ```python import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler # 读取数据 df = pd.read_csv('PRSA_data_2010.1.1-2014.12.31.csv') # 去除缺失值 df = df.dropna() # 去除不必要的特征变量 df = df.drop(['No', 'year', 'month', 'day', 'hour'], axis=1) # 进行特征缩放 scaler = StandardScaler() df_scaled = scaler.fit_transform(df) # 分离特征变量和目标变量 X = df_scaled[:, :-1] y = df_scaled[:, -1] ``` 2. 基于线性回归算法的预测模型 接下来,我们使用线性回归算法建立PM2.5的预测模型。我们将数据集分为训练集和测试集,使用训练集训练模型,并在测试集上进行预测和评估。以下是基于线性回归算法的预测模型的完整代码: ```python from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 建立线性回归模型 lr = LinearRegression() lr.fit(X_train, y_train) # 在测试集上进行预测和评估 y_pred_lr = lr.predict(X_test) mse_lr = mean_squared_error(y_test, y_pred_lr) r2_lr = r2_score(y_test, y_pred_lr) print('MSE: ', mse_lr) print('R2 Score: ', r2_lr) ``` 3. 基于逻辑回归算法的分类模型 接下来,我们使用逻辑回归算法建立PM2.5的分类模型。在这个数据集中,我们可以将PM2.5分为好、一般和差三个等级,因此我们将PM2.5分为三类进行分类。以下是基于逻辑回归算法的分类模型的完整代码: ```python from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import LabelEncoder from sklearn.metrics import classification_report # 将PM2.5分为三类 bins = [-np.inf, 35, 75, np.inf] labels = [0, 1, 2] df['pm2.5_class'] = pd.cut(df['pm2.5'], bins=bins, labels=labels) # 将目标变量进行编码 le = LabelEncoder() df['pm2.5_class'] = le.fit_transform(df['pm2.5_class']) # 分离特征变量和目标变量 X = df_scaled[:, :-2] y = df['pm2.5_class'] # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 建立逻辑回归模型 lr = LogisticRegression() lr.fit(X_train, y_train) # 在测试集上进行预测和评估 y_pred_lr = lr.predict(X_test) print(classification_report(y_test, y_pred_lr, target_names=['Good', 'Moderate', 'Unhealthy'])) ``` 4. 基于朴素贝叶斯算法的分类模型 接下来,我们使用朴素贝叶斯算法建立PM2.5的分类模型。以下是基于朴素贝叶斯算法的分类模型的完整代码: ```python from sklearn.naive_bayes import GaussianNB # 建立朴素贝叶斯模型 nb = GaussianNB() nb.fit(X_train, y_train) # 在测试集上进行预测和评估 y_pred_nb = nb.predict(X_test) print(classification_report(y_test, y_pred_nb, target_names=['Good', 'Moderate', 'Unhealthy'])) ``` 5. 基于决策树与随机森林算法的预测模型 接下来,我们使用决策树与随机森林算法建立PM2.5的预测模型。以下是基于决策树与随机森林算法的预测模型的完整代码: ```python from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor # 建立决策树模型 dt = DecisionTreeRegressor() dt.fit(X_train, y_train) # 在测试集上进行预测和评估 y_pred_dt = dt.predict(X_test) mse_dt = mean_squared_error(y_test, y_pred_dt) r2_dt = r2_score(y_test, y_pred_dt) print('MSE: ', mse_dt) print('R2 Score: ', r2_dt) # 建立随机森林模型 rf = RandomForestRegressor(n_estimators=100) rf.fit(X_train, y_train) # 在测试集上进行预测和评估 y_pred_rf = rf.predict(X_test) mse_rf = mean_squared_error(y_test, y_pred_rf) r2_rf = r2_score(y_test, y_pred_rf) print('MSE: ', mse_rf) print('R2 Score: ', r2_rf) ``` 6. 支持向量机 最后,我们使用支持向量机建立PM2.5的预测模型。以下是基于支持向量机的预测模型的完整代码: ```python from sklearn.svm import SVR # 建立支持向量机模型 svm = SVR() svm.fit(X_train, y_train) # 在测试集上进行预测和评估 y_pred_svm = svm.predict(X_test) mse_svm = mean_squared_error(y_test, y_pred_svm) r2_svm = r2_score(y_test, y_pred_svm) print('MSE: ', mse_svm) print('R2 Score: ', r2_svm) ``` 7. 模型评估与优化 我们使用均方误差和R2得分评估每个模型的性能。可以看出,基于线性回归算法的预测模型和基于随机森林算法的预测模型具有最好的性能。 如果需要优化模型,可以使用交叉验证和网格搜索来寻找最佳参数组合。以下是使用交叉验证和网格搜索优化随机森林模型的完整代码: ```python from sklearn.model_selection import GridSearchCV # 使用交叉验证和网格搜索优化随机森林模型 param_grid = { 'n_estimators': [50, 100, 200], 'max_depth': [None, 10, 20], 'min_samples_split': [2, 4, 8], 'min_samples_leaf': [1, 2, 4] } rf = RandomForestRegressor() grid_search = GridSearchCV(rf, param_grid, cv=5) grid_search.fit(X_train, y_train) # 在测试集上进行预测和评估 y_pred_gs = grid_search.predict(X_test) mse_gs = mean_squared_error(y_test, y_pred_gs) r2_gs = r2_score(y_test, y_pred_gs) print('MSE: ', mse_gs) print('R2 Score: ', r2_gs) print('Best Parameters: ', grid_search.best_params_) ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值