演算法金 | 你真的完全理解 Logistic 迴歸演算法了嗎

算法金「全网同名」發表於2024-06-03


大俠幸會,在下全網同名「演算法金」 0 基礎轉 AI 上岸,多個演算法賽 Top 「日更萬日,讓更多人享受智慧樂趣」

今日 178/10000

1. 引言

吳恩達:機器學習的六個核心演算法!

通透!!十大回歸演算法模型最強總結

突破最強演算法模型,決策樹演算法!!

急匆匆把 邏輯迴歸 給落下了,今天我們殺他個回馬槍,再戰三百回合

邏輯迴歸 Logistic 迴歸是一種用於分類問題的統計方法。它透過使用邏輯函式(如 Sigmoid 函式)將輸入變數的線性組合對映到一個機率值,從而實現分類任務。

Logistic 迴歸廣泛應用於許多領域,主要用於二分類問題,例如:

  • 信用評分:預測借款人是否會違約。
  • 醫學診斷:判斷某個患者是否患有某種疾病。
  • 市場營銷:預測客戶是否會購買某產品。
  • 社會學研究:分析某種行為是否會發生。

透過這篇文章,你將深入瞭解 Logistic 迴歸的原理、模型構建方法以及如何使用 Python 實現 Logistic 迴歸模型。

2. 數學基礎

2.1 線性迴歸實現分類

在理解 Logistic 迴歸之前,我們先回顧一下線性迴歸。線性迴歸用於預測連續值,其數學形式為:

簡化演示:比如這樣的一個簡單的 2 類別樣本分佈,我們可以最終得到線性方程視覺化後的結果可能如下:

下一步,我們可以把這個線性迴歸延申到分類任務中,怎麼做呢?

  • 我們可以設定一個閾值,大於和小於這個閾值的分別屬於兩類(等於閾值呢,愛咋咋地,影響不大)
  • 我們可以從下圖看到,這個分類結果很完美,完全把兩個類別區分開了

2.2 線性迴歸分類的缺點

線性迴歸雖簡單有效,但在分類問題中存在侷限。線性迴歸的輸出是連續值,而分類問題需要離散的類標籤。此外,線性迴歸不能保證輸出值在 0 和 1 之間,這對於機率預測是不合理的。

接著 2.1 的內容,透過對比直觀的理解一下線性迴歸分類的缺點

2.1 描述的迴歸轉分類的方式,在下面場合就不靈了,比如收集資料的小哥哥小姐姐開了個小差,資料中混入一個異常點

  • 這時候分類結果就很不理想了,如下圖,如果我們還是使用 0.5 為閾值,那中間幾個樣本都被分類錯了
  • 除非我們更換閾值,問題是設定多少為閾值呢?想想看,這樣是不是表現很不穩定

2.3 Logistic 函式(Sigmoid 函式)

為了解決上述問題,來了

邏輯迴歸(Logistic Regression,簡稱 LR)是一種廣義線性模型(GLM),通常用於分類問題。與傳統的線性迴歸模型(預測連續值輸出)不同,邏輯迴歸預測的是一個機率值,表示為介於 0 和 1 之間的數。這使得它非常適合於二分類問題

Logistic 迴歸使用了 Sigmoid 函式,其數學形式為:

Sigmoid 函式將任意實數對映到 (0, 1) 之間,非常適合用於表示機率。

再次,直觀的感受下,邏輯迴歸這個神奇的過程

2.4 理解分類目標

預測和實際的對比

在使用邏輯迴歸進行分類時,核心目標是確保模型的預測機率儘可能接近實際的標籤。例如,如果一個樣本的實際標籤是 1(正類),邏輯迴歸模型預測這個樣本屬於正類的機率應該接近 1。相反,如果樣本的標籤是 0(負類),則模型的預測機率應接近 0。這種方式幫助我們評價和最佳化模型的效能,確保模型能夠正確區分不同類別的樣本。

2.5 最大似然估計

最大似然估計(MLE)是一種在統計模型中估計引數的方法,它尋找能夠使觀測到的資料出現機率最大的引數值。在邏輯迴歸中,MLE嘗試找到一組引數,使得給定引數下,觀測到的樣本標籤的機率最大化。這通常透過最佳化一個稱為似然函式的表示式來實現,該函式是對所有資料點的預測機率的乘積。

2.6 交叉熵損失

交叉熵損失函式解釋

交叉熵損失函式是評估邏輯迴歸模型效能的一個關鍵工具。它衡量的是模型預測的機率分佈與實際標籤的機率分佈之間的差異。公式可以表示為:

