如何建立预测大气污染日的概率预测模型

2018年10月04日 由 yuxiangyu 发表 150345 0
空气污染程度以地面臭氧浓度表示。根据风速和温度等气象测量结果,是否会在明天达到足以发出公众空气污染警告的高度

这是用于时间序列分类数据集的标准机器学习数据集基础,简称为“ 臭氧预测问题 ”。这个数据集描述了休斯顿地区七年来的气象观测以及臭氧水平是否高于临界空气污染水平。

在本教程中,你会了解如何开发概率预测模型来预测大气污染。

完成本教程后,你将了解:

  • 如何加载和准备臭氧日标准机器学习预测建模问题。

  • 如何开发朴素预测模型并使用BSS评估预测。

  • 如何集成决策树开发熟练的模型,并调优成功模型的超参数进一步提高性能。


让我们开始吧。

如何建立预测大气污染日的概率预测模型

本教程分为五个部分; 他们是:

  1. 臭氧预测问题

  2. 加载和检查数据

  3. 朴素预测模型

  4. 集合树预测模型

  5. 调整梯度提升


臭氧预测问题


空气污染程度以地平面臭氧浓度表示,通常被称为“ bad ozone”,以区别于臭氧层。

臭氧预测问题是时间序列分类预测问题,其涉及预测第二天是否将是高水平的空气污染日(臭氧日)。气象组织可以利用臭氧日的预测来警告公众,使他们能够采取预防措施。

该数据集最初由Kun Zhang等人研究。他们在2006年的论文“ Forecasting Skewed Biased Stochastic Ozone Days: Analyses and Solutions”中研究的,然后在他们的后续论文“ Forecasting Skewed Biased Stochastic Ozone Days: analyses, solutions and beyond”中再次研究。

这是一个具有挑战性的问题,因为高臭氧水平的物理机制没有被完全理解,这意味着预测不能像其他气象预测(比如温度和降雨)那样基于物理模拟。

该数据集被用作开发预测模型的基础,模型使用一系列可能与预测臭氧水平相关(也可能无关!)的变量,此外还有一些已知的与实际化学过程相关的变量。
然而,环境科学家普遍认为,目前从未探索过的大量其他的特征对于建立高度准确的臭氧预测模型非常有用。但是,鲜有人知的是这些特征到底是什么,以及它们如何在臭氧形成中实际相互作用。[...]时至今日,环境科学不知道如何使用它们。这为数据挖掘提供了绝佳的机会。

-   Forecasting Skewed Biased Stochastic Ozone Days: Analyses and Solutions,2006年。

在接下来的一天预测高水平的地面臭氧是一个具有挑战性的问题,已知其具有随机性。这意味着预期中预测会出现错误。因此,有必要对预测问题进行概率建模,并对臭氧日或前一天(或几天)没有观察值的可能性进行预测。数据集包含七年的每日气象变量观测值(1998-2004或2,536天)以及是否是臭氧日,美国德克萨斯州休斯顿、加尔维斯顿和布拉多利亚地区是否是臭氧日。

每天总共观察到72个变量,其中许多被认为与预测问题相关,其中10个已根据物理学被证实是相关的。
[...]这72个特征中只有大约10个特征已被环境科学家验证为有用且相关,至于其他60个特征的相关性,既没有经验也没有理论信息。然而,空气质量控制科学家长期以来一直在猜测这些特征中的一些可能是有用的,但是无法发展理论或使用模拟来证明其相关性。

-   Forecasting Skewed Biased Stochastic Ozone Days: Analyses and Solutions,2006年。

有24个变量跟踪每小时风速,另外24个变量跟踪一天中每小时的温度。有两个版本的数据集可供使用,它们测量的平均周期不同(1小时和8小时)。缺少但可能有用的是每天观察到的臭氧水平而不是二氧化碳臭氧日或非臭氧日。参数模型中使用的其他度量方法也不可用。

有趣的是,基于1999年EPA指南的“ Guideline For Developing An Ozone Forecasting Program ”中的描述,使用参数臭氧预测模型作为基线。这个文件还描述了验证臭氧预报系统的标准方法。

