返回文章列表

監督式學習啟動函式與正規化技術應用

本文探討監督式學習中的啟動函式與正規化技術,並以線性迴歸和邏輯迴歸為例,講解其原理、實作和解讀方法。同時,文章也涵蓋了多重共線性問題的處理,以及如何在 PySpark 中使用決策樹進行信用評估。

機器學習 Web 開發

監督式學習演算法的效能取決於啟動函式和正規化技術的選擇。啟動函式引入非線性,使模型能學習複雜模式;正規化技術則避免過擬合,提升模型泛化能力。線性迴歸和邏輯迴歸是兩種常見的監督式學習演算法,各有不同的應用場景。線性迴歸用於預測連續值,而邏輯迴歸則用於分類別問題。在實際應用中,需根據資料特性和目標選擇合適的演算法和技術。使用 PySpark 等工具,可以有效地實作和評估這些模型。

監督式學習演算法中的啟動函式與正規化技術

在監督式學習演算法中,啟動函式(Activation Function)扮演著至關重要的角色。它們能夠決定神經網路中的神經元是否被啟動,從而影響整個網路的學習過程與表現。以下將詳細介紹幾種常見的啟動函式及其特性。

線性啟動函式(Linear Activation Function)

線性啟動函式是一種最簡單的啟動函式,它的輸出等於輸入,不進行任何轉換。其數學表示式為:

f(x) = x

其導數 f’(x) = 1。線性啟動函式無法學習非線性資料型別,因為它不能引入非線性變換。

內容解密:

  • 線性啟動函式的輸出直接等於輸入,不進行任何非線性轉換。
  • 其導數始終為1,這在反向傳播演算法中用於更新權重。
  • 線性啟動函式無法處理非線性問題,因為它不引入任何非線性因素。

Sigmoid 啟動函式

Sigmoid 函式將輸入壓縮到 0 和 1 之間,其數學表示式為:

f(x) = 1 / (1 + exp(-x))

其導數為 f’(x) = f(x) * (1 - f(x))。Sigmoid 函式常用於二元分類別問題,可以透過設定閾值(如0.5)將輸出轉換為0或1的二元輸出。

內容解密:

  • Sigmoid 函式將任意實數對映到 (0,1) 之間,適合用於二元分類別。
  • 其導數可以用於反向傳播演算法中更新權重。
  • 可以透過調整閾值來決定分類別結果。

Hyperbolic Tangent (TanH) 函式

TanH 函式將輸入壓縮到 -1 和 1 之間,其數學表示式為:

f(x) = tanh(x) = 2 / (1 + exp(-2x)) - 1

其導數為 f’(x) = 1 - f(x)^2。與 Sigmoid 類別似,TanH 也可以用於二元分類別,但其輸出範圍是 (-1,1)。

內容解密:

  • TanH 函式將輸入對映到 (-1,1) 之間,可以用於需要輸出負值的場景。
  • 其導數同樣用於反向傳播中的權重更新。
  • TanH 的輸出範圍比 Sigmoid 更廣,適合某些特定應用場景。

Rectified Linear Unit (ReLU) 函式

ReLU 函式對於正輸入直接輸出該值,對於負輸入輸出0。其數學表示式為:

f(x) = max(0, x)

其導數為:當 x > 0 時,f’(x) = 1;當 x <= 0 時,f’(x) = 0。ReLU 能夠解決梯度消失問題,使模型學習更快。

內容解密:

  • ReLU 將負值對映為0,正值保持不變,這使得神經網路能夠學習更複雜的模式。
  • ReLU 的導數對於正值為1,對於負值為0,這有助於反向傳播中的梯度計算。
  • ReLU 可能會遇到「死亡 ReLU」問題,即某些神經元永遠不會被啟動。

Leaky ReLU 或 Parametric ReLU 函式

Leaky ReLU 是 ReLU 的變體,它對於負輸入輸出一個小的非零值(αx),而不是0。其數學表示式為:

f(x) = x if x >= 0, αx if x < 0

其導數為:當 x > 0 時,f’(x) = 1;當 x <= 0 時,f’(x) = α。Leaky ReLU 能夠減少「死亡 ReLU」的問題。

內容解密:

  • Leaky ReLU 對負輸入給予一個小的梯度,避免了神經元完全不被啟動的問題。
  • α 是 Leaky ReLU 中的超引數,可以根據具體任務進行調整。
  • Leaky ReLU 有助於保持神經網路的活躍性和學習能力。

Swish 啟動函式

Swish 是 Google 在2017年提出的一種新型啟動函式,其數學表示式為:

