邏輯迴歸模型在資料分析領域應用廣泛,尤其適用於二元分類別問題。模型核心概念在於利用 Sigmoid 函式將線性組合的輸入變數轉換為機率值,並透過對數勝算比來描述事件發生機率之間的關係。在實際應用中,例如客戶流失預測,可以透過 Python 的 scikit-learn 函式庫建立和訓練邏輯迴歸模型,並評估其預測準確率。模型解釋性方面,部分相依圖和 SHAP 值分析能幫助理解特徵變數對預測結果的影響。LIME 技術則提供另一種解釋模型預測結果的方法,尤其適用於表格資料。此外,SP-LIME 可透過選擇代表性例項來提供全域性模型行為的概覽。針對非線性模型,例如決策樹,則可以透過分析其決策路徑和規則來理解模型的預測邏輯。

邏輯斯迴歸模型的解釋與應用

邏輯斯迴歸模型是一種廣泛用於分類別問題的統計方法,尤其是在結果變數為二元或多項式分佈的情況下。與線性迴歸模型不同,邏輯斯迴歸模型透過 sigmoid 函式將線性組合的輸入變數轉換為機率值,從而實作分類別。

邏輯斯迴歸模型的數學表達

邏輯斯迴歸模型的數學表示式如下:

Sigmoid 函式

Sigmoid 函式是一種將任意實數對映到 0 和 1 之間的函式,其數學表示式為: $$ \frac{1}{1 + \exp(-t)} $$ 其中 $t$ 是輸入變數的線性組合。

對數勝算比(Log Odds)

