前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何建立预测大气污染日的概率预测模型

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

作者头像
AiTechYun
发布于 2018-10-25 02:03:50
发布于 2018-10-25 02:03:50
3K00
代码可运行
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号
运行总次数:0
代码可运行

编译:yxy

出品:ATYUN订阅号

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

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

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

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

  • 如何加载和准备臭氧日标准机器学习预测建模问题。
  • 如何开发朴素预测模型并使用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 ”并将其放在当前的工作目录中。

检查数据文件,我们可以看到不同的观察值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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年初,我们可以看到缺少的观察值标有“?”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
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加载。数据没有数据头,我们可以解析第一列中的日期并将它们用作索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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%是臭氧日。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(2534, 73)
Class=0, total=2374, percentage=93.686
Class=1, total=160, percentage=6.314

我们还可以创建七年内输出变量的线图,以了解臭氧日是否发生在一年中的某些特定时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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年是闰年,因此将数据分成训练和测试集并不是一个准确的划分,但是对于本教程来说已经足够了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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文件,并查看两个数据集的形状。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1803, 73) (730, 73)

朴素预测模型

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

我们可以从训练数据集中估计臭氧日的概率,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# load datasets
train = loadtxt('train.csv', delimiter=',')
test = loadtxt('test.csv', delimiter=',')
# estimate naive probabilistic forecast
naive = sum(train[:,-1]) / train.shape[0]

然后,我们可以预测测试数据集中每天臭氧日发生的概率。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# forecast the test dataset
yhat = [naive for _ in range(len(test))]

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

所以,我们要最小化Brier分数,越小越好。我们可以使用scikit-learn库中的brier_score_loss()函数评估预测的Brier分数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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分数越大越好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# calculate brier skill score
bs_ref = bs
bss = (bs - bs_ref) / (0 - bs_ref)
print('Brier Skill Score: %.6f' % bss)

以下是朴素预测的完整示例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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(忽略符号)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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分数,并返回这些分数进行分析。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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

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

完整示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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分数来看,它表明额外的树木,随机梯度提升和随机森林模型是最熟练的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
><class 'sklearn.ensemble.bagging.BaggingClassifier'>, bss=0.069762
><class 'sklearn.ensemble.forest.ExtraTreesClassifier'>, bss=0.103291
><class 'sklearn.ensemble.gradient_boosting.GradientBoostingClassifier'>, bss=0.119803
><class 'sklearn.ensemble.forest.RandomForestClassifier'>, 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,都修改。

完整示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
><class 'sklearn.ensemble.gradient_boosting.GradientBoostingClassifier'>, bss=0.119972
><class 'sklearn.ensemble.gradient_boosting.GradientBoostingClassifier'>, bss=0.145596
><class 'sklearn.ensemble.gradient_boosting.GradientBoostingClassifier'>, bss=0.095871
><class 'sklearn.ensemble.gradient_boosting.GradientBoostingClassifier'>, bss=0.192175

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

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

总结

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

具体来说,你学到了:

  • 如何加载和准备臭氧日标准机器学习预测建模问题。
  • 如何开发朴素预测模型并使用BSS评估预测。
  • 如何集成决策树开发熟练的模型,并调优成功模型的超参数进一步提高性能。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用 LSTM 做时间序列预测的一个小例子