总之,这是一个具有挑战性的预测问题,因为:

  • 存在大量变量,它们重要性是未知的。

  • 输入变量及其相互关系可能会随时间而变化。

  • 对于需要处理的许多变量缺少观察结果。

  • 非臭氧日(非事件)远远多于臭氧日(事件),使得这些类高度不平衡。


加载和检查数据


该数据集可从UCI机器学习库获得。

  • https://archive.ics.uci.edu/ml/datasets/ozone+level+detection


本教程中我们使用8小时版本数据。下载“ eighthr.data ”并将其放在当前的工作目录中。

检查数据文件,我们可以看到不同的观察值。
1/1/1998,0.8,1.8,2.4,2.1,2,2.1,1.5,1.7,1.9,2.3,3.7,5.5,5.1,5.4,5.4,4.7,4.3,3.5,3.5,2.9,3.2,3.2,2.8,2.6,5.5,3.1,5.2,6.1,6.1,6.1,6.1,5.6,5.2,5.4,7.2,10.6,14.5,17.2,18.3,18.9,19.1,18.9,18.3,17.3,16.8,16.1,15.4,14.9,14.8,15,19.1,12.5,6.7,0.11,3.83,0.14,1612,-2.3,0.3,7.18,0.12,3178.5,-15.5,0.15,10.67,-1.56,5795,-12.1,17.9,10330,-55,0,0.
1/2/1998,2.8,3.2,3.3,2.7,3.3,3.2,2.9,2.8,3.1,3.4,4.2,4.5,4.5,4.3,5.5,5.1,3.8,3,2.6,3,2.2,2.3,2.5,2.8,5.5,3.4,15.1,15.3,15.6,15.6,15.9,16.2,16.2,16.2,16.6,17.8,19.4,20.6,21.2,21.8,22.4,22.1,20.8,19.1,18.1,17.2,16.5,16.1,16,16.2,22.4,17.8,9,0.25,-0.41,9.53,1594.5,-2.2,0.96,8.24,7.3,3172,-14.5,0.48,8.39,3.84,5805,14.05,29,10275,-55,0,0.
1/3/1998,2.9,2.8,2.6,2.1,2.2,2.5,2.5,2.7,2.2,2.5,3.1,4,4.4,4.6,5.6,5.4,5.2,4.4,3.5,2.7,2.9,3.9,4.1,4.6,5.6,3.5,16.6,16.7,16.7,16.8,16.8,16.8,16.9,16.9,17.1,17.6,19.1,21.3,21.8,22,22.1,22.2,21.3,19.8,18.6,18,18,18.2,18.3,18.4,22.2,18.7,9,0.56,0.89,10.17,1568.5,0.9,0.54,3.8,4.42,3160,-15.9,0.6,6.94,9.8,5790,17.9,41.3,10235,-40,0,0.
...

浏览文件,例如2003年初,我们可以看到缺少的观察值标有“?”。
...
12/29/2002,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,11.7,0.09,5.59,3.79,1578,5.7,0.04,1.8,4.8,3181.5,-13,0.02,0.38,2.78,5835,-31.1,18.9,10250,-25,0.03,0.
12/30/2002,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,10.3,0.43,3.88,9.21,1525.5,1.8,0.87,9.17,9.96,3123,-11.3,0.03,11.23,10.79,5780,17,30.2,10175,-75,1.68,0.
12/31/2002,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,8.5,0.96,6.05,11.18,1433,-0.85,0.91,7.02,6.63,3014,-16.2,0.05,15.77,24.38,5625,31.15,48.75,10075,-100,0.05,0.
1/1/2003,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,7.2,5.7,4.5,4,3.6,3.3,3.1,3.2,6.7,11.1,13.8,15.8,17.2,18.6,20,21.1,21.5,20.4,19.1,17.8,17.4,16.9,16.6,14.9,21.5,12.6,6.4,0.6,12.91,-10.17,1421.5,1.95,0.55,11.97,-7.78,3006.5,-14.1,0.44,20.42,-13.31,5640,2.9,30.5,10095,35,0,0.
...

