Hike News
Hike News

機器學習-邏輯回歸(Logistic Regression)

Introduction

  • 邏輯回歸是一種分類(classfication)演算法
  • 線性回歸(linear regression)的式子作為邏輯回歸的輸入
    • 與linear regression一樣為一迭代演算法
      • 存在cost function
      • 不斷的迭代優化並更新權重$w$
  • 只適用於二元分類的場景,邏輯回歸是解決二分類問題的利器
  • 也能得出具體的概率值

應用

  • 廣告點擊率
    • 用戶有點擊
    • 用戶無點擊
  • 是否為垃圾郵件
  • 是否患病
  • 金融詐騙
  • 虛假帳號

輸入

$$
Z(x) = w_0 + w_1x_1 + w_2x_2 + … + w_dx_d = w^Tx
$$

  • 因邏輯回歸與線性回歸的式子是一樣的,因此邏輯回歸也有過擬合的問題

sigmoid函數

$\require{AMScd}$
\begin{CD}
\text{線性回歸的輸入} @>{\text{sigmoid}}>> \text{分類(邏輯回歸的核心)}
\end{CD}

sigmoid

  • 能夠將輸入的值轉換,且最後輸出的值(y)一定會落在0-1之間(概率)
  • 函數中間與y軸交叉的地方一定為0.5

公式

$$
h_{\theta}(x) = g(\theta^Tx) = \frac{1}{1+e^{-\theta^Tx}}
$$

整理完$g(z)$如下所示:sigmoid函數

$$
g(z) = \frac{1}{1+e^{-z}}
$$

  • $z$代表回歸的結果(輸入值)
  • 輸出:為[0,1]區間的概率值,預設0.5為threshold
    • $g(z)$ 小於 0.5 則歸為 0(False)
    • $g(z)$ 大於 0.5 則歸為 1(True)

損失函數(cost function)

其與linear regression原理相同,但由於是分類問題,損失函數固然不一樣,只能通過梯度下降求解

對數似然損失函數:
$$
cost(h_{\theta}(x),y) =
\begin{cases}
-\log{h(x)}, & \text{if y=1} \\
-\log{(1-h(x))}, & \text{if y=2}
\end{cases}
$$

  • $y$為目標類別為1(True)或是0(False)
  • $h_{\theta}(x)$為概率值

完整的cost function(類似信息熵計算)

  • $cost$損失的值越小,那麼預測類別的準確度會越高

優化

邏輯回歸透過梯度下降求解
Gradient Descent

  • 有可能存在多個局部最小值(linear regression只有一個全局最小值)
    • 在梯度下降過程中,可能到達某個局部最低點,但不一定是全局函數的最低點
      • 目前沒有有效的解決方式
        • 多次的隨機初始化值來進行梯度下降,多次比較最後最小值的結果
        • 求解過程中調整學習率
        • 以上兩種方法都是盡量改善
    • 儘管沒有達到全局最低點,仍維持一定不錯的效果

sklearn邏輯回歸API

  • 使用sklearn.linear_model.LogisticRegression
  • 雖然為分類演算法,但卻在linear_model中

LogisticRegression

sklearn.linear_model.LogisticRegression(penalty='l2',C=1.0)

  • penalty:正則化方法,默認為L2正則化
    • 解決回歸造成過擬合的情況
  • C:正則化的力度,默認為1.0
  • 可調用coef_屬性查看訓練後的權重($w$)

Example

使用logistic regression檢測良/惡性乳腺癌數據
數據網址https://www.kaggle.com/uciml/breast-cancer-wisconsin-data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix,classification_report
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

cancer_data = "./Kaggle Dataset/breastcancer/data.csv"

def Logistic_Test():
# 讀取數據
data = pd.read_csv(cancer_data)
target = data["diagnosis"]
data = data.drop(["diagnosis","id","Unnamed: 32"], axis=1)

X_train,X_test,y_train,y_test = train_test_split(data,target)

# 標準化處理
Std = StandardScaler()
X_train = Std.fit_transform(X_train)
X_test = Std.transform(X_test)

Rg = LogisticRegression(C=1.0)
Rg.fit(X_train,y_train)
y_predict = Rg.predict(X_test)

# 查看confusion matrix
mat = confusion_matrix(y_test,y_predict)

print("score:",Rg.score(X_test,y_test))

# 查看recall,及f1-score
print("report:\n",classification_report(y_test,y_predict,labels=["B","M"],target_names=["良性","惡性"])) # target_names可自定義,但要對應label傳入的目標值的順序

# 顯示confusion matrix
sns.heatmap(mat,square=True,annot=True,cbar=False)
plt.xlabel("predict value")
plt.ylabel("true value")
plt.show()

if __name__ == '__main__':
Logistic_Test()
  • 邏輯回歸中會將數量比較少的樣本視為True,假設數據中的良性data較少,則良性就為True,惡性則為False

Result

1
2
3
4
5
6
7
8
score: 0.993006993006993
report:
precision recall f1-score support

良性 0.99 1.00 0.99 92
惡性 1.00 0.98 0.99 51

avg / total 0.99 0.99 0.99 143

result


優缺點

  • 優點
    • 適合需要得到一個 二元分類概率 的場景,簡單,速度快
  • 缺點
    • 不好處理多分類的問題
      • softmax方法 - 邏輯回歸在多分類問題上的推廣(神經網路) - 用於圖像識別

比較naive bayes

以下兩種演算法皆透過概率計算,得到的最後分類的結果

  • naive bayes

    • 生成模型
      • 須提前在數據集中去獲取不同樣本屬於各個類別的概率(先驗概率)
        • 先驗概率 : 需要從歷史數據中總結出概率信息
      • 非常仰賴歷史訓練集得到的概率進行計算
    • 適合解決多分類問題(常用於文本分類)
    • 沒有超參數
  • logistic regression

    • 判別模型
      • 不需先得出先驗概率
    • 適合解決二元分類問題
    • 應用在二分類需要概率的場景(癌症有無)
    • 超參數:正則化力度(C)