其中 ( y ) 是實際標籤,( p ) 是預測為正類的機率。這個損失函式的值越小,表示模型的預測結果與實際情況越接近。

損失函式與預測準確度的關係

一般來說,交叉熵損失函式的值越小,模型的分類準確度越高。透過訓練過程中損失函式的下降趨勢,我們可以觀察到模型效能的改善。實際操作中,可以透過繪製訓練週期與損失值的圖表來直觀展示這一過程,幫助理解模型最佳化的效果。

3. 模型構建

3.1 資料準備與預處理

在構建 Logistic 迴歸模型之前,資料的準備和預處理是關鍵步驟。包括:

  • 資料清洗:處理缺失值和異常值。
  • 特徵選擇:選擇與目標變數相關的特徵。
  • 資料標準化:將特徵縮放到相同的範圍內,以提高模型的收斂速度。

示例程式碼:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 生成一個武俠主題的資料集
data = {
    '內力': [80, 60, 70, 90, 85, 75],
    '輕功': [85, 75, 65, 95, 80, 70],
    '武器': [1, 0, 1, 0, 1, 0],  # 1 表示有武器,0 表示無武器
    '是否勝利': [1, 0, 1, 1, 1, 0]  # 1 表示勝利,0 表示失敗
}
df = pd.DataFrame(data)

# 特徵和標籤
X = df[['內力', '輕功', '武器']]
y = df['是否勝利']

# 拆分資料集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 資料標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

3.2 模型假設與引數估計

Logistic 迴歸假設特徵與目標變數之間存線上性關係,透過 Sigmoid 函式進行非線性變換。引數估計透過最大化對數似然函式來實現。

3.3 梯度下降法模型最佳化

演算法原理

梯度下降法是一種用於最佳化邏輯迴歸模型引數的流行演算法,其核心思想是利用函式的梯度(或斜率)來確定引數更新的方向。梯度指示了函式增長最快的方向,因此在最佳化過程中,我們沿著梯度的相反方向(下降最快的方向)調整引數,以尋找函式的最小值。

梯度下降可以透過一個簡單的比喻來理解:想象你在山上,需要找到下山的最快路徑。在任何位置,你都可以檢視周圍最陡峭的下坡路,然後朝那個方向邁出一步。梯度下降法就是這樣在引數空間中尋找損失函式最小值的方法。

演算法步驟

梯度下降的每一步都需要計算損失函式關於每個引數的梯度,然後用以下公式更新引數:

其中:

  • ( θ ) 表示模型引數。
  • ( α ) 是學習率,控制步長的大小。

是損失函式 ( J ) 關於引數 (θ) 的梯度

更新的步驟重複進行,直到滿足停止條件,例如梯度的大小小於某個閾值,或達到預定的迭代次數。

在實際操作中,選擇合適的學習率是非常關鍵的,因為太小的學習率會導致收斂過慢,而太大的學習率則可能導致跳過最小值點,使得演算法無法正確收斂。

4. 模型評估

4.1 混淆矩陣

混淆矩陣是一種用於評估分類模型效能的工具,它展示了預測結果與實際標籤的對比情況。混淆矩陣包括以下四個指標:

  • TP(True Positive):真實為正類,預測為正類。
  • TN(True Negative):真實為負類,預測為負類。
  • FP(False Positive):真實為負類,預測為正類。
  • FN(False Negative):真實為正類,預測為負類。

示例程式碼:

from sklearn.metrics import confusion_matrix

# 預測
y_pred = model.predict(X_test)

# 混淆矩陣
cm = confusion_matrix(y_test, y_pred)
print(f'混淆矩陣:\n{cm}')

4.2 精度、召回率與 F1 值

精度(Precision)、召回率(Recall)和 F1 值是評價分類模型的重要指標:

示例程式碼:

from sklearn.metrics import precision_score, recall_score, f1_score

precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print(f'精度: {precision}')
print(f'召回率: {recall}')
print(f'F1 值: {f1}')

4.3 ROC 曲線與 AUC 值

ROC 曲線(Receiver Operating Characteristic Curve)展示了模型在不同閾值下的效能表現。AUC 值(Area Under Curve)是 ROC 曲線下的面積,用於衡量模型的區分能力。

示例程式碼:

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# 預測機率
y_prob = model.predict_proba(X_test)[:, 1]

# 計算 ROC 曲線
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)

