深度解析機器學習中的置信區間(附代碼)

深度解析機器學習中的置信區間(附代碼)

翻譯:和中華

校對:丁楠雅

本文約4000字,建議閱讀15分鐘。

本文介紹了置信區間的概念以及如何計算置信區間和bootstrap置信區間。

機器學習很多時候需要估計某個算法在未知數據上的性能。

置信區間是一種對估計不確定性的量化方法,它們可以用來在總體參數(例如平均值mean,就是從總體中的一個獨立觀測樣本上估計而來)上添加一個界限或者可能性。

在這篇教程中,你會了解置信區間以及如何在實踐中計算置信區間。

學完本教程後,你會明白:

  • 置信區間是總體參數估計的一個界限
  • 我們可以直接計算分類方法估計能力的置信區間
  • 任意總體統計的置信區間都可以用bootstrap以一種分佈無關法(distribution-free)進行估計

我們開始吧。

教程概覽

本教程分為3個部分:

  • 什麼是置信區間
  • 分類精度(accuracy)的置信區間
  • 非參數(Nonparametric)置信區間

什麼是置信區間

置信區間是總體變量估計的界限,它是一個區間統計量,用於量化估計的不確定性。

深度解析機器學習中的置信區間(附代碼)

置信區間與容忍區間(tolerance interval)不同,後者描述從分佈中採樣的數據的邊界。它也不同於描述單一觀察值邊界的預測區間(prediction interval)。相反,對於總體參數,如平均值,標準差等等,置信區間提供了一個界限。

在應用機器學習中,我們可能想在展示一個預測模型的能力時使用置信區間。

例如,置信區間可以用來呈現分類模型的性能,可以這樣描述:給定樣本,範圍x到y覆蓋真實模型精度的可能性為95%。或者,在95%的置信水平下,模型精度是x+/-y。

置信區間也能在迴歸預測模型中用於呈現誤差,例如:範圍x到y覆蓋模型真實誤差的可能性有95%。或者,在95%的置信水平下,模型誤差是x+/-y。

選擇95%的置信度在展現置信區間時很常見,但是其他不那麼常見的值也會被使用,比如90%和99.7%。實踐中,你可以使用任何喜歡的值。

深度解析機器學習中的置信區間(附代碼)

95%的置信區間(CI)是根據我們的數據計算出的值區間,很可能包括我們對總體估計的真實值。

---Page 4, Introduction to the New Statistics: Estimation, Open Science, and Beyond, 2016.

置信區間的價值在於它能夠量化估計的不確定性。它提供了一個下限和上限以及一個可能性。作為單獨的半徑測量,置信區間通常被稱為誤差範圍,並可通過使用誤差圖來圖形化地表示估計的不確定性。

通常,得出估計的樣本越大,估計就越精確,置信區間也越小(越好)。

  • 更小的置信區間:更精確的估計
  • 更大的置信區間:不太精確的估計
深度解析機器學習中的置信區間(附代碼)

也可以說,CI透露給我們估計的精確程度,而誤差範圍是精度的衡量標準。一個短的CI意味著小的誤差範圍,說明我們有一個相對精確的估計[…],一個長的CI意味著大的誤差範圍,說明我們精度較低

---page 4, Introduction to the New Statistics: Estimation, Open Science, and Beyond, 2016

置信區間屬於稱為估計統計(estimation statistics)的統計學領域,估計統計用於表示和解釋實驗結果,可以替代或補充統計顯著性檢驗。

深度解析機器學習中的置信區間(附代碼)

估計提供了一種信息量更大的方式來分析和解釋結果。[…]瞭解和思考一個影響的大小和精度對於定量科學而言更有用,而不是先假設完全沒有影響,再考慮觀察到極值數據的概率。

---Estimation Statistics should replace Significance testing, 2016

在實踐中,比起統計顯著性檢驗,置信區間可能更受偏愛。

原因是它們更容易讓從業人員和利益相關者直接與具體領域相關聯。它們也可以被解釋並用於比較機器學習模型。

深度解析機器學習中的置信區間(附代碼)