f(x) = x * sigmoid(x)

其導數涉及 Swish 函式本身和 Sigmoid 函式。研究表明,Swish 在某些模型(如 ImageNet 和 Inception-ResNet-v2)上比 ReLU 有更好的表現。

內容解密:

  • Swish 結合了線性項和 Sigmoid 非線性項,能夠在某些情況下提高模型的準確度。
  • Swish 的導數較為複雜,涉及 Swish 函式和 Sigmoid 函式的計算。
  • Swish 在深度學習模型中表現出色,尤其是在影像分類別任務中。

Softmax 函式

Softmax 主要用於多類別分類別問題,其數學表示式為:

f(x_i) = exp(x_i) / Σ_j exp(x_j)

Softmax 將輸入轉換為機率分佈,使得每個類別的機率和為1。

內容解密:

  • Softmax 將多個類別的輸出轉換為機率形式,便於進行多類別分類別。
  • Softmax 的輸出代表每個類別的預測機率,可以用來選擇最可能的類別。
  • 在多類別分類別問題中,Softmax 是常用的輸出層啟動函式。

批次正規化(Batch Normalization)

批次正規化是一種正規化技術,透過對每個批次的輸入進行標準化,使得模型的訓練更加穩定,加速收斂。

圖表翻譯:

此技術能夠減少內部共變數偏移,使神經網路訓練更穩定。

Dropout

Dropout 是另一種正規化技術,透過在訓練過程中隨機丟棄部分神經元的輸出,以避免過擬合和引入偏差。

圖表翻譯:

Dropout 能夠防止模型過度依賴某些特定的輸入特徵,從而提高模型的泛化能力。

監督式機器學習演算法詳解:以線性迴歸為例

在機器學習的領域中,監督式學習是一項重要的技術,而線性迴歸又是其中最基礎且廣泛使用的演算法之一。本篇文章將探討線性迴歸的原理、實作以及解讀方法,並使用 PySpark 進行實際操作。

線性迴歸簡介

線性迴歸是一種用於預測連續結果的演算法,例如房屋價格或客戶的終身價值。該演算法假設輸入變數與輸出結果之間存線上性關係。當使用一個輸入變數來預測輸出時,稱為簡單線性迴歸;當使用多個輸入變數時,則稱為多元線性迴歸。

簡單線性迴歸與多元線性迴歸

簡單線性迴歸模型可以表示為: [ y = \beta_0 + \beta_1 x + \epsilon ] 其中,( y ) 是目標變數,( x ) 是輸入變數,( \beta_0 ) 是截距,( \beta_1 ) 是斜率,( \epsilon ) 是誤差項。

多元線性迴歸模型則可以表示為: [ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_n x_n + \epsilon ] 其中,( x_1, x_2, \cdots, x_n ) 是多個輸入變數,( \beta_1, \beta_2, \cdots, \beta_n ) 分別是對應的係數。

使用 PySpark 實作線性迴歸

首先,我們需要準備資料集並進行特徵向量組裝。以下是使用 PySpark 進行資料處理和模型訓練的程式碼範例:

# 載入必要的函式庫
from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.regression import LinearRegression

# 建立 SparkSession
spark = SparkSession.builder.getOrCreate()

# 載入資料集
filename = "bank-full.csv"
data = spark.read.csv(filename, header=True, inferSchema=True, sep=';')

# 組裝特徵向量
def assemble_vectors(df, features_list, target_variable_name):
    assembler = VectorAssembler(inputCols=features_list, outputCol='features')
    stages = [assembler]
    selectedCols = [target_variable_name, 'features'] + features_list
    pipeline = Pipeline(stages=stages)
    assembleModel = pipeline.fit(df)
    df = assembleModel.transform(df).select(selectedCols)
    return df

# 選擇變數並組裝特徵向量
linear_df = data.select(['age', 'balance', 'day', 'duration', 'campaign', 'pdays', 'previous'])
target_variable_name = 'balance'
features_list = linear_df.columns
features_list.remove(target_variable_name)
df = assemble_vectors(linear_df, features_list, target_variable_name)

# 訓練線性迴歸模型
reg = LinearRegression(featuresCol='features', labelCol='balance')
reg_model = reg.fit(df)

# 檢視係數和截距
print(reg_model.coefficients, reg_model.intercept)

# 進行預測
pred_result = reg_model.transform(df)

內容解密:

  1. 資料載入與處理:首先,我們使用 SparkSession 載入資料集,並選擇相關的欄位進行分析。
  2. 特徵向量組裝:使用 VectorAssembler 將多個輸入變陣列裝成一個特徵向量,以便於輸入到線性迴歸模型中。
  3. 模型訓練:使用 LinearRegression 類別訓練線性迴歸模型,並檢視模型的係數和截距。
  4. 模型預測:使用訓練好的模型對資料進行預測。

線性迴歸模型的解讀

線性迴歸模型的方程式可以表示為: [ Predicted_balance = 124.92 + 28.08 \times age + 3.30 \times day + 0.25 \times duration - 14.14 \times campaign - 0.08 \times pdays + 23.46 \times previous ]

多重共線性問題

在解讀線性迴歸模型時,需要注意多重共線性(Multicollinearity)的問題。當兩個或多個輸入變數之間存在高度相關性時,會導致模型的解釋性降低。可以使用 Variance Inflation Factor(VIF)來檢測多重共線性。

# 計算 VIF 的函式
def vif_calculator(df, features_list):
    vif_list = []
    for i in features_list:
        # 此處省略具體實作細節
        pass

內容解密:

  1. VIF 計算:VIF 用於評估多重共線性的程度。當 VIF 值大於 10 時,表示存在嚴重的多重共線性問題。
  2. 模型解釋:透過檢視模型的係數,可以瞭解各個輸入變數對目標變數的影響。例如,年齡(age)每增加 1 歲,預測的餘額(balance)會增加約 28 個單位。

邏輯迴歸(Logistic Regression)與多重共線性(Multicollinearity)問題

多重共線性(Multicollinearity)問題的處理

在進行迴歸分析時,變數之間的相關性可能會對模型造成影響。其中,多重共線性是指兩個或多個自變數之間存在高度相關性的情況,這會導致模型引數估計不穩定,進而影響模型的預測能力。

方差膨脹因子(Variance Inflation Factor, VIF)

為瞭解決多重共線性問題,我們可以使用方差膨脹因子(VIF)來評估自變數之間的相關性。VIF 的計算公式如下:

def vif_calculator(df, features_list):
    vif_list = []
    for i in features_list:
        temp_features_list = features_list.copy()
        temp_features_list.remove(i)
        temp_target = i
        assembler = VectorAssembler(inputCols=temp_features_list, outputCol='features')
        temp_df = assembler.transform(df)
        reg = LinearRegression(featuresCol='features', labelCol=i)
        reg_model = reg.fit(temp_df)  # fit model
        temp_vif = 1 / (1 - reg_model.summary.r2)
        vif_list.append(temp_vif)
    return vif_list

features_df['vif'] = vif_calculator(linear_df, features_list)
print(features_df)

內容解密:

  1. vif_calculator 函式:此函式計算每個特徵的 VIF 值。它遍歷每個特徵,將當前特徵作為目標變數,其他特徵作為輸入變數,使用線性迴歸模型進行擬合,並計算 VIF 值。
  2. VectorAssembler:用於將多個特徵列組合為一個向量列,作為線性迴歸模型的輸入。
  3. LinearRegression:線性迴歸模型,用於擬合資料並計算 R-squared 值。
  4. VIF 計算:根據線性迴歸模型的 R-squared 值計算 VIF,公式為 1 / (1 - R-squared)
  5. 結果輸出:將計算出的 VIF 值新增到 features_df 資料框中,並列印預出來。

邏輯迴歸(Logistic Regression)

邏輯迴歸是一種用於二元分類別問題的演算法,用於預測事件發生的機率。它透過擬合一條最佳曲線來區分二元結果。

邏輯迴歸方程

邏輯迴歸的方程與線性迴歸不同,其左側是對數機率(log(odds)):

[ log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1x_1 + \beta_2x_2 + \ldots + \beta_nx_n ]

最大似然估計(Maximum Likelihood Estimation, MLE)

邏輯迴歸使用最大似然估計來確定最佳擬合曲線。MLE 的過程包括:

  1. 選擇候選曲線:選擇一條候選曲線,並將資料點投影到該曲線上,得到對數機率值。
  2. 轉換為機率:使用 sigmoid 函式將對數機率轉換為機率。
  3. 計算 MLE:根據真實標籤和預測機率計算似然值,並取對數得到對數似然值。
  4. 迭代最佳化:重複調整曲線引數,最大化對數似然值,直到找到最佳擬合曲線。

PySpark 程式碼實作

# 從 bank 資料集中選擇特徵和目標變數
# 假設 'y' 是目標變數,其他列是特徵
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.classification import LogisticRegression

# 組合特徵
assembler = VectorAssembler(inputCols=['age', 'balance', 'day', 'duration', 'campaign', 'pdays', 'previous'], outputCol='features')
bank_df = assembler.transform(bank_df)

