
泛化能力(generalization ability)指的是模型在訓練資料上學習到的模式能夠應用於未見過的測試資料的能力。而在PAC 學習中,我們著重的是如何在有限的訓練樣本上找到一個「大概正確」的模型。
PAC 理論的基本概念:
PAC 理論的目標是找到一個假設 h ,使得它在樣本分佈 D 上的錯誤率(即泛化誤差Generalization Error)足夠小。
所以我們想找到一個模型 h ,使
P(errorD(h) > ϵ) ≤ δ
表示對於一個給定的容許誤差 ϵ 和失敗概率 δ ,我們希望模型在整個資料分佈上的錯誤率不會超過 ϵ 的概率至少為 1 − δ 。
PAC 可學習:如果存在一個學習演算法,對任意 ϵ 和 δ ,它可以在有限的樣本數內找到一個使得 P(errorD(h) > ϵ) ≤ δ 的假設 h,我們就會稱這個學習問題是 PAC 可學習的。
樣本複雜度:PAC 理論也說明,為了保證學習一個「大概正確」的模型,所需的最小訓練樣本數量與 ϵ 和 δ 成反比。
PAC 學習的重要參數
ϵ(epsilon)容許誤差
- ϵ 是模型的容許誤差,即在泛化時,模型的預測結果和真實結果之間的最大允許偏差。
- 也可以說 ϵ 定義了模型的泛化誤差(Generalization Error)。
- 我們希望模型在訓練過程中學到的知識能夠在未見過的測試數據上保持一定的正確性
- 所以 ϵ 表示我們可以容忍的錯誤率上限。
- 例如,若 ϵ = 0.05,就表示我們期望模型在泛化過程中的錯誤率不超過 5%。
δ(delta)失敗概率
- δ 是模型失敗的概率,也就是模型在學習過程中未能找到一個滿足 ϵ 條件的模型 的概率。
- 它量化了模型的學習是否成功的可靠程度。
- 換句話說, δ 表示當我們從數據中學習一個模型時,有多大的概率模型在測試數據上不符合我們期望的誤差 ϵ 。
- 表示我們希望模型學習出來的結果中,只有最多 δ 的概率會超過 ϵ 的容許誤差。
- 例如,若 δ = 0.01,表示我們希望有 99% 的概率模型的泛化誤差不會超過 ϵ 。
VC 維度(Vapnik-Chervonenkis Dimension)
是衡量模型複雜度的一個指標,簡單的說,它表示模型能夠「完全打散」(正確分類)樣本的最大數量。VC 維度越高,模型越複雜,學習能力越強,但是更容易過擬合(Overfitting)。
更多有關VC 維度的討論可以到機器學習模型的複雜度估計方法(VC 維度)參考閱讀。
PAC 學習的範例
這裡會生成一個二元分類的資料集,資料數量是1000,並且含有20個特徵,特徵中有15項是較為重要的資訊性特徵,對於分類的預測較有幫助,另外5個特徵則是是冗餘或干擾特徵。
我使用三種模型進行估計,包含SVM、Decision Tree以及Random Forest,需要執行程式碼可以到我的colab執行程式。
# 安裝需要的套件
import numpy as np
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from math import log, ceil
# 生成二元分類資料集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_classes=2, random_state=28)
# 分割訓練和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=28)
# 計算 PAC 樣本複雜度
def calculate_pac_sample_complexity(epsilon, delta, vc_dimension):
return ceil((1 / epsilon) * (log(1 / delta) + vc_dimension))
# 假設我們想要的錯誤率和失敗概率
epsilon = 0.05 # 允許的最大誤差
delta = 0.05 # 失敗概率
# 假設的 VC 維度可以簡單地設定為特徵數量對於線性模型,決策樹和隨機森林有更高的複雜度
vc_dimension_svm = X_train.shape[1] # SVM(線性核)近似為特徵數量
vc_dimension_decision_tree = 2 * X_train.shape[1] # Decision Tree 假設複雜度高於線性模型,並考慮樹的深度(depth)
vc_dimension_random_forest = 10 * X_train.shape[1] # Random Forest 假設更多維度,因為使用的是更多的決策樹
# 計算所需的樣本數
sample_complexity_svm = calculate_pac_sample_complexity(epsilon, delta, vc_dimension_svm)
sample_complexity_decision_tree = calculate_pac_sample_complexity(epsilon, delta, vc_dimension_decision_tree)
sample_complexity_random_forest = calculate_pac_sample_complexity(epsilon, delta, vc_dimension_random_forest)
# 打印不同模型的樣本數需求
print(f"SVM 所需的最小樣本數: {sample_complexity_svm}")
print(f"Decision Tree 所需的最小樣本數: {sample_complexity_decision_tree}")
print(f"Random Forest 所需的最小樣本數: {sample_complexity_random_forest}")
SVM 所需的最小樣本數: 460
Decision Tree 所需的最小樣本數: 860
Random Forest 所需的最小樣本數: 4060
討論
我們可以看到線性模型對於資料數量的估計較為小,但是基於樹狀結構的模型則是估計出大約800~4000的資料量,這表示樹狀的模型可以求出更加細緻的預測結果,但是同時也需要考慮到模型過度擬合(Overfitting)的風險,我將在其他篇文章當中進一步說明如何更好的估計有效的VC維度。
PAC學習估計方法更加重要的是對於最大誤差 ϵ 和失敗概率 δ 的設定,若是設定的較為寬鬆,則需要較少的資料量進行學習;若是設定的更為嚴苛,則會需要更大的資料量進行建模,還是會需要視不同的資料狀態進行設計,並交叉實驗才能得到最好的結果。
