如何建立預測大氣污染日的概率預測模型

編譯: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 ”並將其放在當前的工作目錄中。

檢查數據文件,我們可以看到不同的觀察值。

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分數來看,它表明額外的樹木,隨機梯度提升和隨機森林模型是最熟練的。

><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,都修改。

完整示例如下:

# 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。

><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評估預測。
  • 如何集成決策樹開發熟練的模型,並調優成功模型的超參數進一步提高性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章