首先,我们可以使用read_csv()函数将数据作为Pandas DataFrame加载。数据没有数据头,我们可以解析第一列中的日期并将它们用作索引:
# load and summarize
from pandas import read_csv
from matplotlib import pyplot
# load dataset
data = read_csv('eighthr.data', header=None, index_col=0, parse_dates=True, squeeze=True)
print(data.shape)
# summarize class counts
counts = data.groupby(73).size()
for i in range(len(counts)):
percent = counts[i] / data.shape[0] * 100
print('Class=%d, total=%d, percentage=%.3f' % (i, counts[i], percent))

运行该示例确认有2,534天的数据和73个变量。

我们还可以看到类不平衡,其中93%以上的日子是非臭氧日,约6%是臭氧日。
(2534, 73)
Class=0, total=2374, percentage=93.686
Class=1, total=160, percentage=6.314

我们还可以创建七年内输出变量的线图,以了解臭氧日是否发生在一年中的某些特定时间。
# load and plot output variable
from pandas import read_csv
from matplotlib import pyplot
# load dataset
data = read_csv('eighthr.data', header=None, index_col=0, parse_dates=True, squeeze=True)
# plot the output variable
pyplot.plot(data.index, data.values[:,-1])
pyplot.show()

运行该示例将创建七年内输出变量的线图。

我们可以看到,每年年中都有很多臭氧日:北半球的夏季或温暖月份。

如何建立预测大气污染日的概率预测模型

通过简要回顾一下观察结果,我们可以了解如何准备数据:

  • 缺失的数据需要处理。

  • 最简单的框架是根据今天的观察结果预测明天。

  • 温度可能与季节相关,可能是一个有用的预测指标。

  • 数据变量可能需要缩放(归一化),甚至可能需要标准化,具体取决于所选的算法。

  • 预测概率将提供比预测类值更多的细微差别。

  • 也许我们可以使用5年(约72%)来训练模型,并用剩下的2年测试(约28%)


我们可以执行一些最低限度的数据准备。下面的示例加载数据集,用0.0替换缺失的观测值,将数据构建为监督学习问题(根据今天的观察值预测明天),并根据大量天数将数据分成训练和测试集。

你可以探索替换缺失值的替代方法,例如输入平均值。此外,2004年是闰年,因此将数据分成训练和测试集并不是一个准确的划分,但是对于本教程来说已经足够了。
# load and prepare
from pandas import read_csv
from matplotlib import pyplot
from numpy import array
from numpy import hstack
from numpy import savetxt
# load dataset
data = read_csv('eighthr.data', header=None, index_col=0, parse_dates=True, squeeze=True)
values = data.values
# replace missing observations with 0
values[values=='?'] = 0.0
# frame as supervised learning
supervised = list()
for i in range(len(values) - 1):
X, y = values[i, :-1], values[i + 1, -1]
row = hstack((X,y))
supervised.append(row)
supervised = array(supervised)
# split into train-test
split = 365 * 2
train, test = supervised[:-split,:], supervised[-split:,:]
train, test = train.astype('float32'), test.astype('float32')
print(train.shape, test.shape)
# save prepared datasets
savetxt('train.csv', train, delimiter=',')
savetxt('test.csv', test, delimiter=',')

运行该示例将训练和测试集保存为CSV文件,并查看两个数据集的形状。
(1803, 73) (730, 73)

朴素预测模型


一个可以预测臭氧日概率的朴素模型。这是一种朴素的方法,因为它不使用除事件基本比率之外的任何信息。在气象预报的验证中,这被称为气候预报。

我们可以从训练数据集中估计臭氧日的概率,如下所示。
# load datasets
train = loadtxt('train.csv', delimiter=',')
test = loadtxt('test.csv', delimiter=',')
# estimate naive probabilistic forecast
naive = sum(train[:,-1]) / train.shape[0]

然后,我们可以预测测试数据集中每天臭氧日发生的概率。
# forecast the test dataset
yhat = [naive for _ in range(len(test))]

有了预测后,我们对其进行评估。评估概率预测的有用措施是Brier分数。该分数可以被认为是预期概率(0%或1%)的预测概率(例如5%)的均方误差。它是测试数据集中每天发生的错误的平均值。

所以,我们要最小化Brier分数,越小越好。我们可以使用scikit-learn库中的brier_score_loss()函数评估预测的Brier分数。
# evaluate forecast
testy = test[:, -1]
bs = brier_score_loss(testy, yhat)
print('Brier Score: %.6f' % bs)

对于一个熟练的模型,它必须具有比朴素预测的分数更高的分数。我们可以通过计算一个BSS(Brier Skill Score)来说明这一点,BSS是基于朴素预测的Brier分数。

朴素预测的BSS为0.0。接下来,我们最大化此分数,即BSS分数越大越好。
# calculate brier skill score
bs_ref = bs
bss = (bs - bs_ref) / (0 - bs_ref)
print('Brier Skill Score: %.6f' % bss)

以下是朴素预测的完整示例。
# naive prediction method
from sklearn.metrics import brier_score_loss
from numpy import loadtxt
# load datasets
train = loadtxt('train.csv', delimiter=',')
test = loadtxt('test.csv', delimiter=',')
# estimate naive probabilistic forecast
naive = sum(train[:,-1]) / train.shape[0]
print(naive)
# forecast the test dataset
yhat = [naive for _ in range(len(test))]
# evaluate forecast
testy = test[:, -1]
bs = brier_score_loss(testy, yhat)
print('Brier Score: %.6f' % bs)
# calculate brier skill score
bs_ref = bs
bss = (bs - bs_ref) / (0 - bs_ref)
print('Brier Skill Score: %.6f' % bss)

运行这个例子,我们可以看到臭氧日的朴素概率约为7.2%。

使用基本率作为预测会导致Brier技能为0.039,预期Brier技能得分为0.0(忽略符号)。
0.07265668330560178
Brier Score: 0.039232
Brier Skill Score: -0.000000

我们现在准备探索一些机器学习方法,看看我们是否可以为此预测添加技能。

请注意,原始论文直接使用精确度和召回评估方法的技能,这是一种用于方法之间直接比较的方法。

也许你可以探索的替代措施是ROC曲线下的面积(ROC AUC)。绘制最终模型的ROC曲线将允许模型的操作者选择阈值,该阈值提供真正的正(hit)和负(false alarm)率之间的理想平衡水平。

集成决策树预测模型


原始论文报告了袋装决策树(bagged decision trees)的一些成功。
尽管我们对归纳学习者的选择是并不详尽,但本文已经表明,归纳学习可以作为臭氧水平预测的一种选择方法,基于集合的概率树提供了比现有方法更好的预测(更高的召回率和精确度)。

- Forecasting Skewed Biased Stochastic Ozone Days: Analyses and Solutions,2006年。

出于以下几个原因,这并不奇怪:

  • 袋装决策树不需要任何数据缩放。

  • Bagged决策树自动执行一种特征部分,忽略不相关的特征。

  • 袋装决策树预测合理校准的概率(与SVM不同)。


这表明在测试问题的机器学习算法时,这是一个很好的起点。

我们可以通过现场检查scikit-learn库中标准集合树方法样本的性能来快速入门,其默认配置和树数设置为100。

具体来说,方法:

  • 袋装决策树(BaggingClassifier)

  • 额外决策树(ExtraTreesClassifier)

  • 随机梯度提升(GradientBoostingClassifier)

  • 随机森林(RandomForestClassifier)


首先,我们必须将训练和测试数据集分成输入(X)和输出(y)部分,以便我们可以拟合sklearn模型。
# load datasets
train = loadtxt('train.csv', delimiter=',')
test = loadtxt('test.csv', delimiter=',')
# split into inputs/outputs
trainX, trainy, testX, testy = train[:,:-1],train[:,-1],test[:,:-1],test[:,-1]

我们还需要朴素预测的Brier分数,以便我们能够正确计算新模型的BSS。
# estimate naive probabilistic forecast
naive = sum(train[:,-1]) / train.shape[0]
# forecast the test dataset
yhat = [naive for _ in range(len(test))]
# calculate naive bs
bs_ref = brier_score_loss(testy, yhat)

我们可以一般地评估单个scikit-learn模型的技能。

