監督式學習是機器學習的重要分支,其核心目標是利用標記資料訓練模型,使模型能夠準確預測未知資料的結果。監督式學習主要分為迴歸和分類別兩種型別,迴歸用於預測連續值,例如房價預測;而分類別則用於預測離散值,例如影像識別。模型訓練的關鍵在於最小化損失函式,損失函式用於衡量模型預測值與真實值之間的差異。選擇合適的損失函式對於模型的效能至關重要,例如迴歸任務常用的平方誤差損失和分類別任務常用的交叉熵損失。為了有效地最小化損失函式,需要使用最佳化工具,例如梯度下降法。梯度下降法透過迭代更新模型引數,逐步逼近損失函式的最小值。然而,梯度下降法也存在一些挑戰,例如容易陷入區域性最小值和在大規模資料集上計算成本較高等。
監督式學習演算法
是時候根據資料進行學習了。大多數人認為機器學習就是將演算法套用到給定的資料上並預測結果。但實際上,事情並沒有這麼簡單。80%的工作涉及資料收集、預處理、清理、特徵工程、轉換和選擇最佳特徵,而剩下的20%則是用於構建機器學習模型、驗證和佈署。整個過程被稱為MLOps(機器學習運作),它與DevOps類別似,但專門針對機器學習。要了解並佈署生產模型,你需要熟悉MLOps中的每個組成部分。前面的章節討論了80%的工作內容,如果你跳過了那些章節,我們建議在閱讀本章之前先閱讀它們。此外,商業和領域知識可以幫助你在整個過程中有所改進。
機器學習演算法基礎
本文討論機器學習演算法。這些演算法大致分為三種型別:監督式學習、非監督式學習和強化學習(見表5-1)。
表5-1:機器學習演算法型別
| 監督式 | 非監督式 | 強化學習 |
|---|---|---|
| 是什麼? | 在標記資料上訓練演算法。 | 在未標記資料上訓練演算法。 |
| 用於哪裡? | 迴歸、分類別。 | 聚類別、分割、關聯。 |
| 資料型別? | 標記資料。例如:預測貓與狗或預測房屋價格。 | 未標記資料;僅輸入特徵。例如:客戶輪廓分析。 |
| 是否需要監督? | 是 | 否 |
| 目標是什麼? | 使用已知的輸入/輸出對映減少目標預測中的錯誤。 | 理解資料中的模式和行為以講述一個故事。 |
除了上述類別外,目前還有兩種常見的演算法:推薦系統和半監督式演算法。推薦系統可以是監督式或非監督式的。你將在下一章中瞭解更多相關內容。半監督式演算法結合了監督式和非監督式學習方法,使用少量標記資料對大量未標記資料進行分類別。半監督式演算法和強化學習超出了本文的範圍。本章涵蓋監督式學習演算法。在下一章中,我們將介紹非監督式和推薦演算法。
在監督式演算法中,你有以下型別:迴歸和分類別(二元、多項和多標籤)。
迴歸
在迴歸模型中,你預測連續值,例如房屋價格。迴歸是一種統計方法,用於金融、投資和其他領域,試圖確定一個依賴變數(通常用Y表示)與一系列其他變數(稱為獨立變數)之間的關係強度和特徵。
分類別
在分類別模型中,你預測分類別值,例如貓與狗、垃圾郵件與非垃圾郵件等。當類別數量為兩個時,稱為二元分類別。當類別數量超過兩個時,稱為多項分類別。二元分類別模型是多項分類別模型的一個子集。多項分類別模型的另一個子集是有序分類別。在有序模型中,目標是有序的。例如,預測購買經濟艙票、商務艙票或頭等艙票的可能性。需要記住的一個重要事項是,在這些分類別模型中,目標是相互排斥的。在某些情況下,單個觀察值可能有多個目標,例如文章的企劃。這種型別的任務是多標籤分類別。
無論是迴歸還是分類別,目標都是減少預測值與實際值之間的誤差。首先從目標(減少誤差)開始,涵蓋一些相關概念,然後探討演算法。
損失函式
損失函式是與每個監督式學習演算法相關的誤差函式(見表5-2)。目標是在任何模型訓練過程中盡量最小化損失函式。為什麼要最小化它?考慮一個預測人體重量的例子。原始體重值分別為30、40和50。假設其中一個模型預測的體重分別為32、46和57。
from pyspark.ml.classification import LogisticRegression
lr = LogisticRegression(featuresCol='features', labelCol='target_variable_name')
lr_model = lr.fit(df)
lr_output = lr_model.coefficients
#### 內容解密:
這段程式碼使用PySpark的ML函式庫中的`LogisticRegression`類別建立了一個邏輯迴歸模型。其中:
- `featuresCol='features'` 指定了特徵列的名稱。
- `labelCol='target_variable_name'` 指定了目標變數列的名稱。
- `lr.fit(df)` 將邏輯迴歸模型擬合到資料框架`df`上。
- `lr_model.coefficients` 取得了模型的係數。
from pyspark.ml.classification import RandomForestClassifier
rf = RandomForestClassifier(featuresCol='features', labelCol='target_variable_name')
rf_model = rf.fit(df)
rf_output = rf_model.featureImportances
#### 內容解密:
這段程式碼使用PySpark的ML函式庫中的`RandomForestClassifier`類別建立了一個隨機森林分類別器模型。其中:
- `featuresCol='features'` 指定了特徵列的名稱。
- `labelCol='target_variable_name'` 指定了目標變數列的名稱。
- `rf.fit(df)` 將隨機森林模型擬合到資料框架`df`上。
- `rf_model.featureImportances` 取得了模型的特徵重要性。
score_table = pd.DataFrame({},[])
score_table['name'] = features_df['name']
for i in columns:
score_table[i] = features_df['name'].isin(list(features_df.nlargest(num_top_features,i)['name'])).astype(int)
#### 內容解密:
這段程式碼建立了一個評分表,用於評估不同演算法選出的前N個特徵。其中:
- `features_df.nlargest(num_top_features,i)` 選出了根據第i個演算法排序的前N個特徵。
- `features_df['name'].isin(...)` 檢查特徵是否在選出的前N個特徵中。
- `.astype(int)` 將布林結果轉換為整數(True變為1,False變為0)。
圖表翻譯:
此圖示展示了根據投票的特徵選擇方法的輸出結果。各個演算法對特徵進行評分,並根據評分進行排序,最終透過投票機制選出最重要的特徵。
本章總結:
- 詳細介紹了變數選擇技術。
- 學習了根據目標和非目標的選擇技術。
- 自行建立了Spark ML轉換器並將其納入ML工作流程。
- 結合所有選擇技術建立了根據投票的選擇技術。
在下一章中,你將學習本文中最令人興奮的部分——機器學習模型。繼續學習,並敬請期待!
監督式學習演算法中的損失函式與最佳化工具
在監督式學習中,損失函式(Loss Function)扮演著至關重要的角色。它們用於評估模型的預測值與實際值之間的差異,並指導模型的訓練過程。本章將探討不同的損失函式及其應用場景,同時介紹最佳化工具(Optimizers)的概念及其在模型訓練中的重要性。
損失函式的型別
損失函式有多種型別,不同的任務需要選擇合適的損失函式。常見的損失函式包括:
迴歸任務中的損失函式
平方誤差損失(Squared Error Loss)
- 公式:$(y - \hat{y})^2$
- 適用場景:迴歸任務中最常用的損失函式,易於微分。
絕對誤差損失(Absolute Error Loss)
- 公式:$|y - \hat{y}|$
- 適用場景:當資料中存在異常值時,使用絕對誤差損失可以減少異常值的影響。
偽Huber損失(Pseudo-Huber Loss)
- 公式:當 $x = y - \hat{y} \leq \alpha$ 時,$x^2$;否則,$2\alpha|x| - \alpha^2$
- 適用場景:結合了平方誤差和絕對誤差的優點,可以透過調整超引數 $\alpha$ 獲得最佳效果。
分類別任務中的損失函式
二元交叉熵損失(Binary Cross-Entropy Loss)
- 公式:$-(y \log(p) + (1-y) \log(1-p))$
- 適用場景:二元分類別任務的預設損失函式。
類別交叉熵損失(Categorical Cross-Entropy Loss)
- 公式:$-\sum_{x \in C} q(x) \log(p(x))$,其中 $C$ 為類別數量
- 適用場景:多類別分類別任務的預設損失函式。
KL散度損失(KL Divergence Loss)
- 公式:$\sum_{x \in C} p(x) \log\left(\frac{p(x)}{q(x)}\right)$
- 適用場景:多類別分類別任務,用於衡量兩個機率分佈之間的差異。
Hinge損失
- 公式:$\max(0, 1 - x)$,其中 $x = y * \hat{y}$
- 適用場景:二元分類別任務,常用於支援向量機(SVM),用於最大化類別間的間隔。
選擇合適的損失函式
選擇合適的損失函式對於模型的訓練至關重要。不同的損失函式會影響模型的收斂速度和最終效能。例如,使用平方誤差損失時,模型的總誤差可以表示為:
# Model 1 誤差計算範例
model1_error = (30-32)**2 + (40-46)**2 + (50-57)**2
print(model1_error) # 輸出:89
# Model 2 誤差計算範例
model2_error = (30-31)**2 + (40-42)**2 + (50-52)**2
print(model2_error) # 輸出:9
內容解密:
此範例展示瞭如何使用平方誤差損失來評估兩個不同模型的預測誤差。模型1的預測值為32、46和57,而模型2的預測值為31、42和52。透過計算平方誤差,可以看出模型2的誤差(9)遠小於模型1(89),表明模型2的預測更接近實際值。
最佳化工具
最佳化工具(Optimizers)用於尋找使損失函式最小化的模型引數。常見的最佳化工具包括梯度下降法(Gradient Descent)等。
梯度下降法
梯度下降法是一種常用的最佳化演算法,其核心思想是透過迭代更新模型引數來最小化損失函式。具體步驟如下:
- 初始化模型引數。
- 計算損失函式相對於當前引數的梯度。
- 根據梯度和學習率更新引數。
- 重複步驟2和3,直到滿足停止條件。
# 梯度下降法更新引數範例
def gradient_descent_update(beta, learning_rate, slope):
return beta - learning_rate * slope
# 範例引數
beta = 0.5
learning_rate = 0.01
slope = 0.2
# 更新引數
new_beta = gradient_descent_update(beta, learning_rate, slope)
print(new_beta)
內容解密:
此範例展示瞭如何使用梯度下降法更新模型引數。gradient_descent_update函式根據當前引數beta、學習率learning_rate和梯度slope計算新的引數值。學習率控制了每次更新的步長,梯度則指示了引數更新的方向。
學習率的選擇
學習率是梯度下降法中的一個重要超引數,它決定了每次引數更新的步長。選擇合適的學習率對於模型的收斂速度和最終效能至關重要。
- 高學習率:可以加快收斂速度,但可能導致模型震盪或無法收斂。
- 低學習率:可以提高模型的穩定性,但可能導致收斂速度過慢。
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title 學習率的選擇
rectangle "收斂快但可能震盪" as node1
rectangle "收斂慢但穩定" as node2
node1 --> node2
@enduml圖表翻譯: 此圖示展示了不同學習率對模型訓練過程的影響。高學習率可能導致模型訓練過程不穩定,而低學習率則能提供更穩定的訓練過程,但可能需要更長的訓練時間。
本地最小值與全域最小值
梯度下降法的一個挑戰是可能陷入本地最小值,而非達到全域最小值。這取決於初始引數和損失函式的形狀。為瞭解決這個問題,可以採用以下策略:
- 使用不同的初始引數多次執行模型訓練。
- 使用更先進的最佳化演算法,如具有動量(Momentum)的梯度下降法或自適應學習率的最佳化工具。
綜上所述,選擇合適的損失函式和最佳化工具對於監督式學習模型的成功至關重要。透過深入理解這些概念並合理應用,可以顯著提升模型的效能和泛化能力。
監督式學習演算法中的最佳化技術
在監督式學習中,模型的訓練過程涉及多個關鍵技術,其中最佳化技術是至關重要的。最佳化技術的主要目標是最小化損失函式,使模型的預測結果盡可能接近真實值。本章將探討幾種常見的最佳化技術,包括梯度下降法、隨機梯度下降法、小批次梯度下降法、動量法、AdaGrad、RMSprop和Adam最佳化器。
梯度下降法的挑戰
梯度下降法是一種廣泛使用的最佳化演算法,它透過計算損失函式的梯度來更新模型的引數。然而,在處理大型資料集時,梯度下降法的計算成本很高,因為它需要在每次迭代中處理整個資料集。此外,梯度下降法可能會陷入區域性最小值,而不是達到全域最小值。
圖示:區域性最小值與全域最小值
此圖示說明瞭區域性最小值和全域最小值的區別。區域性最小值是指在某個鄰域內,函式值最小的點,而全域最小值是指在整個定義域內,函式值最小的點。
隨機梯度下降法和小批次梯度下降法
為瞭解決梯度下降法的問題,人們提出了隨機梯度下降法(SGD)和小批次梯度下降法。SGD在每次迭代中只使用一個樣本來更新模型的引數,這大大提高了訓練速度。然而,SGD的更新過程具有較高的方差,可能導致模型收斂不穩定。
小批次梯度下降法則是在SGD和梯度下降法之間的一種折衷方案。它在每次迭代中使用一小批樣本來更新模型的引數,這樣既可以提高訓練速度,又可以降低方差。
動量法
動量法是一種透過在更新過程中加入動量項來提高模型收斂速度和穩定性的方法。動量項可以幫助模型逃離區域性最小值,達到全域最小值。
動量法的數學表達
m_t = w * m_(t-1) - α * Slope_i(t)
β_i(t) = β_i(t-1) + m_t
其中,m_t是動量項,w是權重引數,α是學習率,Slope_i(t)是梯度。
內容解密:
m_t = w * m_(t-1) - α * Slope_i(t):此公式計算當前時刻的動量項。它結合了前一時刻的動量項和當前時刻的梯度。β_i(t) = β_i(t-1) + m_t:此公式更新模型的引數。它將當前時刻的動量項加入到引數更新中。
AdaGrad最佳化器
AdaGrad是一種自適應學習率的最佳化演算法,它透過調整學習率來提高模型的收斂速度。AdaGrad的學習率會根據模型的引數進行調整,使得在梯度較大的方向上學習率較小,在梯度較小的方向上學習率較大。
AdaGrad的數學表達
G_i(t) = G_i(t-1) + (Slope_i(t))^2
β_i(t) = β_i(t-1) - (α / (sqrt(G_i(t)) + ε)) * Slope_i(t)
其中,G_i(t)是累積梯度的平方和,α是初始學習率,ε是一個小常數,用於避免除以零。
內容解密:
G_i(t) = G_i(t-1) + (Slope_i(t))^2:此公式計算累積梯度的平方和。它用於調整學習率。β_i(t) = β_i(t-1) - (α / (sqrt(G_i(t)) + ε)) * Slope_i(t):此公式更新模型的引數。它使用自適應學習率來調整引數更新的步長。
RMSprop最佳化器
RMSprop是AdaGrad的一種變體,它透過引入一個衰減係數來調整累積梯度的平方和。這樣可以避免AdaGrad中學習率過快衰減的問題。
RMSprop的數學表達
G_i(t) = γ * G_i(t-1) + (1 - γ) * (Slope_i(t))^2
β_i(t) = β_i(t-1) - (α / (sqrt(G_i(t)) + ε)) * Slope_i(t)
其中,γ是衰減係數。
內容解密:
G_i(t) = γ * G_i(t-1) + (1 - γ) * (Slope_i(t))^2:此公式計算累積梯度的平方和,使用衰減係數來調整。β_i(t) = β_i(t-1) - (α / (sqrt(G_i(t)) + ε)) * Slope_i(t):此公式更新模型的引數,使用自適應學習率。
Adam最佳化器
Adam是一種結合了動量法和自適應學習率的最佳化演算法。它同時使用了動量項和自適應學習率來提高模型的收斂速度和穩定性。
Adam的數學表達
m_t = w * m_(t-1) + (1 - w) * Slope_i(t)
G_i(t) = γ * G_i(t-1) + (1 - γ) * (Slope_i(t))^2
β_i(t) = β_i(t-1) - (α / (sqrt(G_i(t)) + ε)) * m_t
內容解密:
m_t = w * m_(t-1) + (1 - w) * Slope_i(t):此公式計算動量項。G_i(t) = γ * G_i(t-1) + (1 - γ) * (Slope_i(t))^2:此公式計算累積梯度的平方和,使用衰減係數。β_i(t) = β_i(t-1) - (α / (sqrt(G_i(t)) + ε)) * m_t:此公式更新模型的引數,使用自適應學習率和動量項。
快速回顧
- 誤差函式也稱為損失函式。
- 當達到損失函式的底部時,模型的誤差最小。
- 可以使用梯度下降法等最佳化器來最小化誤差函式。
- 區域性最小值和全域最小值的問題可以透過新增動量或調整學習率來解決。
啟用函式
啟用函式是神經網路中的一個重要組成部分。它可以引入非線性,使得模型能夠學習複雜的模式。
圖示:啟用函式說明
此圖示說明瞭啟用函式的作用。它將輸入訊號轉換為輸出訊號,使得模型能夠做出相應的反應。