這些不確定性估計在兩方面有幫助。首先,區間讓模型的使用者瞭解模型的好壞。[…]這樣一來,在比較不同模型時置信區間可以用於衡量證據的權重。置信區間的第二個好處是便於模型之間的權衡。如果兩個模型的置信區間明顯重疊,就表明兩者之間存在(統計)等價性,並可能提供理由來支持更簡潔或者更容易解釋的模型。

---Page 416, Applied Predictive Modeling, 2013.

現在我們已經知道了什麼是置信區間,讓我們看幾種給預測模型計算置信區間的方法。

分類精度的置信區間

分類問題是指給定一些輸入數據,預測它們的標籤或者類別結果變量。

通常用分類準確率(accuracy)或分類誤差(Error,與準確率相反)來描述分類預測模型的性能。例如,如果一個模型在75%的情況中對類別結果做出了正確預測,則模型的分類準確率為75%,計算公式如下:

accuracy = total correct predictions / total predictions made * 100

該準確率可以用模型從未見過的數據集計算,例如驗證集或測試集。

分類準確率或分類誤差是一個比例。它描述了模型所做的正確或錯誤預測的比例。每個預測都是一個二元決策,可能正確也可能錯誤。在技術上,這種方法被稱為伯努利審判(Bernoulli trial),因Jacob Bernoulli命名。伯努利審判中的比例具有一種特定的分佈,被稱為二項分佈。值得慶幸的是,對於大樣本量(例如超過30),我們可以用高斯分佈近似。

深度解析機器學習中的置信區間(附代碼)

在統計學中,一系列成功或失敗的獨立事件稱為伯努利過程。 [...]對於大N,這個隨機變量的分佈接近正態分佈。

---Page 148, Data Mining: Practical Machine Learning Tools and Techniques, Second Edition, 2005

我們可以使用比例(即分類準確度或誤差)的高斯分佈假設來輕鬆地計算置信區間。

在分類誤差的情況下,區間半徑可以這樣計算:

interval = z * sqrt( (error * (1 - error)) / n)

在分類準確率的情況,這樣計算:

interval = z * sqrt( (accuracy * (1 - accuracy)) / n)

公式中的interval是置信區間的半徑,error和accuracy是分類誤差和分類準確率,n是樣本大小,sqrt是平方根函數,z是高斯分佈的臨界值。用術語表述,這就是二項式比例置信區間。

高斯分佈中常用的臨界值及其相應的顯著性水平如下:

  • 1.64(90%)
  • 1.96(95%)
  • 2.33(98%)
  • 2.58(99%)

考慮在一個有50個樣本的驗證集上(n=50)誤差為20%的模型(error=0.2),我們可以這樣計算95%的置信區間(z=1.96):

# binomial confidence interval

from math import sqrt

interval = 1.96 * sqrt( (0.2 * (1 - 0.2)) / 50)

print('%.3f' % interval)

運行該示例,我們看到計算和打印的置信區間半徑。

0.111

  • 該模型的分類誤差為20%+/-11%
  • 模型的真實分類誤差可能在9%到31%之間

我們可以看到樣本量對置信區間半徑估計精度的影響。

# binomial confidence interval

interval = 1.96 * sqrt( (0.2 * (1 - 0.2)) / 100)

print('%.3f' % interval)

運行上述示例顯示置信區間下降到了7%左右,從而提高了模型性能估計的精度。

0.078

請記住,置信區間是一個範圍的可能性。 真正的模型性能可能在這個範圍之外。

深度解析機器學習中的置信區間(附代碼)

事實上,如果我們一遍一遍地重複這個實驗,每次採集一個包含新示例的新樣本S,我們會發現對於這些實驗的大約95%來說,計算的區間將覆蓋真實誤差。出於這個原因,我們把這個區間稱為95%置信區間估計

---Page 131, Machine Learning, 1997

Proportion_confint() statsmodels函數是二項比例置信區間的一個實現

默認情況下,它對二項分佈進行高斯假設,但是對其他更復雜的計算變種也支持。 該函數將成功次數(或失敗次數)、試驗總數以及顯著性水平作為參數,並返回置信區間的上下界。