问题:航班乘客预测 数据:1949 到 1960 一共 12 年,每年 12 个月的数据,一共 144 个数据,单位是 1000 下载地址 目标:预测国际航班未来 1 个月的乘客数 import numpy import matplotlib.pyplot as plt from pandas import read_csv import math from keras.models import Sequential from keras.layers import Dense from keras
杨熹
2018/04/03
8.9K0
用 LSTM 做时间序列预测的一个小例子
在深度学习中使用Bagging集成模型
集成是一种机器学习概念,使用相同的学习算法训练多个模型。Bagging是一种减少预测方差的方法,通过使用重复组合生成多组原始数据,从数据集生成额外的训练数据。Boosting 是一种基于最后分类调整观测值权重的迭代技术。如果一条观察数据被错误地分类,它会试图增加这个观察数据的权重。总体而言,Boosting 建立了强大的预测模型。
deephub
2021/08/20
8990
基于Pytorch和RDKit建立QSAR模型
python qsar_pytorch.py solubility.train.sdf solubility.test.sdf
DrugAI
2021/01/28
1.5K0
初学者的机器学习入门实战教程!
这是一篇手把手教你使用 Python 实现机器学习算法,并在数值型数据和图像数据集上运行模型的入门教程,当你看完本文后,你应当可以开始你的机器学习之旅了!
kbsc13
2019/08/16
7410
使用 LSTM 进行多变量时间序列预测的保姆级教程
来源:DeepHub IMBA本文约3800字,建议阅读10分钟本文中我们将使用深度学习方法 (LSTM) 执行多元时间序列预测。 使用 LSTM 进行端到端时间序列预测的完整代码和详细解释。 我们先来了解两个主题: 什么是时间序列分析? 什么是 LSTM? 时间序列分析:时间序列表示基于时间顺序的一系列数据。它可以是秒、分钟、小时、天、周、月、年。未来的数据将取决于它以前的值。 在现实世界的案例中,我们主要有两种类型的时间序列分析: 单变量时间序列 多元时间序列 对于单变量时间序列数据,我们将使用单列进行
数据派THU
2022/03/04
4.2K0
深度学习 | 基于LSTM模型的黄金期货价格预测
本文数据集为黄金期货价格,可从:https://cn.investing.com/commodities/gold-historical-data进行下载。(单位 : 1金衡盎司 = 31.1034768克)
DataCharm
2021/04/16
3.5K0
深度学习 | 基于LSTM模型的黄金期货价格预测
Keras基本用法
Keras是目前使用最为广泛的深度学习工具之一,它的底层可以支持TensorFlow、MXNet、CNTK和Theano。如今,Keras更是被直接引入了TensorFlow的核心代码库,成为TensorFlow官网提供的高层封装之一。下面首先介绍最基本的Keras API,斌哥给出一个简单的样例,然后介绍如何使用Keras定义更加复杂的模型以及如何将Keras和原生态TensorFlow结合起来。
狼啸风云
2019/12/19
1.6K0
Kaggle经典数据分析项目:泰坦尼克号生存预测!
最近有很多读者留言,希望能有一个完整的数据分析项目练手,这几天收集了组织成员们的推荐。其中泰坦尼克号生存预测作为最经典的启蒙数据分析项目,对于初学者来说是应该是最合适的了,后面将分享更多进阶的数据分析项目。如果已经有基础了,推荐:
Datawhale
2020/08/28
2.8K0
Kaggle经典数据分析项目:泰坦尼克号生存预测!
股票预测 lstm(时间序列的预测步骤)
如果对LSTM原理不懂得小伙伴可以看博主下一篇博客,因为博主水平有限,结合其他文章尽量把原理写的清楚些。
全栈程序员站长
2022/08/01
2.4K1
股票预测 lstm(时间序列的预测步骤)
用 LSTM 做时间序列预测的一个小例子
问题:航班乘客预测 数据:1949 到 1960 一共 12 年,每年 12 个月的数据,一共 144 个数据,单位是 1000 下载地址(https://datamarket.com/data/set/22u3/international-airline-passengers-monthly-totals-in-thousands-jan-49-dec-60#!ds=22u3&display=line) 目标:预测国际航班未来 1 个月的乘客数 import numpy import matplo
用户1332428
2018/03/09
1.7K0
用 LSTM 做时间序列预测的一个小例子
贷款违约预测-Task5 模型融合
Tip:此部分为零基础入门金融风控的 Task5 模型融合部分,欢迎大家后续多多交流。 赛题:零基础入门数据挖掘 - 零基础入门金融风控之贷款违约预测 项目地址:https://github.com/datawhalechina/team-learning-data-mining/tree/master/FinancialRiskControl
致Great
2020/10/10
9870
贷款违约预测-Task5 模型融合
支持中文文本数据挖掘的开源项目PyMining
最近一个月,过年的时候天天在家里呆着,年后公司的事情也不断,有一段时间没有更新博客了。PyMining是我最近一段时间构思的一个项目,虽然目前看来比较微型。该项目主要是针对中文文本的数据挖掘算法的实验与应用。从项目的目标来说,希望使用者可以很方便的使用现有的数据挖掘、机器学习算法与添加需要的算法。 项目概述 项目目前主要关注中文文本的数据挖掘算法。由于每种数据挖掘算法的局限性都很大,就拿分类算法一样,决策树、朴素贝叶斯这两种算法都有着自己的特性,只能在某一种类型的类型的数据上应用比较良好,比如朴素贝叶斯,
机器学习AI算法工程
2018/03/14
1.5K0
支持中文文本数据挖掘的开源项目PyMining
使用用测试时数据增强(TTA)提高预测结果
当使用拟合模型进行预测时,也可以应用图像数据增强技术,以允许模型对测试数据集中每幅图像的多个不同版本进行预测。对增强图像的预测可以取平均值,从而获得更好的预测性能。
deephub
2021/01/12
3.5K0
独家 | 如何用XGBoost做时间序列预测?
本文介绍了如何用XGBoost做时间序列预测,包括将时间序列转化为有监督学习的预测问题,使用前向验证来做模型评估,并给出了可操作的代码示例。
数据派THU
2020/09/04
4.5K0
【Python机器学习实战】决策树与集成学习(五)——集成学习(3)GBDT应用实例
前面对GBDT的算法原理进行了描述,通过前文了解到GBDT是以回归树为基分类器的集成学习模型,既可以做分类,也可以做回归,由于GBDT设计很多CART决策树相关内容,就暂不对其算法流程进行实现,本节就根据具体数据,直接利用Python自带的Sklearn工具包对GBDT进行实现。
冬夜先生
2021/09/08
5740
CNN做时间序列预测_lstm时间序列预测_2「建议收藏」
此数据是1949 到 1960 一共 12 年,每年 12 个月的航班乘客数据,一共 144 个数据,单位是 1000。我们使用它来进行LSTM时间序列预测的实验。数据如图所示
全栈程序员站长
2022/07/25
1.5K0
CNN做时间序列预测_lstm时间序列预测_2「建议收藏」
代码实现! 教学视频!Python学习者最易上手的机器学习漫游指南
大数据文摘作品,转载要求见文末 作者 | Conor Dewey 编译 | 糖竹子,徐凌霄,Aileen 导读:半路出山想迅速上手Python做机器学习?这篇文章就是你需要的实用指南。 毋庸置疑,近来机器学习人气日益高涨,逐渐在流行词榜单上占据一席之地。机器学习算法繁多,到底该选择哪一种处理相关数据是困扰很多学习者的问题。本文将以一种清晰简明的方式,解释并实践最常见的几种机器学习算法。 接下来,我们将罗列8种最常见火爆的机器学习算法,通过Python,将它们分别适用同一个经典数据集Iris(线性回归和逻辑
大数据文摘
2018/05/24
5740
机器学习实战--对亚马逊森林卫星照片进行分类(2)
分类准确性通常适用于二进制分类任务,每个类中具有平衡数量的示例。在这种情况下,我们既不使用二进制或多类分类任务; 相反,它是一个多标签分类任务,标签数量不均衡,有些使用比其他标签更重要。因此,Kaggle比赛组织选择了F-beta指标,特别是F2得分。这是与F1分数(也称为F-measure)相关的度量。
PM小王
2019/07/02
9070
机器学习实战--对亚马逊森林卫星照片进行分类(2)
lstm多变量时间序列预测(时间序列如何预测)
Now, we are familiar with statistical modelling on time series, but machine learning is all the rage right now, so it is essential to be familiar with some machine learning models as well. We shall start with the most popular model in time series domain − Long Short-term Memory model.
全栈程序员站长
2022/08/01
2.4K0
lstm多变量时间序列预测(时间序列如何预测)
GBDT实战
The accuracy of prediction is: 0.9666666666666667 Feature importances: [0.002148238569679191, 0.0046703830672789074, 0.33366676380518245, 0.6595146145578594]
西西嘛呦
2021/02/25
7580
GBDT实战
推荐阅读
相关推荐
用 LSTM 做时间序列预测的一个小例子
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档