下面定义了名为evaluate_once()的函数,该函数拟合并评估给定的已定义和配置的scikit-learn模型并返回BSS。
# evaluate a sklearn model
def evaluate_once(bs_ref, template, trainX, trainy, testX, testy):
# fit model
model = clone(template)
model.fit(trainX, trainy)
# predict probabilities for 0 and 1
probs = model.predict_proba(testX)
# keep the probabilities for class=1 only
yhat = probs[:, 1]
# calculate brier score
bs = brier_score_loss(testy, yhat)
# calculate brier skill score
bss = (bs - bs_ref) / (0 - bs_ref)
return bss

集合树是一种随机机器学习方法。

这意味着当同一模型的相同配置在相同的数据上训练时,它们会做出不同的预测。为了纠正这个问题,我们可以多次评估给定模型,例如10次,并计算每次运行的平均技能。

下面的函数将评估给定模型10次,打印平均BSS分数,并返回这些分数进行分析。
# evaluate an sklearn model n times
def evaluate(bs_ref, model, trainX, trainy, testX, testy, n=10):
scores = [evaluate_once(bs_ref, model, trainX, trainy, testX, testy) for _ in range(n)]
print('>%s, bss=%.6f' % (type(model), mean(scores)))
return scores

我们现在准备评估一个集成决策树算法。

完整示例如下:
# evaluate ensemble tree methods
from numpy import loadtxt
from numpy import mean
from matplotlib import pyplot
from sklearn.base import clone
from sklearn.metrics import brier_score_loss
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier

# evaluate a sklearn model
def evaluate_once(bs_ref, template, trainX, trainy, testX, testy):
# fit model
model = clone(template)
model.fit(trainX, trainy)
# predict probabilities for 0 and 1
probs = model.predict_proba(testX)
# keep the probabilities for class=1 only
yhat = probs[:, 1]
# calculate brier score
bs = brier_score_loss(testy, yhat)
# calculate brier skill score
bss = (bs - bs_ref) / (0 - bs_ref)
return bss

# evaluate an sklearn model n times
def evaluate(bs_ref, model, trainX, trainy, testX, testy, n=10):
scores = [evaluate_once(bs_ref, model, trainX, trainy, testX, testy) for _ in range(n)]
print('>%s, bss=%.6f' % (type(model), mean(scores)))
return scores

# load datasets
train = loadtxt('train.csv', delimiter=',')
test = loadtxt('test.csv', delimiter=',')
# split into inputs/outputs
trainX, trainy, testX, testy = train[:,:-1],train[:,-1],test[:,:-1],test[:,-1]
# estimate naive probabilistic forecast
naive = sum(train[:,-1]) / train.shape[0]
# forecast the test dataset
yhat = [naive for _ in range(len(test))]
# calculate naive bs
bs_ref = brier_score_loss(testy, yhat)
# evaluate a suite of ensemble tree methods
scores, names = list(), list()
n_trees=100
# bagging
model = BaggingClassifier(n_estimators=n_trees)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('bagging')
# extra
model = ExtraTreesClassifier(n_estimators=n_trees)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('extra')
# gbm
model = GradientBoostingClassifier(n_estimators=n_trees)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('gbm')
# rf
model = RandomForestClassifier(n_estimators=n_trees)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('rf')
# plot results
pyplot.boxplot(scores, labels=names)
pyplot.show()

运行该示例总结了每个模型在10次运行中的平均BSS。

鉴于算法的随机性,你的具体结果可能会有所不同,但趋势应该相同。

从平均BSS分数来看,它表明额外的树木,随机梯度提升和随机森林模型是最熟练的。
>, bss=0.069762
>, bss=0.103291
>, bss=0.119803
>, bss=0.102736

绘制每个模型的得分的盒子和须状图。

他们所有跑步的所有模型都显示出朴素预测的技巧(正分数),这非常令人鼓舞。

额外决策树,随机梯度提升和随机森林的BSS分数的分布看起来都不错。

如何建立预测大气污染日的概率预测模型

测试集上的集合决策树BSS分数的框和胡须图



调整梯度提升


由于随机梯度提升看起来很不错,值得探讨是否可以通过一些参数调整进一步提升模型的性能。