下面的例子在假設的情況下演示了這個函數,其中一個模型從100個實例的數據集中做出88個正確的預測,並且我們對95%的置信區間(作為0.05的顯著性供給函數)感興趣。

from statsmodels.stats.proportion import proportion_confint

lower, upper = proportion_confint(88, 100, 0.05)

print('lower=%.3f, upper=%.3f' % (lower, upper))

運行示例輸出模型分類準確率的上下界:

lower=0.816, upper=0.944

非參數置信區間

通常我們不知道所選性能指標的分佈情況。或者,我們可能不知道計算性能分數置信區間的分析方法。

深度解析機器學習中的置信區間(附代碼)

參數型置信區間的假設經常不成立。預測變量有時不是正態分佈的,即使是,正態分佈的方差在預測變量的所有等級上可能也不相同。

---Page 326, Empirical Methods for Artificial Intelligence, 1995.

在這些情況下,bootstrap重採樣方法可以用作計算置信區間的非參數方法,名義上稱為bootstrap置信區間。

bootstrap是一種模擬蒙特卡羅方法,其中樣本是從固定的有限數據集中有放回的抽取出來的,並且在每個樣本上估計一個參數。該過程通過採樣得到了對真實總體參數的一個健壯的(robust)估計。

可以用下面的偽代碼來證明這一點:

statistics = []

for i in bootstraps:

sample = select_sample_with_replacement(data)

stat = calculate_statistic(sample)

statistics.append(stat)

這個過程可用於估計預測模型的性能,通過在每個樣本上擬合模型並估計模型在未包含於這些樣本中的樣本上的性能。然後可以將平均值或中位數性能視作該模型在未知數據上的性能估計。

可以通過從特定百分位數的性能分數樣本中選擇觀察值,將置信區間添加到此估計值中。

回想一下,百分位數是從排序好的樣本中抽取的觀測值,其中有相應百分比的樣本觀測值比它小。例如,樣本的70百分位表示70%的樣本低於該值。50百分位數是分佈的中位數。

首先,我們必須選擇置信水平的顯著性水平,例如95%,表示為5.0%(例如100-95)。由於置信區間是圍繞中位數對稱的,我們必須選擇2.5百分位和97.5百分位的觀察值來給出整個範圍。

我們可以通過一個實例來計算bootstrap置信區間。

假設我們有一個由均勻分佈產生的數據集,其中包含1,000個觀察值在0.5到1.0之間。

# generate dataset

dataset = 0.5 + rand(1000) * 0.5

我們將執行100次bootstrap過程,並從數據集中有放回的抽取1000個觀測樣本。 我們將把在bootstrap樣本上計算的統計量作為總體平均值的估計。這很容易成為一個模型的評估。

# bootstrap

scores = list()

for _ in range(100):

# bootstrap sample

indices = randint(0, 1000, 1000)

sample = dataset[indices]

# calculate and store statistic

statistic = mean(sample)

scores.append(statistic)

一旦我們獲得了bootstrap統計的樣本,我們就可以計算出中心趨勢。因為不對分佈做任何假設,我們將使用中位數或50百分位數。

print('median=%.3f' % median(scores))

然後我們可以計算置信區間作為以中位數為中心的觀察統計值的中間95%。

# calculate 95% confidence intervals (100 - alpha)

alpha = 5.0

首先,基於所選擇的置信區間來計算較低的百分位數。然後從bootstrap統計的樣本中提取出這個百分位的觀察值。

# calculate lower percentile (e.g. 2.5)

lower_p = alpha / 2.0

# retrieve observation at lower percentile

lower = max(0.0, percentile(scores, lower_p))

我們對置信區間的上界做同樣的事情。

# calculate upper percentile (e.g. 97.5)

upper_p = (100 - alpha) + (alpha / 2.0)

# retrieve observation at upper percentile

upper = min(1.0, percentile(scores, upper_p))

下面列出了完整的示例。

# bootstrap confidence intervals

from numpy.random import seed

from numpy.random import rand

from numpy.random import randint

from numpy import mean

from numpy import median

