高斯過程Gaussian Processes(GP)是一種通用的有監(jiān)督學習方法,旨在解決回歸和概率分類問題。
高斯過程的優(yōu)點是:
高斯過程的缺點包括:
GaussianProcessRegressor
類實現了回歸情況下的高斯過程(GP)模型。 為此,需要實現指定GP的先驗。當參數 normalize_y=False
時,先驗的均值通常假定為常數或者零(當 normalize_y=False
),或者訓練數據的均值(normalize_y=True
)。而先驗的方差通過傳遞 kernel 對象來指定。通過最大化基于傳遞的 optimizer
的對數邊際似然(LML),內核的超參數可以在高斯過程回歸執(zhí)行擬合過程中被優(yōu)化。由于 LML 可能會存在多個局部最優(yōu)解,因此優(yōu)化過程可以通過指定 n_restarts_optimizer
參數進行多次重復。通過設置內核的超參初始值來進行第一次優(yōu)化的運行。后續(xù)的運行過程中超參值都是從合理范圍值中隨機選取的。如果需要保持初始化超參值, 那么需要把優(yōu)化器設置為 None
。
目標變量中的噪聲級別通過參數 alpha
來傳遞并指定,要么全局是常數要么是一個數據點。 請注意,適度的噪聲水平也可以有助于處理擬合期間的數字問題,因為它被有效地實現為吉洪諾夫正則化(Tikhonov regularization), 即通過將其添加到核心矩陣的對角線。明確指定噪聲水平的替代方法是將 WhiteKernel 組件包含在內核中, 這可以從數據中估計全局噪聲水平(見下面的示例)。
算法實現是基于 [RW2006]中的算法 2.1 。除了標準 scikit-learn 估計器的 API 之外, GaussianProcessRegressor 的作用還包括:
sample_y(X)
, 其評估在給定輸入處從 GPR (先驗或后驗)繪制的樣本。log_marginal_likelihood(theta)
, 可以在外部使用其他方式選擇超參數,例如通過馬爾科夫鏈蒙特卡羅鏈(Markov chain Monte Carlo)。該示例說明具有包含 WhiteKernel 的和核(sum-kernel)的 GPR 可以估計數據的噪聲水平。 對數邊際似然(LML)的圖示表明存在 LML 的兩個局部最大值。
第一個模型對應于一個高噪聲級和大長度尺度的模型,它解釋了噪聲對數據的所有變化。
第二種方法噪聲水平較小,長度尺度較短,主要由無噪聲函數關系解釋。第二個模型具有較高的可能性,但是,根據超參數的初始值,基于梯度的優(yōu)化也可能收斂到高噪聲的解。因此,對于不同的初始化,多次重復優(yōu)化是很重要的。
內核嶺回歸(KRR)和GPR都是通過在內部使用“核技巧”來學習目標函數的。KRR在相應核誘導的空間中學習一個線性函數,該函數對應于原始空間中的一個非線性函數?;趲X正則化的均方誤差的損失,選擇核空間中的線性函數。GPR利用核函數定義目標函數上先驗分布的協方差,并利用觀測到的訓練數據定義似然函數。基于貝葉斯定理(Bayes theorem),定義了目標函數上的(高斯)后驗分布,其均值用于預測。
一個主要的區(qū)別是,GPR可以基于邊緣似然函數的梯度上升來選擇核的超參數,而KRR需要對交叉驗證的損失函數(均方誤差損失)執(zhí)行網格搜索。另一個不同之處在于,GPR學習目標函數的生成概率模型,因此可以提供有意義的置信區(qū)間和后驗樣本以及預測,而KRR只提供預測。
下圖說明了人工數據集上的兩種方法,該數據集由一個正弦目標函數和強噪聲組成。該圖比較了KRR模型和基于ExpSineSquared核的GPR的模型,ExpSineSquared核適用于學習周期函數 。核的超參數控制核的光滑性(長尺度)和周期性(周期性)。此外,數據的噪聲水平是由GPR通過內核中附加的WhiteKernel成分和KRR的正則化參數α顯式地獲得的。
該圖顯示,這兩種方法都學習了目標函數的合理模型。GPR正確地識別出函數的周期約為2?π(6.28),而KRR選擇的周期為2倍周期4?π?;诖?,GPR為KRR的預測提供了合理的置信邊界。這兩種方法的一個主要區(qū)別是擬合和預測所需的時間:原則上, 雖然擬合KRR在是快速的,但網格搜索的超參數優(yōu)化規(guī)模與超參數的數量成指數關系(“維數詛咒”)。基于梯度優(yōu)化的GPR參數不受這種指數標度的影響,因此在這個具有三維超參數空間的例子中,速度要快得多。預測的時間是相似的,然而,GPR產生預測分布的方差要比僅僅預測平均值花費的時間要長得多。
此示例基于[RW2006]第5.4.3節(jié)。給出了一個基于對數邊際似然梯度上升的復雜核工程和超參數優(yōu)化的實例。這些數據包括1958年至1997年期間在夏威夷莫納洛阿觀測站收集的大氣二氧化碳平均濃度(按體積計算,以百萬分之數(Ppmv)計)。目的是模擬二氧化碳濃度隨時間t的變化。
核由幾個術語組成,它們負責解釋信號的不同屬性:
一個長期的,平穩(wěn)的上升趨勢可以用RBF核來解釋。長尺度較大的徑向基函數(RBF)內核強制成平滑,沒有強制趨勢上升,這就留給GP選擇。長度、比例尺和振幅是自由的超參數。
季節(jié)性因素,由定期的 ExpSineSquared 內核解釋,固定周期為1年。 該周期分量的長度尺度控制其平滑度是一個自由參數。 為了使準確周期性的衰減,采用帶有RBF內核的產品。 該RBF組件的長度尺寸控制衰減時間,并且是另一個自由參數。
較小的中期不規(guī)則性將由 RationalQuadratic 核來解釋, RationalQuadratic 內核組件的長度尺度和 alpha 參數決定長度尺度的擴散性。 根據[RW2006],這些不規(guī)則性可以更好地由 RationalQuadratic 來解釋, 而不是 RBF 核,這可能是因為它可以容納幾個長度尺度。
“noise(噪聲)” 一詞,由一個 RBF 內核貢獻組成,它將解釋相關的噪聲分量,如局部天氣現象以及 WhiteKernel 對白噪聲的貢獻。 相對幅度和RBF的長度尺度是進一步的自由參數。
在減去目標平均值后最大化對數邊際似然產生下列內核,其中LML為-83.214:
34.4**2 * RBF(length_scale=41.8)
+ 3.27**2 * RBF(length_scale=180) * ExpSineSquared(length_scale=1.44,
periodicity=1)
+ 0.446**2 * RationalQuadratic(alpha=17.7, length_scale=0.957)
+ 0.197**2 * RBF(length_scale=0.138) + WhiteKernel(noise_level=0.0336)
因此,大多數目標信號(34.4ppm)由長期上升趨勢(長度為41.8年)解釋。 周期分量的振幅為3.27ppm,衰減時間為180年,長度為1.44。 長時間的衰變時間表明我們在當地非常接近周期性的季節(jié)性成分。 相關噪聲的幅度為0.197ppm,長度為0.138年,白噪聲貢獻為0.197ppm。 因此,整體噪聲水平非常小,表明該模型可以很好地解釋數據。 該圖還顯示,該模型直到2015年左右才能做出置信度比較高的預測
GaussianProcessClassifier
將高斯過程(GP)用于分類,更具體地說,用于概率分類,其中測試預測采用類概率的形式。高斯過程分類器將GP放在一個隱函數上,然后通過一個鏈接函數來獲得概率分類。隱函數是一種所謂的干擾函數( nuisance function),它的值是不被觀察到的,并且它們本身并不相關。其目的是為了方便地制定模型,并在預測過程中刪除(整合)。GaussianProcessClassfier實現了邏輯鏈函數,它不能解析地計算積分,但在二進制情況下很容易逼近。
與回歸設置相反,即使設置了高斯過程先驗,隱函數的后驗也不符合高斯分布, 因為高斯似然不適用于離散類標簽。相反,使用的是與邏輯鏈接函數對應的非高斯似然。 GaussianProcessClassifier 通過拉普拉斯近似(Laplace approximation)來估計非高斯后驗分布。 更多詳細信息,請參見[RW2006]的第 3 章。
GP先驗平均值假定為零。先驗的協方差是通過傳遞kernel對象來指定的。 在通過最大化基于傳遞的對數邊際似然(LML)的 GaussianProcessRegressor 擬合期間, 優(yōu)化內核的超參數 optimizer
。由于LML可能具有多個局部最優(yōu)值, 所以優(yōu)化器可以通過指定 n_restarts_optimizer
進行重復。 第一次運行始終從內核的初始超參數值開始執(zhí)行; 從已經從允許值的范圍中隨機選擇超參數值來進行后續(xù)運行。 如果初始超參數需要保持固定,None
可以傳遞給優(yōu)化器。
GaussianProcessClassifier
通過執(zhí)行基于OvR(one-versus-rest)或 OvO(one-versus-one )策略的訓練和預測來支持多類分類。 在OvR(one-versus-rest)策略中,每個類都配有一個二分類高斯過程分類器,該類別被訓練為將該類與其余類分開。 在 “one_vs_one” 中,對于每對類擬合一個二進制高斯過程分類器,這被訓練為分離這兩個類。 這些二分類的預測的預測被組合成多類預測。更多詳細信息,請參閱multi-class classification 。
在高斯過程分類的情況下,”one_vs_one” 策略可能在計算上更廉價, 因為它只決涉及整個訓練集的一個子集的許多問題, 而不是整個數據集的較少的問題。由于高斯過程分類與數據集的大小相互立方,這可能要快得多。 但是,請注意,”one_vs_one” 不支持預測概率估計,而只是簡單的預測。 此外,請注意, GaussianProcessClassifier
在內部還沒有實現真正的多類拉普拉斯逼近, 但如上所述,在解決內部二分類任務的,基于的是使用one-versus-rest 或者 one-versus-one方法。
這個例子說明了在不同的超參數選擇下,RBF核的GPC的預測概率。第一個圖顯示了具有任意選擇的超參數和對應于最大對數邊際似然(LML)的超參數的GPC的預測概率。
雖然通過優(yōu)化LML選擇的超參數具有相當大的LML,但根據測試數據的日志丟失情況,它們的性能稍差。 圖中顯示,這是因為它們在類邊界上出現了類概率的急劇變化(這是好的),但是預測的概率接近于離類邊界近0.5(這是不好的),這種不良影響是由GPC內部使用的拉普拉斯逼近引起的。
第二個圖顯示了內核的超參數的不同選擇的日志邊緣可能性,突出顯示了在第一個圖形中使用黑點的兩個超參數選擇。
此示例說明XOR數據上的GPC。比較了固定、各向同性核(RBF
)和非固定核(DotProduct
)。在這個特定的數據集上,DotProduct
內核獲得了更好的結果,因為類邊界是線性的,并且與坐標軸重合。然而,在實踐中,像 RBF
這樣的固定內核往往獲得更好的結果。
該示例說明了用于iris數據集的二維版本上各向同性和各向異性RBF核的GPC的預測概率。 這說明了GPC對多類分類的適用性。 各向異性RBF內核通過為兩個特征維度分配不同的長度尺度來獲得稍高的LML(對數邊際似然)。
核(也稱GPs中的協方差函數)是GPs的一個重要組成部分,它決定GP的先驗和后驗形狀。它們通過定義兩個數據點的“相似性”,并結合相似的數據點應該具有相似的目標值的假設,對正在學習的函數進行編碼。內核可以分為兩類:固定內核,只取決于兩個數據點的距離, 不依賴于它們的絕對值 , 因此它們對于輸入空間中的轉換是不變的;非固定的內核,取決于數據點的具體值。固定內核可以進一步細分為各向同性和各向 異性內核,其中各向同性內核不會在輸入空間中旋轉。有關更多細節(jié),我們參考[RW2006]第4章。關于如何最佳組合不同內核,我們可以參考[Duv2014]。
內核 Kernel
的主要用途是計算數據點之間的GP協方差。為此,可以調用內核的方法__call__
_。該方法既可用于計算二維數組X中所有成對數據點的“自協方差”,也可用于計算二維數組X與二維數組Y中的成對數據點的所有組合的“交叉協方差”。以下恒等式適用于所有內核k( WhiteKernel
除外):k(X) == K(X, Y=X)
如果只使用自協方差的對角線,則可以調用內核的diag()
方法,這比對___call__
: np.diag(k(X, X)) == k.diag(X)
的等效調用計算效率更高。
核由超參數的向量參數化。例如,這些超參數可以控制內核的長度、尺度或周期(見下文)。所有內核都支持計算內核相對于的自協方差的分析梯度,方法是在__call__
方法中設置eval_gradient=True
。這一梯度被高斯過程(包括回歸者和分類器)用于計算對數邊際似然的梯度,而后者又被用來確定的值,該值通過梯度上升來最大化對數邊際似然。對于每個超參數,在創(chuàng)建內核實例時需要指定初始值和邊界。可以通過內核對象的屬性theta
獲取和設置的當前值。此外,可以通過內核的bounds
屬性來訪問超參數的邊界。請注意,這兩個屬性(theta 和 bounds)都返回內部使用的值的對數轉換值,因為這些值通常更適合基于梯度的優(yōu)化。每個超參數的規(guī)范以Hyperparameter
實例的形式存儲在各自的內核中。請注意,使用名稱為“x”的超參數的內核必須具有屬性sel.x和self.x_bounds。
所有內核的抽象基類都是 Kernel
。內核實現了與Estimator
類似的接口,提供了get_params()
、set_params()
和clone()
方法。這還允許通過元估值器(如Pipeline
or GridSearch
)設置內核值。注意,由于內核的嵌套結構(通過應用內核運算符,請參見下面),內核參數的名稱可能變得相對復雜。通常,對于二進制核運算符,左操作數的參數以K1__
為前綴,右操作數的參數以K2_
為前綴。另一種方便的方法是clone_with_theta(theta)
,它返回內核的克隆版本,但超參數設置為theta
。一個例子進行說明:
>>> from sklearn.gaussian_process.kernels import ConstantKernel, RBF
>>> kernel = ConstantKernel(constant_value=1.0, constant_value_bounds=(0.0, 10.0)) * RBF(length_scale=0.5, length_scale_bounds=(0.0, 10.0)) + RBF(length_scale=2.0, length_scale_bounds=(0.0, 10.0))
>>> for hyperparameter in kernel.hyperparameters: print(hyperparameter)
Hyperparameter(name='k1__k1__constant_value', value_type='numeric', bounds=array([[ 0., 10.]]), n_elements=1, fixed=False)
Hyperparameter(name='k1__k2__length_scale', value_type='numeric', bounds=array([[ 0., 10.]]), n_elements=1, fixed=False)
Hyperparameter(name='k2__length_scale', value_type='numeric', bounds=array([[ 0., 10.]]), n_elements=1, fixed=False)
>>> params = kernel.get_params()
>>> for key in sorted(params): print("%s : %s" % (key, params[key]))
k1 : 1**2 * RBF(length_scale=0.5)
k1__k1 : 1**2
k1__k1__constant_value : 1.0
k1__k1__constant_value_bounds : (0.0, 10.0)
k1__k2 : RBF(length_scale=0.5)
k1__k2__length_scale : 0.5
k1__k2__length_scale_bounds : (0.0, 10.0)
k2 : RBF(length_scale=2)
k2__length_scale : 2.0
k2__length_scale_bounds : (0.0, 10.0)
>>> print(kernel.theta) # Note: log-transformed
[ 0. -0.69314718 0.69314718]
>>> print(kernel.bounds) # Note: log-transformed
[[ -inf 2.30258509]
[ -inf 2.30258509]
[ -inf 2.30258509]]
所有的高斯過程核都可以與sklearn.metrics.pairwise
互操作,反之亦然:內核的子類的實例可以作為metric
傳遞給 sklearn.metrics.pairwise
中的pairwise_kernels
。此外,可以通過使用包裝器類 PairwiseKernel
,可以將來自的pairwise內核函數用作GP內核。唯一的警告是,超參數的梯度不是解析的,而是數值的,所有這些核都只支持各向同性距離。參數gamma
被認為是一個超參數,可以被優(yōu)化。其他內核參數在初始化時直接設置,并保持固定。
ConstantKernel
內核可以用作 Product
內核的一部分,它可以縮放其他因素(內核)的大小,也可以作為Sum
內核的一部分,其中它調整了高斯過程的平均值。它取決于參數 constant_value。它的定義是:
WhiteKernel
內核的主要用例是 sum-kernel 的一部分,它解釋了信號的噪聲部分。調整其參數noise_level對應于估計其噪聲水平。它的定義是:
內核運算符獲取一個或兩個基本內核,并將它們組合成一個新的內核。 Sum
核取兩個核和,并通過組合它們。Product
內核采用兩個內核和 ,并通過組合它們。Exponentiation
核取一個基本核和一個標量參數,通過組合它們,注意在核對象上重寫了魔術方法___add__
, __mul___
和 __pow__
,因此可以使用例如RBF() + RBF()
作為 Sum(RBF(), RBF())
的快捷方式。
RBF
核是一個穩(wěn)定的核函數。它也被稱為“平方指數”核。它由一個長度尺度參數參數來參數化,它既可以是一個標量(核的各向同性變體),也可以是一個與輸入x(核的各向異性變量)相同維數的向量。內核由以下幾個方面提供:
其中是歐氏距離。這個核是無窮可微的,這意味著以這個核作為協方差函數的GPs具有所有階的均方導數,因此是非常光滑的。由RBF核產生的GP的先驗和后驗如下圖所示:
Matern
核是一個平穩(wěn)核,是RBF
核的推廣。它有一個額外的參數,它控制結果函數的光滑性。它由一個長度尺度參數參數來參數化,它既可以是一個標量(核的各向同性變體),也可以是一個與輸入x(核的各向異性變量)相同維數的向量。該核由以下幾個方面提供:
其中是歐氏距離,是修正的 Bessel 函數,是伽馬函數。隨著,Matérn核收斂于徑向基函數核(RBF)。當時,Matérn核與絕對指數核(absolute exponential kernel)相同,即,
特別地, :
并且,:
學習函數的流行選擇不是無限可微(由徑向基函數核(RBF)假設),而是至少一次()或兩次可微()。
通過控制學習函數的光滑性的靈活性允許適應真正的底層函數關系的性質。由Matérn核產生的GP的先驗和后驗如下圖所示:
有關Matérn內核的不同變體的更多詳細信息,請參見 [RW2006],pp 84。
RationalQuadratic
(有理二次核)可以看作是具有不同特征長度尺度的 RBF
核的尺度混合(無限和)。它由長度尺度參數和尺度混合參數來參數化,此時只支持各向同性變量,其中是標量。該核由下式給出:
由 RationalQuadratic
產生的GP的先驗和后驗如下圖所示:
ExpSineSquared
內核允許對周期性函數進行建模。它由長度尺度參數和周期參數來參數化.現在只有各向同性變量,其中是標量。該核由以下幾個方面提供:
由ExpSineSquared內核產生的GP的先驗和后驗如下圖所示:
DotProduct
核是非平穩(wěn)的,可以通過在線性回歸的系數上加上的先驗和在偏置上加上的先驗得到。 DotProduct
核不受原點坐標旋轉的影響,但不是轉換。它由參數參數化。對于,內核被稱為齊次線性核,否則它是非齊次的。內核由下式給出:
DotProduct
核通常與指數結合在一起。指數為2的示例如下圖所示:
RW2006(1,2,3,4,5,6) Carl Eduard Rasmussen and Christopher K.I. Williams, “Gaussian Processes for Machine Learning”, MIT Press 2006, Link to an official complete PDF version of the book here .
Duv2014 David Duvenaud, “The Kernel Cookbook: Advice on Covariance functions”, 2014, Link .
更多建議: