機器學習 8 個核心概念

在機器學習實踐中會遇到幾個核心的概念,它們對建模起到至關重要的作用,下文列舉了:損失函數與正則化、欠擬合 - 過擬合和偏差 - 方差、交叉驗證、數據泄漏等

損失函數和正則化

筆者初學機器學習時被一個同事問倒了:“機器學習僅通過損失函數加一個正則項就能進行學習,太不科學了,是什麼原理”?

讓我們回顧一下 1.2.2 節的機器學習的基礎理論。已知機器學習的一種學習範式是權衡經驗風險和結構風險,第 1 章的式(1-2)是爲了方便描述的一種簡化寫法,表明了損失和正則構成了機器學習的目標。

目標函數

上式是一種常見和直觀的寫法,理論上來說,最終的損失由損失函數 L 和其聚合方式共同決定,例如此處聚合爲均值,理論上也可以聚合最大值或其他統計量。另外,當上下文將損失函數和代價函數區分開來時,區別如下:

大量的機器學習算法基於上述範式學習。那什麼是損失函數呢?

損失函數是一種評估算法對訓練數據集擬合好壞程度的方法,是一種類似距離的度量方法,它必須反映實際情況或表達經驗,其值非負,一般值越大表明擬合得越差。例如,如果預測完全錯誤,那麼損失函數值將很大,反之損失函數值很小。按照這個思路,我們試着先寫出誤差函數。

設(X,y)爲向量 X 對應的 y,同時假設機器學習獲得了一個分類器的模型 F,F 的輸入爲向量 X,輸出爲 y'。則可以很自然地定義式(4-2)所示的誤差函數。該誤差函數的含義很明顯,即當預測值等於真實值時,誤差爲 0,否則爲 1。

表示的是單個樣例的損失,對於整個樣本集的誤差可表示爲其求和。

如果值很小或爲 0,則表示分類模型 F 的經驗誤差風險很小,而值很大則表示經驗誤差風險很大。機器學習的目標就是在指定的假設空間 F 中尋找合適的參數ω,使得式(4-3)達到最小——最小化經驗風險。這是一個優化問題,但上述表達式由於不連續、不可導,所以在數學上並不方便優化求解。

轉換問題求解的思路:如能找到一個與上述問題有關的,但其數學性質好,便於求解的函數,那麼該問題便迎刃而解。損失函數就是解決該問題的關鍵,例如要求損失函數具有良好的數學性質,比如連續、可導、凸性等,是待求解問題的上界等,當樣本量趨於無窮時兩者能達到一致性,如此通過優化損失函數就能間接求解原問題,此時損失函數就是針對原目標的數學模型,是對現實世界的建模,也是真實問題的代理。正因爲此,可以說損失函數是現今機器學習的基礎,是連接理論到實踐的橋樑

不同的損失函數關注了現實問題不同的方面,例如有的損失函數具有對稱性(正負誤差對稱),而有的損失函數更關注某一類誤差,有的關注整體效果,有的關注排序。實踐中除了關注數學性質外,可能還需關注損失函數的計算成本、對異常值是否敏感等。

線性迴歸損失

線性迴歸中常用的損失函數有:平方損失和平均絕對損失。實際應用中分別爲均方誤差 MSE(Mean Squared Error) 和平均絕對誤差 MAE(Mean Absolute Error),又稱 L2 和 L1 損失。

MSE 表示預測值與目標值之差的平方和,基於歐式距離,計算簡單且具有凸性。

MAE 表示預測值與目標值之差絕對值,該函數導數不連續。

def mse(yi, fi):  
    return np.sum((yi - fi)**2)

def mae(yi, fi):
    return np.sum(np.abs(yi - fi))/yi.size

MSE 隨着誤差的增加,損會失以平方指數增加,而 MAE 則爲線性增加。當數據集中存在較多異常值時,MSE 會導致模型的整體性能下降,MAE 則更爲平穩,對異常值的魯棒性更好;一般情況下,在數據分析和處理階段會對異常值進行處理,此時 MSE 是更好的選擇。爲了避免 MAE 和 MSE 的缺點,我們有改進版本的 Huber 損失函數

mse mae huber

詳細請參考 4.2 節

Hinge 損失函數

Hinge 常見於支持向量機中。當預測值和真實值乘積大於 1 時,損失爲 0,否則爲線性損失。Hinge 是 0-1 誤差的上界

hinge

def Huber(yi, fidelta=2.):
    return np.where(np.abs(yi-fi) < delta,.5*(yi-fi)**2 , delta*(np.abs(yi-fi)-0.5*delta))

指數損失

爲連續可導凸函數,數學性質非常好,常見於 AdaBoost 算法中。當預測值和真實值類別標號不一致時對學習的懲罰力度非常大(指數力度),否則,符號一致且乘積較大時,懲罰非常小

eloss

# Python 代碼實現

def Hinge(yi, fi):
    return np.max(0, 1 - fi * yi)

交叉熵損失

又稱對數損失,該函數爲連續可導凸函數,數學性質非常好,常見於邏輯迴歸中。在正標籤下(+1),當預測概率接近 1 時懲罰幾乎爲 0,但當預測概率趨向於 0 時,懲罰非常大。負標籤情況類似,曲線對稱

其 Python 實現爲:

def CrossEntropy(yi, fi):
    if yi == 1:
        return -np.log(fi)
    else:
        return -np.log(1 - fi)

logloss

正則化

從第 1 章可知,正則損失最小化是機器學習範式的一種實現,正則項作爲算法的 “穩定劑”,起到了懲罰和控制模型的複雜度的作用,是防止過擬合的經典方法,也符合奧卡姆剃刀原則。正則化項爲了表徵模型複雜度,要求正則化的值隨模型複雜度增大而增大,這樣才能在最小化優化過程中起到懲罰的作用!

下面列舉了幾個常見模型的正則項。

1)迴歸模型:如圖 4-11 所示。L1 範數的懲罰項又稱爲 Lasso 迴歸(一般翻譯爲套索迴歸),其值爲各項係數絕對值的和;L2 範數的懲罰項又稱爲 Ridge 迴歸(一般翻譯爲嶺迴歸),其值爲各項係數平方的和;ElasticNet 直譯爲彈性網絡,是 L1 和 L2 的線性組合

2)在決策樹模型中,以葉子結點個數∣T∣作爲正則項

3)XGBoost 中正則項如式(4-10)所示,T 指葉子結點的數量,ω指葉子結點的得分值

從數學角度看上述的正則項,是多維向量到低維的一種映射

不同的正則項,其優化求解算法和計算效率也不相同,實踐中注意結合樣本量權衡。例如 sklearn 的邏輯迴歸中 L1 使用座標下降算法 (Coordinate Descent),L2 則有多種選擇:“lbfgs” “sag” 和 “newton-cg”,分別對應擬牛頓(Quasi-Newton)、隨機平均梯度下降(Stochastic Average Gradient descent)和牛頓法,而 ElasticNet 使用隨機梯度下降法(Stochastic Gradient Descent)。而對於大數據集(樣本量大和特徵多)來說,隨機梯度分類和迴歸器效率更高(SGDClassifier 和 SGDRegressor)

欠擬合 - 過擬合和偏差 - 方差

前文一直提到機器學習建模是權衡的過程,4.2.1 節的正則化就是調節欠擬合 (Underfitting) 與過擬合(Overfitting)的有效手段。

過擬合指的是,模型對訓練數據過度學習(例如學習了數據中不該學習的噪聲),使得模型在訓練集上表現很好,而在測試集上表現很差的現象(不能推廣 / 泛化到新數據集)。

欠擬合指的是,模型對訓練數據學習不充分,模型性能表現很差。但該定義並沒有給出具體的差異閾值表明是否過擬合或欠擬合,這對實踐的指導意義打了一些折扣

在最小化經驗風險的學習範式下,機器學習優化算法的目標是最小化誤差。訓練模型、調優模型的過程就是算法和訓練數據集 “較勁” 的過程,如 1.2.2 節學習理論所述的 “在有限的樣本下,一旦設定學習目標就有過擬合的風險”。所以機器學習更多的是關注過擬合。

validation_curve 判斷是否欠擬合 - 過擬合。Sklearn 中提供的 learning_curve,實踐中用於在模型效果表現不好的場景下,查看是否由於樣本量過小而造成模型偏差 - 方差過大,見 4.1.8 節。

與欠擬合 - 過擬合不同的是,偏差 - 方差 (Bias- Variance) 從理論層面對泛化誤差進行分解和研究。

偏差、方差和噪聲

偏差刻畫了學習算法本身的擬合能力,方差刻畫了數據擾動造成的波動,噪聲刻畫了學習問題本身的難度。

也即模型泛化能力由學習算法、數據和問題本身三者共同決定。另外,從擬合目標的角度也可以將誤差分解爲:

1) 算法在有限的時間迭代 / 求解後輸出的模型與最小化經驗風險模型的差異;

2) 最小化經驗風險模型與最小化期望風險模型的差異;

3) 所選算法空間下最優期望風險與全局最優期望風險的差異。

在實際建模中,偏差 - 方差和過擬合 - 欠擬合由模型評估得到,可參考 4.1.9 節的模型評估。例如,偏差間接可由模型性能指標(AUC、KS)衡量。方差則由多次運行不同數據集劃分下的性能指標波動得到,這些指標正是評估報告中的內容。

偏差 - 方差在實際建模中可通過技術手段減少,而噪聲則不能在建模過程改變,是不可變的誤差項,機器學習的目標就是減少可被改變的偏差和方差。

理想情況下,我們期望偏差 - 方差同時小。但由圖 1-4 可知偏差 - 方差 “相愛相殺”,只能權衡取折中得到較好的模型。爲了解決偏差 - 方差間的問題,已經發展了很多相應的學習算法。比如 Boosting 關注解決偏差問題,Bagging 關注解決方差問題,當然也包括前文描述的更具體的正則化。一般來說欠擬合 - 過擬合與偏差 - 方差是相近的一對關係,常常成對出現。

圖 1-4 的曲線和那些描述模型複雜度與過擬合的關係時,可能會有一定的誤導性:複雜的模型就會過擬合,簡單的模型就會欠擬合。實踐上來看模型複雜度並不是過擬合和欠擬合的充分條件。例如,一個複雜的模型(由於其構造方式,比如能減少方差的隨機森林)不一定過擬合,一個簡單模型也不一定欠擬合。

交叉驗證

很多時候可認爲交叉驗證就是平均過程,包含了公平評估的思想。它除了可應用在模型的訓練和調參中,也能應用在不同算法的評估選擇中,這正是交叉驗證的評估本質,即評估分類器性能的一種統計分析方法

初學者常聽到一句話——通過交叉驗證調整模型參數,這種說法容易引起誤會:交叉驗證是調參的方法。實際上交叉驗證只是一種評估方法,可用於非調參的場合,請參考下文的第 3 小節。

交叉驗證可分爲如下兩個部分:

其一般交叉驗證流程描述如下:

上述的 K 折交叉驗證有如下兩種常見的變體

1)K×N fold cross-validation,即在 K 折的基礎上再嵌套一層循環,最終取得平均估計,常見的有 5×2 交叉驗證和 10×10 交叉驗證。

2)Least-One-Out cross-validation(LOOCV),留一法:每次只留一個樣例做測試其餘數據作爲訓練。當數據量極小時,可考慮使用該方法,比如只有 100 個樣本,那麼按照 LOOCV 的方式,將訓練 100 個模型,得到 100 個評價指標。每個模型使用 99 個樣本訓練,使用 1 個樣本測試

數據泄露

機器學習中還有一個與過擬合非常相似的現象:訓練時模型表現異常的好,但在真實預測中(線上)表現得很差。這就是數據泄露 (Data Leakage) 會產生的現象。

  1. 對數據進行標準化後再拆分數據訓練。
# X,y 同上述數據
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X2 = scaler.fit_transform(X)
knn = KNeighborsClassifier()
scores = cross_val_score(knn, X2, y, cv=5, scoring='accuracy')
  1. 預測病人是否會患病:開發一個預測病人是否會患 A 疾病的模型,在準備特徵的過程中,收集了病人是否使用過某些藥物的特徵,其中包含了 “是否使用過治療 A 疾病的藥物” 的特徵。

上述兩個例子是很多初學者容易犯的錯誤。在第一個例子中,先進行數據標準化,然後交叉驗證。此時已將驗證集上的信息(均值、標準差)泄露到了訓練集中。第二個例子中,很明顯 “是否使用過治療 A 疾病的藥物” 的特徵泄露了是否已患 A 疾病的事實,此時開發的模型是沒有意義的。

數據泄露又稱特徵穿越,指的是在建模過程中的數據收集、數據處理時無意將未來信息引入到訓練集中。未來信息包括如例一的測試集信息泄露到訓練集中,例二中的將目標信息泄露到訓練數據中。數據泄露一般發生在時間序列場景或具有時間屬性的場景。例如在金融的信貸領域,建模工程師在取數時,誤取到了建模時間點後的還款信息、表現等。

注意:機器學習中的數據泄露與計算機安全領域的數據泄露是完全不同的概念。如,日常聽到的 “用戶信息泄露” 指的是安全領域的數據泄露,數據可能被未經授權的組織剽竊、盜走或使用。

很明顯,數據泄露後模型訓練效果往往非常好,甚至好到難以置信,而真實 / 線上場景預測效果往往會大打折扣。除此之外,我們還可以通過如下的方式檢查或判斷是否發生了數據泄露。

爲了避免數據泄露,實踐中需要形成規範的建模方法。

節選自《機器學習:軟件工程方法與實現》第四章

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/X4SSUFnSs5QTsr-bZyR89A