from numpy import percentile

# seed the random number generator

seed(1)

# generate dataset

dataset = 0.5 + rand(1000) * 0.5

# bootstrap

scores = list()

for _ in range(100):

# bootstrap sample

indices = randint(0, 1000, 1000)

sample = dataset[indices]

# calculate and store statistic

statistic = mean(sample)

scores.append(statistic)

print('50th percentile (median) = %.3f' % median(scores))

# calculate 95% confidence intervals (100 - alpha)

alpha = 5.0

# calculate lower percentile (e.g. 2.5)

lower_p = alpha / 2.0

# retrieve observation at lower percentile

lower = max(0.0, percentile(scores, lower_p))

print('%.1fth percentile = %.3f' % (lower_p, lower))

# calculate upper percentile (e.g. 97.5)

upper_p = (100 - alpha) + (alpha / 2.0)

# retrieve observation at upper percentile

upper = min(1.0, percentile(scores, upper_p))

print('%.1fth percentile = %.3f' % (upper_p, upper))

運行示例總結了bootstrap樣本統計的分佈,包括2.5,50(中位數)和97.5百分位數。

50th percentile (median) = 0.750

2.5th percentile = 0.741

97.5th percentile = 0.757

然後,我們可以使用這些觀察結果對樣本分佈做出聲明,例如:

有95%的可能性以0.741至0.757的範圍涵蓋了真實的統計中位數。

擴展

本節列出了一些有幫助的想法,如果您希望對本教程內容擴展:

  • 在您自己的小型測試數據集上測試每個置信區間方法。
  • 查閱3篇論文,它們展示了置信區間的不同使用方法
  • 編寫一個函數來計算給定的機器學習模型性能分數樣本的bootstrap置信區間。

進一步閱讀

如果您希望深入瞭解,本節提供了有關該主題的更多資源。

Posts

How to Report Classifier Performance with Confidence Intervals

How to Calculate Bootstrap Confidence Intervals For Machine Learning Results in Python

Understand Time Series Forecast Uncertainty Using Confidence Intervals with Python

Books

Understanding The New Statistics: Effect Sizes, Confidence Intervals, and Meta-Analysis, 2011.

Introduction to the New Statistics: Estimation, Open Science, and Beyond, 2016.

Statistical Intervals: A Guide for Practitioners and Researchers, 2017.

Applied Predictive Modeling, 2013.

Machine Learning, 1997.

Data Mining: Practical Machine Learning Tools and Techniques, Second Edition, 2005.

An Introduction to the Bootstrap, 1996.

Empirical Methods for Artificial Intelligence, 1995.

Papers

Estimation statistics should replace significance testing, 2016.

Bootstrap Confidence Intervals, Statistical Science, 1996.

API

statsmodels.stats.proportion.proportion_confint() API

numpy.random.rand() API

numpy.random.randint() API

numpy.random.seed() API

numpy.percentile() API

numpy.median() API

Articles

Interval estimation on Wikipedia

Confidence interval on Wikipedia

Binomial proportion confidence interval on Wikipedia

Confidence interval of RMSE on Cross Validated

Bootstrapping on Wikipedia

總結

在本教程中,你探索了置信區間以及如何在實踐中計算置信區間。

具體來說,你學會了:

  • 置信區間是總體參數估計的界限。
  • 可以直接計算分類方法的估計性能的置信區間
  • 任何總體統計數據的置信區間都可以使用bootstrap以分佈無關方式進行估算。

你有任何問題嗎?

在下面的評論中提出問題,我會盡我所能來回答。

原文標題:

Confidence Intervals for Machine Learning

原本鏈接:

https://machinelearningmastery.com/confidence-intervals-for-machine-learning/

譯者簡介

深度解析機器學習中的置信區間(附代碼)

和中華,留德軟件工程碩士。由於對機器學習感興趣,碩士論文選擇了利用遺傳算法思想改進傳統kmeans。目前在杭州進行大數據相關實踐。加入數據派THU希望為IT同行們儘自己一份綿薄之力,也希望結交許多志趣相投的小夥伴。


分享到:


相關文章: