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的邏輯回歸也可以做多分類的問題
      • 一對多(One-vs-rest;OvR)
        • 把某種分類看作1,剩下的分類類型都為0
        • 在sklearn中為"ovr"
      • 多對多(Many-vs-Many;MvM)
        • 把好幾個分類劃為1,剩下的分類類型劃為0
        • 在sklearn中為"Multinominal"
      • 配合L1, L2正則項使用
  • 也能得出具體的概率值
  • 對邏輯回歸中過擬合的控制,通過正則化來實現

應用

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

優點

  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的取值,使用學習曲線最優化
    • C為一 超參數
  • 可調用coef_屬性查看訓練後的權重($w$)

max_iter

梯度下降所使用的限制步數(最大迭代次數)

  • 預設為100
  • 用來代替步長
  • 其值越大,代表步長越小,模型迭代時間越長
  • 其值越小,代表步長越大,模型迭代時間越短
  • 使用屬性 estimator.n_iter_查看真正實現的迭代次數

solver

"liblinear":座標下降法

multi_class

告知模型,預測標籤 屬於何種分類問題的類型,常用於多元回歸

  • 預設為"ovr":二分類問題,或使用一對多形式來處理多分類問題
    • 當標籤為多分類時才會使用一對多的形式
  • "multinomial":表示處理多分類問題,使用 多對多(MvM) 形式來處理多分類問題
    • 但在參數solver"liblinear"時不可用
      • "liblinear:是用來處理二分類的
  • "auto":表示根據數據的分類情況和其他參數來確定模型要處理的分類問題的類型

class_weight

  • 處理樣本不平衡問題

    • 標籤的某個類別佔有很大的比例
      • 新客戶違約
    • 誤分類代價很高
      • 分類失敗會付出慘痛代價,例如:潛在犯罪者誤識別成普通人;有癌症徵兆情況被判斷為沒有癌症
      • 誤分類:捕捉某種特定分類,但是非常困難的情況
      • 寧願錯殺一百也不放過一個
  • 給少量的標籤更多的權重

    • 讓模型更偏向少數類
    • 向捕獲少數類的方向建模
  • 預設為None
    • 自動給予數據集中所有的標籤相同的權重
  • "balanced":解決樣本不均衡問題,對少數類進行加權

重要屬性

coef_

查看訓練後每個特徵所對應的參數$\theta$($w$)

n_iter_

返回求解中真正實現的迭代次


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)