# 繪製 ROC 曲線
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC 曲線 (面積 = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('假正率 (False Positive Rate)')
plt.ylabel('真正率 (True Positive Rate)')
plt.title('接收者操作特徵曲線 (ROC)')
plt.legend(loc='lower right')
plt.show()

透過這些指標和視覺化方法,我們可以全面評估 Logistic 迴歸模型的效能。在下一部分中,我們將透過一個實際示例來展示如何使用 Python 構建和評估 Logistic 迴歸模型。`

5. 實戰示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, accuracy_score, recall_score, f1_score, roc_curve, auc
from sklearn.model_selection import train_test_split

# 生成模擬資料
X, y = make_classification(n_samples=300, n_features=2, n_informative=2, n_redundant=0,
                           n_clusters_per_class=1, flip_y=0.01, random_state=42)

# 分割資料集為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 使用邏輯迴歸進行分類
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]

# 計算混淆矩陣、精度、召回率和 F1 值
cm = confusion_matrix(y_test, y_pred)
accuracy = accuracy_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

# 列印混淆矩陣和其他指標
print("混淆矩陣:\n", cm)
print("精度:", accuracy)
print("召回率:", recall)
print("F1 值:", f1)

# 視覺化資料和決策邊界
plt.figure(figsize=(10, 6))
plt.scatter(X_test[y_test == 0][:, 0], X_test[y_test == 0][:, 1], color='red', label='類別 0', edgecolor='k')
plt.scatter(X_test[y_test == 1][:, 0], X_test[y_test == 1][:, 1], color='blue', label='類別 1', edgecolor='k')

# 繪製決策邊界和填充區域
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
                     np.arange(y_min, y_max, 0.01))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.2, cmap=plt.cm.Paired)
plt.contour(xx, yy, Z, levels=[0.5], linestyles='dashed', colors='black')

plt.title('武俠世界中的高手分類圖')
plt.xlabel('功力')
plt.ylabel('內功心法')
plt.legend()
plt.show()

# 計算並視覺化 ROC 曲線
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)

plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC 曲線 (面積 = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('假陽性率')
plt.ylabel('真陽性率')
plt.title('受試者工作特徵 (ROC) 曲線')
plt.legend(loc="lower right")
plt.show()

執行後輸出:

混淆矩陣:
 [[44  2]
 [ 2 42]]
精度: 0.9555555555555556
召回率: 0.9545454545454546
F1 值: 0.9545454545454546

這張圖展示了模型在不同閾值下的效能:

  • X 軸表示假陽性率(False Positive Rate, FPR),即被錯誤預測為正類的負類樣本的比例。
  • Y 軸表示真陽性率(True Positive Rate, TPR),即被正確預測為正類的正類樣本的比例。
  • 曲線表示模型在不同閾值下的表現。
  • 對角線(從 (0, 0) 到 (1, 1) 的虛線)表示隨機猜測的表現。

曲線越接近左上角,模型的效能越好。在這次執行中,曲線下的面積(AUC)為 0.98,表示模型在區分正負類樣本時具有很高的效能。很強大

這張圖展示了測試資料點及其分類結果:

  • 紅色點代表類別 0(例如低等級武俠高手)。
  • 藍色點代表類別 1(例如高等級武俠高手)。
  • 黑色虛線表示模型的決策邊界,劃分了類別 0 和類別 1 的區域。
  • 背景顏色:決策邊界兩側的背景顏色不同,用於區分類別。左側區域(通常是類別 0)為淺紅色,右側區域(通常是類別 1)為淺藍色。

這張圖展示了模型如何基於兩個特徵(功力和內功心法)對資料點進行分類。大部分資料點都被正確分類,但也有少量資料點被誤分類,這些誤分類的資料點位於決策邊界附近。 再次,強大

6. 進階話題

6.1 正則化與過擬合

在 Logistic 迴歸中,正則化是一種防止過擬合的技術。過擬合是指模型在訓練集上表現良好,但在測試集上表現不佳。正則化透過在損失函式中加入懲罰項來減少模型的複雜度,從而提高模型的泛化能力。

  • L1 正則化(Lasso):透過增加引數絕對值之和的懲罰項,使部分引數變為零,達到特徵選擇的效果。
  • L2 正則化(Ridge):透過增加引數平方和的懲罰項,使得所有引數趨近於零,但不會完全為零。

示例程式碼:

# 使用 L1 正則化
model_l1 = LogisticRegression(penalty='l1', solver='liblinear')
model_l1.fit(X_train, y_train)

# 使用 L2 正則化
model_l2 = LogisticRegression(penalty='l2')
model_l2.fit(X_train, y_train)

print(f'L1 正則化模型係數: {model_l1.coef_}')
print(f'L2 正則化模型係數: {model_l2.coef_}')

6.2 多分類問題中的 Logistic 迴歸

Logistic 迴歸不僅可以用於二分類問題,也可以擴充套件到多分類問題。在多分類問題中,常用的方法有:

  • 一對多(One-vs-Rest, OvR):為每個類別訓練一個二分類器,每個分類器區分該類別與其他類別。
  • 一對一(One-vs-One, OvO):為每對類別訓練一個二分類器,總共訓練 𝐾(𝐾−1)2𝐾(𝐾−1)2 個分類器,其中 𝐾𝐾 是類別數量。

示例程式碼:

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 生成多分類資料集
X, y = make_classification(n_samples=100, n_features=4, n_classes=3, n_clusters_per_class=1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 訓練多分類 Logistic 迴歸模型(OvR)
model_ovr = LogisticRegression(multi_class='ovr')
model_ovr.fit(X_train, y_train)

# 訓練多分類 Logistic 迴歸模型(softmax)
model_softmax = LogisticRegression(multi_class='multinomial', solver='lbfgs')
model_softmax.fit(X_train, y_train)

print(f'OvR 模型係數: {model_ovr.coef_}')
print(f'Softmax 模型係數: {model_softmax.coef_}')

6.3 與其他分類演算法的對比

Logistic 迴歸雖然簡單,但在某些情況下可能不如其他複雜的分類演算法,如支援向量機(SVM)、隨機森林和神經網路。對比這些演算法的優缺點:

  • 支援向量機(SVM):在高維空間中尋找最優分類超平面,適用於複雜的資料集,但計算複雜度高。
  • 隨機森林:整合多棵決策樹,提高模型的準確性和穩定性,但解釋性差。
  • 神經網路:強大的非線性建模能力,適用於大規模資料,但訓練時間長且需要大量計算資源。

示例程式碼:

from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score

# 訓練 SVM 模型
svm_model = SVC()
svm_model.fit(X_train, y_train)
svm_pred = svm_model.predict(X_test)
svm_accuracy = accuracy_score(y_test, svm_pred)

# 訓練隨機森林模型
rf_model = RandomForestClassifier()
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)
rf_accuracy = accuracy_score(y_test, rf_pred)

# 訓練神經網路模型
nn_model = MLPClassifier(max_iter=1000)
nn_model.fit(X_train, y_train)
nn_pred = nn_model.predict(X_test)
nn_accuracy = accuracy_score(y_test, nn_pred)

print(f'SVM 準確率: {svm_accuracy}')
print(f'隨機森林準確率: {rf_accuracy}')
print(f'神經網路準確率: {nn_accuracy}')

透過這些進階話題的介紹,大俠們可以更全面地理解 Logistic 迴歸及其在不同場景下的應用與對比。

[ 抱個拳,總個結 ]

在這篇文章中,我們深入探討了 Logistic 迴歸這一強大的分類演算法。以下是對各個部分內容的簡要回顧:

1. 引言

我們介紹了 Logistic 迴歸的定義和應用場景。Logistic 迴歸透過 Sigmoid 函式將線性組合對映到機率值,從而實現二分類任務,廣泛應用於信用評分、醫學診斷、市場營銷等領域。

2. 數學基礎

我們回顧了線性迴歸的基本概念,討論了線性迴歸在分類問題中的侷限,並引入了 Sigmoid 函式和對數似然函式,為 Logistic 迴歸的數學基礎打下了堅實的基礎。

3. 模型構建

我們詳細介紹了資料準備與預處理的步驟,包括資料清洗、特徵選擇和資料標準化。然後,我們透過使用梯度下降法訓練 Logistic 迴歸模型,並展示了模型的引數估計方法。

4. 模型評估

我們透過混淆矩陣、精度、召回率、F1 值和 ROC 曲線等指標,全面評估了 Logistic 迴歸模型的效能。這些指標和視覺化方法幫助我們更好地理解模型的分類效果。

5. 實戰示例

在實戰示例中,我們使用一個結合武俠元素的資料集,演示瞭如何使用 Python 構建、訓練和評估 Logistic 迴歸模型。透過具體程式碼示例,幫助大俠們更直觀地理解模型的應用。

6. 進階話題

我們探討了正則化與過擬合、多分類問題中的 Logistic 迴歸以及與其他分類演算法的對比。這些進階話題擴充套件了大俠們對 Logistic 迴歸的理解,並提供了在實際應用中的更多選擇。

[ 演算法金,碎碎念 ]

全網同名,日更萬日,讓更多人享受智慧樂趣

煩請大俠多多 分享、在看、點贊,助力演算法金又猛又持久、很黃很 BL 的日更下去;

同時邀請大俠 關注、星標 演算法金,圍觀日更萬日,助你功力大增、笑傲江湖

相關文章