線性回歸和邏輯回歸其實比你想象的更相似 😃
它們都是所謂的參數模型。讓我們先看看什么是參數模型,以及它們與非參數模型的區別。
線性回歸 vs 邏輯回歸
- 線性回歸:用于回歸問題的線性參數模型。
- 邏輯回歸:用于分類問題的線性參數模型。
參數回歸模型:
- 假設函數形式
- 模型假設特定的數學方程(如線性、多項式)。
- 例:在線性回歸中,模型假設如下形式:
Y = β 0 + β 1 X 1 + β 2 X 2 + ? + β n X n + ? Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \dots + \beta_nX_n + \epsilon Y=β0?+β1?X1?+β2?X2?+?+βn?Xn?+?
其中 β i \beta_i βi? 是參數, ? \epsilon ? 是誤差項。
- 參數數量固定
- 模型復雜度由一組固定參數決定,與訓練數據量無關。
- 學習高效
- 由于模型結構預先定義,訓練參數模型通常計算高效。
- 可解釋性強
- 許多參數模型(如線性回歸)具有可解釋性,便于理解每個特征對預測的影響。
- 用有限參數總結數據的模型。
- 對數據分布有假設。
- 如線性/邏輯回歸、神經網絡
非參數模型:
- 無法用有限參數描述的模型。
- 對數據分布無假設。
- 如基于實例的學習,使用訓練數據生成假設
- 例子:kNN 和決策樹
邏輯(Sigmoid)函數
f ( x ) = 1 1 + e ? x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e?x1?
其導數為:
f ′ ( x ) = f ( x ) ( 1 ? f ( x ) ) f'(x) = f(x)(1 - f(x)) f′(x)=f(x)(1?f(x))
這說明:
- 任意點的導數取決于該點的函數值
- 當 f(x) 接近 0 或 1 時,導數變得很小
- 當 f(x) = 0.5(Sigmoid 曲線中點)時導數最大
這個性質使得 sigmoid 在機器學習中很有用:
- 它將輸入"壓縮"到 [0,1] 區間
- 導數易于計算(只需輸出乘以 1 減自身)
- 在 0 和 1 附近導數很小,有助于防止權重更新過大
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):fx = sigmoid(x)return fx * (1 - fx)
多元 sigmoid 函數
f ( x , y ) = 1 1 + e ? ( a x + b y + c ) f(x, y) = \frac{1}{1 + e^{-(ax + by + c)}} f(x,y)=1+e?(ax+by+c)1?
其中 a a a、 b b b、 c c c 是決定 sigmoid 曲面形狀的常數。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# 定義二維 sigmoid 函數
def sigmoid(x, y, a=1, b=1, c=0):return 1 / (1 + np.exp(-(a*x + b*y + c)))# 生成網格點
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = sigmoid(X, Y)# 繪制曲面
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')# 標簽
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Sigmoid(X, Y)')
ax.set_title('多元 Sigmoid 函數的 3D 圖')plt.show() """
Meshgrid 用于生成 x 和 y 的取值。
- Z 值通過 sigmoid 函數計算。
- 使用 plot_surface() 和 viridis 顏色映射繪制 3D 曲面。
"""
交叉熵方法
交叉熵衡量兩個概率分布之間的差異。在機器學習中,它常作為損失函數,尤其用于分類問題。
關鍵概念:
基本公式
H ( p , q ) = ? ∑ x p ( x ) log ? ( q ( x ) ) H(p,q) = -\sum_x p(x)\log(q(x)) H(p,q)=?∑x?p(x)log(q(x))
其中:
- p ( x ) p(x) p(x) 為真實概率分布(標簽)
- q ( x ) q(x) q(x) 為預測概率分布
- ∑ x \sum_x ∑x? 表示對所有可能的 x 求和
二元交叉熵(用于二分類):
H ( y , y ^ ) = ? [ y log ? ( y ^ ) + ( 1 ? y ) log ? ( 1 ? y ^ ) ] H(y,\hat{y}) = -[y\log(\hat{y}) + (1-y)\log(1-\hat{y})] H(y,y^?)=?[ylog(y^?)+(1?y)log(1?y^?)]
其中:
- y y y 為真實標簽(0 或 1)
- y ^ \hat{y} y^? 為預測概率
def binary_cross_entropy(y_true, y_pred):return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
性質
- 總是非負
- 預測與真實分布完全一致時為 0
- 值越大表示預測越差
- 對自信但錯誤的預測懲罰更重
交叉熵在分類中的優勢:
- 比均方誤差提供更強梯度
- 適用于概率輸出(如 sigmoid 或 softmax)
- 對過度自信的錯誤預測懲罰大
分類模型
簡單模型:
感知機(Perceptron)
感知機是一種二分類器,通過對輸入特征加權求和并通過激活函數判斷類別。
感知機包括:
- 輸入(特征): x 1 , x 2 , … , x n x_1, x_2, …, x_n x1?,x2?,…,xn?
- 權重: w 1 , w 2 , … , w n w_1, w_2, …, w_n w1?,w2?,…,wn?(訓練中學習)
- 偏置(b):調整決策邊界
- 求和函數: z = ∑ w i x i + b z = \sum w_i x_i + b z=∑wi?xi?+b
- 激活函數:通常為階躍函數,輸出:
- 1 1 1 若 z ≥ 0 z \geq 0 z≥0(一類)
- 0 0 0 若 z < 0 z < 0 z<0(另一類)
數學表達
y = f ( ∑ i = 1 n w i x i + b ) y = f\left(\sum_{i=1}^{n} w_i x_i + b \right) y=f(∑i=1n?wi?xi?+b)
其中 f(z) 為激活函數(常用階躍或符號函數)。
感知機學習算法
- 隨機初始化權重和偏置。
- 對每個訓練樣本:
- 用加權和和激活函數計算輸出。
- 與真實標簽比較,按如下公式更新權重:
w i = w i + η ( y true ? y pred ) x i w_i = w_i + \eta (y_{\text{true}} - y_{\text{pred}}) x_i wi?=wi?+η(ytrue??ypred?)xi? - 類似地調整偏置。
- 重復直到分類正確或達到停止條件。
局限性
- 感知機只能分類線性可分數據(如 AND、OR 邏輯門)。
- 無法解決如 XOR 這類需多層的非線性問題。
多層感知機(MLP)
為克服線性可分限制,將多個感知機堆疊成多層感知機(MLP),并用非線性激活函數(如 sigmoid、ReLU、tanh)。
示例:用感知機實現 AND 門分類
我們將訓練感知機模擬 AND 邏輯門。
數據集(AND 門)
輸入 x 1 x_1 x1? | 輸入 x 2 x_2 x2? | 輸出 y y y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
感知機應學會正確預測輸出。
感知機模型
感知機公式:
y = f ( w 1 x 1 + w 2 x 2 + b ) y = f(w_1 x_1 + w_2 x_2 + b) y=f(w1?x1?+w2?x2?+b)
其中:
- w 1 w_1 w1?, w 2 w_2 w2? 為權重
- b b b 為偏置
- f ( z ) f(z) f(z) 為階躍激活函數:
f ( z ) = { 1 , if? z ≥ 0 0 , if? z < 0 f(z) = \begin{cases} 1, & \text{if } z \geq 0 \\ 0, & \text{if } z < 0 \end{cases} f(z)={1,0,?if?z≥0if?z<0?
學習算法
- 初始化權重 w 1 w_1 w1?, w 2 w_2 w2? 和偏置 b b b(如小隨機值)。
- 對每個訓練樣本 ( x 1 , x 2 , y ) (x_1, x_2, y) (x1?,x2?,y):
- 計算 z = w 1 x 1 + w 2 x 2 + b z = w_1 x_1 + w_2 x_2 + b z=w1?x1?+w2?x2?+b
- 應用激活函數得預測 y ^ \hat{y} y^?。
- 若預測錯誤,按如下公式更新權重:
w i = w i + η ( y true ? y ^ ) x i w_i = w_i + \eta (y_{\text{true}} - \hat{y}) x_i wi?=wi?+η(ytrue??y^?)xi?
其中 η \eta η 為學習率。
- 重復直到權重收斂。
決策邊界可視化
讓我們可視化訓練好的 AND 感知機:
- 感知機找到一條分隔數據的直線。
- 由于 AND 可線性分割,感知機可解決。
- 決策邊界是一條直線。
上圖展示了感知機對 AND 門的分類:
- 紅圈(類別 0)為 AND 輸出為 0 的點。
- 藍方塊(類別 1)為 AND 輸出為 1 的點。
- 虛線為感知機學到的決策邊界。
虛線下方為 0,上方為 1。由于 AND 可線性分割,單層感知機可正確分類。
K 近鄰(KNN)
KNN 是一種非參數、基于實例的學習方法,可用于__分類__和__回歸__。它根據最近鄰的多數類別(分類)或均值(回歸)做預測。
步驟:
- 選擇 K:確定考慮的最近鄰數量。
- 計算距離:用如下度量計算新點與所有訓練點的距離:
- 歐氏距離:
$ d(A,B) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} $ - 曼哈頓距離
- 閔可夫斯基距離
- 歐氏距離:
- 找到 K 個最近鄰:確定距離新點最近的 K 個點。
- 做出預測:
- 分類:取 K 鄰居中最多的類別(多數投票)。
- 回歸:取 K 鄰居的均值。
想象你有一組數據,要將新點分為紅或藍:
- 若 K = 3,取最近 3 個鄰居。
- 若 2 個為藍,1 個為紅,則新點歸為藍。
KNN 優點:
- 簡單易實現
- 無需訓練(惰性學習)
- 適合小數據集
- 可用于分類和回歸
KNN 缺點:
- 計算量大(大數據集時每次預測都要算距離)
- 對無關特征和噪聲敏感
- K 的選擇很關鍵
KNN 適用場景:
- 小到中等規模數據集
- 需要可解釋性
- 作為復雜模型前的基線
如何選 K:
- K 小 → 鄰域小 → 高復雜度 → 易過擬合
- K 大 → 鄰域大 → 低復雜度 → 易欠擬合
- 實踐中常選 3–15,或 K < 𝑁(N 為訓練樣本數)。
# KNN 示例實現
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_classification
from matplotlib.colors import ListedColormap# 生成合成數據集
# n_features=2: 2 個特征。
# n_informative=2: 兩個特征都有用。
# n_redundant=0: 無冗余特征。
# n_clusters_per_class=1: 每類一個簇。
X, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0, n_classes=2, n_clusters_per_class=1, random_state=42)
# 訓練 KNN 模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X, y)# 創建決策邊界的網格
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.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))# 對網格每個點做預測
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)# 繪制決策邊界
plt.figure(figsize=(6, 4))
cmap_light = ListedColormap(["#FFAAAA", "#AAAAFF"])
cmap_bold = ListedColormap(["#FF0000", "#0000FF"])
plt.contourf(xx, yy, Z, cmap=cmap_light, alpha=0.5)# 繪制數據點
scatter = plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold, edgecolor="k", s=50)
plt.legend(handles=scatter.legend_elements()[0], labels=["類別 0", "類別 1"])# 標簽
plt.xlabel("特征 1")
plt.ylabel("特征 2")
plt.title("K 近鄰決策邊界 (K=5)")
plt.show()# 下圖為 KNN 決策邊界說明:
# 紅/藍區域:兩類的決策邊界。
# 不同顏色的點:不同類別的數據點。
# 平滑邊界:KNN 根據 K 個鄰居的多數類別分配標簽。
混淆矩陣
混淆矩陣用于評估分類模型的性能。它是一個表格,匯總了模型的預測與實際結果的對比。
- 真正例(TP):被正確預測為正類的樣本數。
- 真負例(TN):被正確預測為負類的樣本數。
- 假正例(FP):被錯誤預測為正類的樣本數(I 型錯誤)。
- 假負例(FN):被錯誤預測為負類的樣本數(II 型錯誤)。
混淆矩陣有助于理解模型的表現,尤其是區分不同類別的能力。它揭示了模型的錯誤類型,并可用于計算準確率、精確率、召回率和 F1 分數等指標。
- 坐標軸:
- X 軸(列):模型預測的類別。
- Y 軸(行):數據集的真實類別。
- 結構:
- 每個單元格顯示實際類別與預測類別組合的樣本數。
- 對角線(左上到右下)為正確預測。
- 解讀:
- TP 和 TN 多說明模型表現好。
- FP 和 FN 多說明模型有改進空間。
在代碼中,混淆矩陣常用熱力圖可視化,便于觀察分布。annot=True
參數確保每個單元格顯示具體數值。
ROC-AUC 分數是用于評估二分類模型質量的指標。
ROC 代表受試者工作特征曲線(Receiver Operating Characteristic curve)。
AUC 代表曲線下的面積(Area Under the Curve)。
- ROC 曲線繪制不同閾值下的真正率(TPR)與假正率(FPR)。
- AUC(曲線下的面積)用單一數值總結模型在所有閾值下的表現。
真正率(TPR):TP / (TP + FN) → 也叫召回率
假正率(FPR):FP / (FP + TN)
- AUC 范圍 0 到 1:
- 1.0 = 完美分類器
- 0.5 = 隨機猜測
- <0.5 = 比隨機還差(系統性誤分)
應用場景:
- 二分類問題
- 尤其適用于:
- 類別不平衡(如欺詐檢測、疾病診斷)
- 關注預測排序而非具體標簽
重要性:
- 衡量模型區分不同類別的能力。
- 在類別不平衡時比準確率更穩健。
- 可跨閾值比較模型。
本教程到此結束,其他常用分類模型如 SVM、決策樹、隨機森林等將在后續介紹。
如有問題或反饋,歡迎聯系我。
感謝閱讀!