# 訓練邏輯迴歸模型
lr = LogisticRegression(featuresCol='features', labelCol='y')
lr_model = lr.fit(bank_df)

# 檢視模型摘要
print(lr_model.summary)

內容解密:

  1. VectorAssembler:將多個特徵列組合為一個向量列,作為邏輯迴歸模型的輸入。
  2. LogisticRegression:邏輯迴歸模型,用於二元分類別問題。
  3. fit 方法:訓練邏輯迴歸模型,使用提供的資料。
  4. summary 屬性:檢視模型的摘要資訊,包括訓練統計資料等。

二元分類別與多類別分類別

邏輯迴歸可以應用於二元分類別和多類別分類別問題。在二元分類別中,使用 sigmoid 函式;在多類別分類別中,使用 softmax 函式。

Sigmoid 與 Softmax 的關係

  • Sigmoid 函式:用於二元分類別,將對數機率轉換為機率。
  • Softmax 函式:用於多類別分類別,將多個類別的對數機率轉換為機率分佈。

在 PySpark 中,可以透過設定 family 引數來選擇二元或多項式邏輯迴歸。

邏輯迴歸模型與決策樹在信用評估中的應用

在信用評估領域,邏輯迴歸模型與決策樹是兩種常見的機器學習方法,用於預測客戶的信用風險。本篇文章將探討這兩種方法的原理、實作和解釋。

邏輯迴歸模型

邏輯迴歸是一種廣泛使用的分類別演算法,特別是在二元分類別問題中。它透過計算事件發生的機率(即 odds)來進行預測。邏輯迴歸模型的輸出是一個介於 0 和 1 之間的機率值,可以用來預測客戶是否會違約。

邏輯迴歸模型的實作

from pyspark.ml.classification import LogisticRegression

# 建立邏輯迴歸模型
binary_clf = LogisticRegression(featuresCol='features', labelCol='y', family='binomial')
multinomial_clf = LogisticRegression(featuresCol='features', labelCol='y', family='multinomial')

# 訓練模型
binary_clf_model = binary_clf.fit(df)
multinomial_clf_model = multinomial_clf.fit(df)

# 列印模型係數
print(binary_clf_model.coefficients)
print(multinomial_clf_model.coefficientMatrix)

# 列印模型截距
print(binary_clf_model.intercept)
print(multinomial_clf_model.interceptVector)

邏輯迴歸模型的解釋

邏輯迴歸模型的係數代表了自變數對目標變數的影響程度。對於二元變數,可以透過計算 odds ratio 來解釋係數的大小。

內容解密:

  • binary_clfmultinomial_clf 分別代表二元邏輯迴歸和多項邏輯迴歸模型。
  • featuresCol='features' 表示模型的輸入特徵。
  • labelCol='y' 表示模型的目標變數。
  • family='binomial'family='multinomial' 分別指定二元和多項邏輯迴歸。
  • 模型的係數和截距可以用來計算預測機率。

變數解釋

在邏輯迴歸模型中,變數的解釋可以透過計算 odds ratio 來進行。

二元變數解釋

對於二元變數,可以透過計算 odds ratio 來解釋其對目標變數的影響。

log(odds class 1|Female) - log(odds class 1|Male) = 0.16
odds class Female / odds class Male = e^0.16 = 1.173

內容解密:

  • 當性別從男性變為女性時,odds ratio 增加 17%。
  • 這意味著女性被分類別為 class 1 的機率比男性高 17%。

連續變數解釋

對於連續變數,可以透過計算單位變化對 odds ratio 的影響來進行解釋。

log(odds class 1|Age = 30) - log(odds class 1|Age = 29) = -0.32
odds class Age=30 / odds class Age=29 = e^-0.32 = 0.73

內容解密:

  • 當年齡增加一歲時,odds ratio 減少 27%。
  • 這意味著隨著年齡的增加,被分類別為 class 1 的機率會降低。

決策樹

決策樹是一種非線性的分類別演算法,透過遞迴地分割資料來進行預測。決策樹的優點在於可以處理非線性的關係,並且容易解釋。

決策樹的解釋

決策樹的根節點代表最重要的特徵,葉節點代表最終的預測結果。

* 根節點:年齡
* 葉節點:最終預測結果(批准或不批准)

圖表翻譯:

此圖示展示了一個簡單的信用評估決策樹。年齡是根節點,根據年齡的不同取值,會進一步根據其他特徵(如職業和信用評分)進行判斷,最終得出是否批准的結論。