有许多参数可以调优模型,一些好的启发式方法包括:

  • 降低学习率(learning_rate),同时增加决策树的数量(n_estimators)。

  • 增加决策树的最大深度(max_depth),同时减少可用于拟合树(样本)的样本数。


我们可以根据这些原则检查一些参数,而不是网格搜索值。如果有时间和计算资源,可以自己探索这些参数的网格搜索。

我们将比较GBM模型的四种配置:

  • 基线:在上一节中测试(learning_rate = 0.1,n_estimators = 100,subsample = 1.0,max_depth = 3)

  • lr,较低的学习率和更多的树(learning_rate = 0.01,n_estimators = 500,subsample = 1.0,max_depth= 3)

  • depth,增加的最大树深度和较小的数据集采样(learning_rate = 0.1,n_estimators = 100,subsample = 0.7,max_depth =)

  • all,都修改。


完整示例如下:
# tune the gbm configuration
from numpy import loadtxt
from numpy import mean
from matplotlib import pyplot
from sklearn.base import clone
from sklearn.metrics import brier_score_loss
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier

# evaluate a sklearn model
def evaluate_once(bs_ref, template, trainX, trainy, testX, testy):
# fit model
model = clone(template)
model.fit(trainX, trainy)
# predict probabilities for 0 and 1
probs = model.predict_proba(testX)
# keep the probabilities for class=1 only
yhat = probs[:, 1]
# calculate brier score
bs = brier_score_loss(testy, yhat)
# calculate brier skill score
bss = (bs - bs_ref) / (0 - bs_ref)
return bss

# evaluate an sklearn model n times
def evaluate(bs_ref, model, trainX, trainy, testX, testy, n=10):
scores = [evaluate_once(bs_ref, model, trainX, trainy, testX, testy) for _ in range(n)]
print('>%s, bss=%.6f' % (type(model), mean(scores)))
return scores

# load datasets
train = loadtxt('train.csv', delimiter=',')
test = loadtxt('test.csv', delimiter=',')
# split into inputs/outputs
trainX, trainy, testX, testy = train[:,:-1],train[:,-1],test[:,:-1],test[:,-1]
# estimate naive probabilistic forecast
naive = sum(train[:,-1]) / train.shape[0]
# forecast the test dataset
yhat = [naive for _ in range(len(test))]
# calculate naive bs
bs_ref = brier_score_loss(testy, yhat)
# evaluate a suite of ensemble tree methods
scores, names = list(), list()
# base
model = GradientBoostingClassifier(learning_rate=0.1, n_estimators=100, subsample=1.0, max_depth=3)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('base')
# learning rate
model = GradientBoostingClassifier(learning_rate=0.01, n_estimators=500, subsample=1.0, max_depth=3)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('lr')
# depth
model = GradientBoostingClassifier(learning_rate=0.1, n_estimators=100, subsample=0.7, max_depth=7)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('depth')
# all
model = GradientBoostingClassifier(learning_rate=0.01, n_estimators=500, subsample=0.7, max_depth=7)
avg_bss = evaluate(bs_ref, model, trainX, trainy, testX, testy)
scores.append(avg_bss)
names.append('all')
# plot results
pyplot.boxplot(scores, labels=names)
pyplot.show()

运行该示例为每种配置打印不同模型10次运行的平均BSS。

结果表明,学习率和决策树数量的变化给默认配置带来了一些提升。

结果还表明,所有配置(包含每个变化)得出了最佳平均BSS。
>, bss=0.119972
>, bss=0.145596
>, bss=0.095871
>, bss=0.192175

创建来自每个配置的BSS得分的盒须图。我们可以看到包含每个更改的配置都明显优于基线模型和其他配置组合。

也许通过对模型进行参数调优还可以进一步提高性能。

如何建立预测大气污染日的概率预测模型

总结


在本教程中,你了解了如何开发概率预测模型来预测大气污染。

具体来说,你学到了:

  • 如何加载和准备臭氧日标准机器学习预测建模问题。

  • 如何开发朴素预测模型并使用BSS评估预测。

  • 如何集成决策树开发熟练的模型,并调优成功模型的超参数进一步提高性能。

欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消