Hike News
Hike News

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

Introduction

  • 邏輯回歸是一種分類(classfication)演算法
    • 一種廣泛使用於分類問題中的廣義回歸演算法
    • 一種名為"回歸"的線性分類器
  • 由線性回歸變化而來的
    • 求解能夠讓模型對數據擬合程度最高的參數$w$的值
  • 線性回歸(linear regression)的式子作為邏輯回歸的輸入
    • 與linear regression一樣為一迭代演算法
      • 存在cost function
      • 不斷的迭代優化並更新權重$w$
    • 通過引入聯繫函數(link function),將線性回歸方程$Z(x)$轉換為$g(z)$
      • 令$g(z)$的值分布在 0-1 之間,而得到分類模型
        • 當$g(z)$接近0時樣本的label為0; $g(z)$接近1時樣本的label為1
      • 此聯繫函數就是Sigmoid函數
  • 只適用於二元分類的場景,邏輯回歸是解決二分類問題的利器
    • sklearn的邏輯回歸也可以做多分類的問題
  • 也能得出具體的概率值
  • 對邏輯回歸中過擬合的控制,通過正則化來實現

應用

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

優點

  1. 邏輯回歸對線性關係的擬合效果極佳
    • 若已知數據之間聯繫是非線性的,千萬不要應使用邏輯回歸進行分類
  2. 邏輯回歸計算快
    • 計算效率優於SVM和隨機森林
  3. 邏輯回歸返回的分類結果不是固定的0,1,而是以小數形式呈現的類概率數字
    • 可把回歸返回的結果當成連續型數據來利用
  4. 抗噪聲能力強
  5. 適合需要得到一個 二元分類概率 的場景,簡單,速度快

輸入

  • 因邏輯回歸與線性回歸的式子是一樣的,因此邏輯回歸也有過擬合的問題
  • $w$被統稱為模型的參數,$w_0$為截距(intercept),$w_1 ~ w_d$被稱為係數(coefficient)

Sigmoid函數

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

sigmoid

  • 能夠將輸入的值轉換,且最後輸出的值(y)一定會落在0-1之間(概率)
  • 函數中間與y軸交叉的地方一定為0.5
  • 其為一種歸一化(normalize)方法,與MinMaxScaler同理
    • Sigmoid函數只能無限趨近於0和1,所以仍與MinMaxScaler為不同的數據預處理方法

公式

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

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

二元邏輯回歸的損失函數(cost function)

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

  • 衡量參數$\theta$($w$)重要的評估指標
    • 用來求解最優參數$\theta$($w$)的工具
  • 衡量參數為$\theta$($w$)的模型 擬訓練集時產生的信息損失大小
    • 並以此衡量參數$\theta$($w$)的優劣(損失越大,$\theta$($w$)就越差;損失越小,$\theta$($w$)就越好)
  • 在求解參數$\theta$($w$)時,追求損失函數最小,讓模型在訓練數據上的擬合效果最優
    • 模型預測的準確率在訓練集上需盡量接近100%
  • 旨在追求能夠讓損失函數最小化的$\theta$($w$)的組合
  • 注意!! 沒有求解參數$\theta$($w$)需求的模型就沒有損失函數
    • 例如KNN,決策樹等模型

對數似然損失函數:

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

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

  • $\theta$ or $w$:表示求解出來的一組參數(權重)
  • $m$:樣本的個數
  • $y_i$:為樣本$i$上真實的Label
  • $cost$損失的值越小,那麼預測類別的準確度會越高

優化

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

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

正則化

  • 正則化是用來防止模型過擬合的過程

    • 常用的有 L1正則化L2正則化 兩種
    • 分別通過在 損失函數 後面加上 參數向量(權重向量)$\theta$($w$) 的 L1範式L2範式 的倍數來實現

      • L1範式:參數$\theta$($w$)向量中的每個參數的絕對值之和
      • L2範式:參數$\theta$($w$)向量中的每個參數的平方和的開方值
      • $C$是用來控制正則化程度的 超參數
      • 增加的範式被稱為正則項(懲罰項)
      • 求解的參數$\theta$($w$)取值必然改變,藉此來調節模型的擬合程度
  • L1正則化會將參數壓縮至0;L2正則化只會將參數壓縮盡量小,但不會到0
    • L1正則化的本質是一個特徵選擇的過程,掌管了參數的稀疏性
      • L1正則化越強,參數$\theta$($w$)向量中就越多參數為0
        • 參數越稀疏,選出來的特徵越少,以此防止過擬合
        • 適用於數據維度很高的情況
        • 其在特徵選擇時可以由嵌入法(Embedded)來完成
    • L2正則化,會盡量讓每個特徵對模型都有一些微小貢獻
      • 攜帶信息少,對模型貢獻度不大的特徵參數會非常接近0
      • 為防止過擬合,通常使用L2正則化就足夠
        • 若還是過擬合,再使用L1正則化

sklearn邏輯回歸API

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

LogisticRegression

1
2
3
4
5
class sklearn.linear_model.LogisticRegression(penalty=’l2’, 
dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1,
class_weight=None, random_state=None, solver=’warn’, max_iter=100,
multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None,
l1_ratio=None)

重要參數

penalty

正則化方法

  • 可輸入l1l2,預設為l2正則化
    • 若選擇l1正則化,參數solver僅能使用"liblinear""saga"
    • l2正則化參數solver中所有求解方式都可以使用
  • 解決回歸造成過擬合的情況

C

正則化力度的倒數,必須是一個大於0的浮點數

  • 預設為1.0
    • 正則項與損失函數的比值為1:1
  • C越小則損失函數會越小,模型對損失函數的懲罰越重,正則化的效力越強
    • 參數$\theta$($w$)會逐漸壓縮得越來越小
  • 不同正則化方法.C的取值,使用學習曲線最優化
  • 可調用coef_屬性查看訓練後的權重($w$)

重要屬性

coef_

查看訓練後每個特徵所對應的參數$\theta$($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)