對數勝算比是指事件發生的機率與不發生的機率之比的對數,其數學表示式為: $$ \ln\left(\frac{P}{1-P}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k $$ 其中 $P$ 是事件發生的機率,$X_i$ 是輸入變數,$\beta_i$ 是模型引數。

邏輯斯迴歸模型的解釋

邏輯斯迴歸模型的解釋與線性迴歸模型不同。線性迴歸模型的輸出是連續的,而邏輯斯迴歸模型的輸出是機率值。對數勝算比是邏輯斯迴歸模型的核心概念,它描述了事件發生的機率與不發生的機率之間的關係。

例項分析:客戶流失預測

使用客戶流失資料集(churndata.csv)來演示邏輯斯迴歸模型的應用。資料集包含 3,333 筆記錄和 18 個特徵變數。

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 載入資料集
df_train = pd.read_csv('ChurnData.csv')

# 資料預處理
del df_train['Unnamed: 0']
df_train['area_code_tr'] = LabelEncoder().fit_transform(df_train['area_code'])
del df_train['area_code']
df_train['target_churn_dum'] = pd.get_dummies(df_train['churn'], prefix='churn', drop_first=True)
del df_train['international_plan']
del df_train['voice_mail_plan']
del df_train['churn']

# 分割訓練集和測試集
X = df_train[['account_length', 'number_vmail_messages', 'total_day_minutes', 'total_day_calls', 'total_day_charge', 'total_eve_minutes', 'total_eve_calls', 'total_eve_charge', 'total_night_minutes', 'total_night_calls', 'total_night_charge', 'total_intl_minutes', 'total_intl_calls', 'total_intl_charge', 'number_customer_service_calls', 'area_code_tr']]
Y = df_train['target_churn_dum']
xtrain, xtest, ytrain, ytest = train_test_split(X, Y, test_size=0.20, stratify=Y)

# 建立邏輯斯迴歸模型
log_model = LogisticRegression()
log_model.fit(xtrain, ytrain)

# 模型評估
print("訓練準確率:", log_model.score(xtrain, ytrain))
print("測試準確率:", log_model.score(xtest, ytest))

內容解密:

  1. 資料預處理:首先對資料進行預處理,包括刪除不必要的欄位、對類別變數進行編碼等。
  2. 分割訓練集和測試集:將資料分割為訓練集和測試集,以評估模型的效能。
  3. 建立邏輯斯迴歸模型:使用 LogisticRegression 類別建立邏輯斯迴歸模型,並對訓練集進行訓練。
  4. 模型評估:透過計算訓練準確率和測試準確率來評估模型的效能。

邏輯斯迴歸模型的優缺點

邏輯斯迴歸模型的優點包括:

  • 能夠處理二元或多項式分類別問題。
  • 能夠提供事件發生的機率。

缺點包括:

  • 假設輸入變數與對數勝算比之間存線上性關係。
  • 對異常值敏感。

邏輯迴歸模型的解釋性分析

在進行邏輯迴歸模型的解釋性分析時,區域性解釋和全域性解釋是兩個重要的導向。區域性解釋主要關注單一觀察值的預測結果,而全域性解釋則著眼於整個模型的行為。

區域性解釋:部分相依圖

部分相依圖(Partial Dependence Plot)是一種用於展示某個特徵與預測結果之間關係的視覺化工具。對於邏輯迴歸模型,部分相依圖同樣適用。在下面的程式碼中,我們使用 shap 函式庫來生成部分相依圖:

sample_ind = 25
fig, ax = shap.partial_dependence_plot(
    "total_day_minutes", model_churn_proba, X, 
    model_expected_value=True, feature_expected_value=True, 
    show=False, ice=False
)

內容解密:

  1. sample_ind = 25:選擇資料集中的第25筆記錄作為範例。
  2. shap.partial_dependence_plot:生成部分相依圖。
    • "total_day_minutes":指定的特徵名稱。
    • model_churn_proba:邏輯迴歸模型的預測函式。
    • X:特徵資料集。
    • model_expected_value=Truefeature_expected_value=True:顯示模型的預期值和特徵的預期值。
    • show=Falseice=False:不顯示個別條件期望值(ICE)曲線。

SHAP 值分析

SHAP(SHapley Additive exPlanations)是一種用於解釋模型預測結果的方法。我們可以使用 shap.Explainer 來計算邏輯迴歸模型的 SHAP 值:

background_churn = shap.maskers.Independent(X, max_samples=1000)
explainer = shap.Explainer(log_model, background_churn, feature_names=list(X.columns))
shap_values_churn = explainer(X)

內容解密:

  1. shap.maskers.Independent(X, max_samples=1000):建立一個遮罩器,用於隨機抽樣1000筆資料作為背景資料。
  2. shap.Explainer:建立一個 SHAP 直譯器。
    • log_model:邏輯迴歸模型。
    • background_churn:背景資料遮罩器。
    • feature_names=list(X.columns):指定特徵名稱。
  3. explainer(X):計算資料集 X 的 SHAP 值。

SHAP 值的視覺化

我們可以使用不同的視覺化方法來展示 SHAP 值,例如散點圖、條形圖、蜂群圖和熱力圖。

shap.plots.scatter(shap_values_churn[:,'account_length'])
shap.plots.bar(shap_values_churn_log_odds)
shap.plots.beeswarm(shap_values_churn_log_odds)
shap.plots.heatmap(shap_values_churn_log_odds[:1000])

內容解密:

  1. shap.plots.scatter:繪製特徵 “account_length” 的 SHAP 值散點圖。
  2. shap.plots.bar:繪製 SHAP 值的條形圖,顯示每個特徵的重要性。
  3. shap.plots.beeswarm:繪製蜂群圖,展示 SHAP 值的分佈和特徵的重要性。
  4. shap.plots.heatmap:繪製熱力圖,顯示前1000筆記錄的 SHAP 值。

邏輯迴歸模型的係數分析

邏輯迴歸模型的係數可以用來分析特徵對預測結果的影響。

temp_df = pd.DataFrame()
temp_df['Feature Name'] = pd.Series(X.columns)
temp_df['Coefficients'] = pd.Series(log_model.coef_.flatten())
temp_df.sort_values(by='Coefficients', ascending=False)

內容解密:

  1. 建立一個臨時 DataFrame 來儲存特徵名稱和對應的係數。
  2. 將係數按照降序排列,以顯示最重要的特徵。

結果解釋

透過分析 SHAP 值和邏輯迴歸模型的係數,我們可以瞭解每個特徵對預測結果的影響。例如,當某個特徵的值增加一單位時,模型的預測結果將如何變化。這些資訊對於理解模型的行為和做出更好的決策至關重要。

LIME 推理

除了 SHAP 值之外,LIME(Local Interpretable Model-agnostic Explanations)也是另一種用於解釋模型預測結果的方法。然而,在處理大規模資料集時,LIME 的計算複雜度較高。因此,在某些情況下,SHAP 值可能是一個更為合適的選擇。

總而言之,透過結合局部解釋和全域性解釋的方法,我們可以更全面地瞭解邏輯迴歸模型的行為和預測結果。這些資訊對於模型的改進和最佳化具有重要的參考價值。

LIME(區域性可解釋模型無關解釋)在表格資料解釋的應用

LIME是一種用於解釋複雜機器學習模型預測結果的技術,特別是在處理大型資料集時能提供快速的解釋。對於結構化的表格資料,LIME提供了Lime Tabular Explainer來進行解釋。

LIME Tabular Explainer的運作原理

  1. 數值特徵擾動:對數值特徵進行擾動是透過從Normal(0,1)中抽樣,並根據訓練資料的平均值和標準差進行逆運算來實作的。
  2. 類別特徵擾動:對類別特徵的擾動是根據訓練資料的分佈進行抽樣,並建立一個二元特徵,當該值與被解釋例項相同時為1。

生成LIME直譯器

生成LIME直譯器需要傳遞資料陣列、列名列表、目標列名,並根據機器學習任務設定模式為迴歸或分類別。同時,可以啟用verbose選項來取得模型的預測結果。

import lime
import lime.lime_tabular

explainer = lime.lime_tabular.LimeTabularExplainer(
    np.array(xtrain),
    feature_names=list(xtrain.columns),
    class_names=['target_churn_dum'],
    verbose=True, 
    mode='classification'
)

內容解密:

  • lime.lime_tabular.LimeTabularExplainer:建立一個LIME表格直譯器例項,用於解釋表格資料的預測結果。
  • np.array(xtrain):將訓練資料轉換為numpy陣列,以便LIME處理。
  • feature_names=list(xtrain.columns):提供特徵名稱列表,用於在解釋中標識各個特徵。
  • class_names=['target_churn_dum']:指定目標變數的類別名稱,用於分類別任務。
  • verbose=True:啟用詳細模式,可以顯示模型的預測結果,有助於理解解釋過程。
  • mode='classification':設定LIME的運作模式為分類別任務,與所使用的機器學習模型相匹配。

解釋例項預測結果

一旦生成了直譯器物件,就可以對個別預測結果進行解釋。對於分類別任務,可以為每個類別生成相應的特徵重要性。

# 對第一筆測試資料進行解釋
exp = explainer.explain_instance(
    xtest.iloc[0], 
    log_model.predict_proba, 
    num_features=16
)
exp.as_list()

內容解密:

  • explainer.explain_instance:對指定的例項進行解釋,傳回一個Explanation物件。
  • xtest.iloc[0]:選擇測試集中的第一筆資料進行解釋。
  • log_model.predict_proba:使用邏輯迴歸模型的預測機率作為解釋的基礎。
  • num_features=16:指定在解釋中最多顯示16個特徵的重要性。
  • exp.as_list():將解釋結果轉換為列表形式,方便進一步處理或展示。

呈現解釋結果

可以將解釋結果以表格形式呈現,並限制顯示最重要的特徵。

pd.DataFrame(exp.as_list())

內容解密:

  • pd.DataFrame(exp.as_list()):將LIME的解釋結果列表轉換為Pandas DataFrame,以便於在 Jupyter Notebook 中以表格形式清晰地呈現特徵及其對預測結果的影響。

SP-LIME:提供全域性決策邊界

SP-LIME是一種透過選擇一組具有代表性的例項來提供全域性模型行為概覽的方法。

from lime import submodular_pick

sp_obj = submodular_pick.SubmodularPick(
    explainer, 
    np.array(xtrain), 
    log_model.predict_proba, 
    num_features=14, 
    num_exps_desired=10
)

內容解密:

  • submodular_pick.SubmodularPick:建立一個SP-LIME物件,用於選擇一組具有代表性的例項來解釋模型的全域性行為。
  • explainer:之前建立的LIME直譯器物件,用於對例項進行區域性解釋。
  • np.array(xtrain):訓練資料集,用於選擇代表性例項。
  • log_model.predict_proba:模型的預測機率函式,用於評估例項的重要性。
  • num_features=14:在生成的解釋中,限制顯示的特徵數量為14。
  • num_exps_desired=10:期望生成的代表性例項數量為10,用於提供全域性概覽。

圖表解說

透過LIME和SP-LIME,可以生成多個圖表來展示不同例項的預測結果和特徵重要性。例如,圖3-23展示了第一筆測試資料的區域性解釋結果,而圖3-24則展示了第20筆測試資料的區域性解釋結果。這些圖表有助於理解模型在不同例項上的行為。

非線性模型的解釋性

本章將探討如何使用LIME、SHAP和Skope-rules等可解釋的人工智慧Python函式庫,來解釋非線性模型在監督式學習任務中的決策過程,特別是針對結構化資料。在本章中,您將學習到各種解釋非線性模型和樹狀模型的方法,以及它們在預測因變數時的決策過程。在監督式機器學習任務中,存在一個目標變數(也稱為因變數)和一組自變數。目標是預測因變數作為輸入變數或自變數的加權總和,其中存在高度的特徵互動和非線性複雜關係。

非線性模型

決策樹是一種非線性模型,它將自變數對映到因變數。在區域性層面上,這可以被視為區域性線性迴歸,但在全域層面上,這是一個非線性模型,因為自變數和因變數之間沒有一一對應的關係。與線性迴歸模型不同,決策樹沒有數學方程式來表示輸入和輸出變數之間的關係。如果我們將最大樹深度引數設定為無限大,那麼決策樹可能會完美地擬合資料,這是模型過度擬合的典型情況。無論訓練資料集是否線性可分,決策樹都容易過度擬合,這需要被解決。人們通常會進行樹剪枝,以獲得最佳的決策樹模型。

決策樹可以被視為一系列條件陳述,最終導致輸出欄位中的值或類別。例如,如果一個人45歲,在私營部門工作,並擁有博士學位,那麼他們的年收入肯定超過5萬美元。決策樹是一種監督式學習演算法,適用於當有無限多種特徵組合可能影響目標欄位的情況。在決策樹中,我們根據輸入變數中最重要的分隔符或區分符,將母體分成兩個或多個子母體。

決策樹演算法的主要步驟

  • 識別資料集中具有高預測值的最佳屬性或特徵,並將其置於樹的根節點
  • 將訓練資料集分成子集,使得每個子集對於某個屬性具有相同的值
  • 重複上述兩個步驟,直到所有類別都被分離到一個節點中,或者滿足節點中所需的最小樣本數

在決策樹模型中,要預測記錄的類別標籤,我們從樹的根節點開始。我們比較根屬性的值,並使用最佳屬性作為起始點,隨後不斷發展決策樹。當我們檢視模型的解釋性時,決策樹能夠很好地解釋其預測結果。簡單來說,決策樹提供了可以直接被任何應用程式使用的規則。這些規則大多是一系列if/else陳述。

內容解密:

  1. 決策樹的工作原理:決策樹是一種監督式學習演算法,它透過將資料分成多個子群體來捕捉資料中的非線性關係。
  2. 決策樹的優點:決策樹能夠提供清晰的規則,並且能夠處理多個特徵之間的互動關係。
  3. 決策樹的缺點:決策樹容易過度擬合,需要透過剪枝等技術來最佳化。

在特徵之間存在關係的情況下,例如特徵之間的互動、特徵的平方或立方值與因變數相關等情況下,線性迴歸和邏輯迴歸很可能會失敗。這是因為特徵互動的數量可能很多。根據樹的模型會考慮特徵值,決定閾值,並將特徵分成兩個部分,然後不斷生長樹的分支。將資料分成多個子群體的過程有助於捕捉資料中的非線性關係。同樣地,平方和立方特徵也遵循模型所規定的if/else規則。

圖表說明:決策樹範例

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表說明:決策樹範例

rectangle ">= 45" as node1
rectangle "< 45" as node2
rectangle "私營" as node3
rectangle "公營" as node4
rectangle "博士" as node5
rectangle "非博士" as node6

node1 --> node2
node2 --> node3
node3 --> node4
node4 --> node5
node5 --> node6

@enduml

此圖示展示了一個簡單的決策樹範例,用於根據年齡、工作部門和學歷預測收入。

本章重點:
  • 瞭解非線性模型的基本概念
  • 學習如何使用LIME、SHAP和Skope-rules等可解釋的人工智慧Python函式庫來解釋非線性模型
  • 瞭解決策樹的工作原理和優缺點

透過本章的學習,您應該能夠更好地理解非線性模型的解釋性,並且能夠使用相關的工具和技術來分析和解釋這些模型的預測結果。