02-機器學習-邏輯回歸-LogisitcRegression

三哥平凡創作生活 發佈 2024-04-27T14:08:18.369406+00:00

視頻詳解:02-機器學習-邏輯回歸-LogisticsRegression一、Logistic回歸定義logistic回歸又稱logistic回歸分析,是一種廣義的線性回歸分析模型,邏輯回歸的原理是用邏輯函數把線性回歸的結果(-∞,∞)映射到(0,1)邏輯回歸是分類算法,大家都熟

視頻詳解:02-機器學習-邏輯回歸-LogisticsRegression

一、logistic回歸定義

  • logistic回歸又稱logistic回歸分析,是一種廣義的線性回歸分析模型,邏輯回歸的原理是用邏輯函數把線性回歸的結果(-∞,∞)映射到(0,1)
  • 邏輯回歸是分類算法,大家都熟悉線性回歸,一般形式是Y=aX+b,y的取值範圍是[-∞, +∞]
  • 如何實現分類:把Y的結果帶入一個非線性變換的Sigmoid函數中,即可得到S取值範圍(0,1),可以看成是一個概率分布

應用場景

  • 預測一個用戶是否點擊特定的商品
  • 判斷用戶的性別
  • 預測用戶是否會購買給定的品類
  • 判斷一條評論是正面的還是負面的

邏輯函數

表達式:

函數圖:

函數中z無論取什麼值,其結果都在[0,-1]的區間內,我們假設分類的閾值是0.5,那麼超過0.5的歸為A分類,低於0.5的歸為B分類,閾值是可以自己設定的。

二、邏輯函數的導函數

邏輯函數的表達式為:

導函數為:

可做如下轉換:

邏輯函數是一個連續且任意階可導的函數

三、如何求解邏輯回歸中的參數?

1、極大似然函數

舉個例子;如果我們已經積累了大量的違約客戶和正常客戶的樣本數據,利用極大似然函數由果溯因,估計出使得目前結果的可能性最大參數(係數)θ,有了參數我們就可以求任何一個客戶違約的概率了。

我們假設信貸違約的後驗概率:

相應的可以得到客戶不違約的概率:

如果令

違約的後驗概率可以寫成:

不違約的後驗概率可以寫成:

對於某一個客戶,我們採集到了樣本數據(x,y)。對於這個樣本,他的標籤是y的概率可以定義成:

其中y∈{0,1}。當y=0時,上式為不違約的後驗概率,當y=1時,上式為違約的後驗概率。

現在我們有m個客戶的觀測樣本:

將每一個樣本發生的概率相乘,就是這個合成在一起得到的合事件發生的總概率(利用概率中的乘法公式),即為似然函數,可以寫成:

其中θ為待求參數。

:我們總是希望出現目前結果的可能性最大,所以想要得到極大化似然函數對應的參數θ。

為便於求解,我們引入不改變函數單調性的對數函數ln,把連乘變成加法,得到對數似然函數:

至此,可以用梯度上升法求解對數似然函數,求出使得目前結果的可能性最大的參數θ。

2、最小化損失函數

方式二我們基於對數似然函數構造損失函數,用梯度下降法求出使得損失最小對應的參數θ

損失函數需求滿足兩個條件:

1、損失函數 可以衡量 模型的好壞

2、參數可導,便於求解最優解,也就是損失函數的最小值

結合上式中的極大似然函數,如果取整個數據集上的平均對數似然損失,我們可以得到:

其中J(θ)為損失函數由對數似然函數前面添加負號取平均得到

即在邏輯回歸模型中,最大化似然函數和最小化損失函數實際上是等價的(求最大化對數似然函數對應的參數θ和求最小化平均對數似然損失對應的參數θ是一致的),即:

四. 邏輯回歸常用的求解方法

梯度求解基本步驟如下:

  • 選擇下降方向(梯度方向,∇J(θ))
  • 選擇步長,更新參數 θi=θi−1−αi∇J(θi−1)
  • 重複以上兩步直到滿足終止條件

4.1 一階方法

梯度下降、隨機梯度下降、mini 隨機梯度下降降法。隨機梯度下降不但速度上比原始梯度下降要快,局部最優化問題時可以一定程度上抑制局部最優解的發生

4.2 二階方法:牛頓法、擬牛頓法:

牛頓法其實就是通過切線與x軸的交點不斷更新切線的位置,直到達到曲線與x軸的交點得到方程解。在實際應用中我們因為常常要求解凸優化問題,也就是要求解函數一階導數為0的位置,而牛頓法恰好可以給這種問題提供解決方法

牛頓法首先選擇一個點作為起始點,並進行一次二階泰勒展開得到導數為0的點進行一個更新,直到達到要求,這時牛頓法也就成了二階求解問題,比一階方法更快

擬牛頓法: 不用二階偏導而是構造出Hessian矩陣的近似正定對稱矩陣的方法稱為擬牛頓法。擬牛頓法的思路就是用一個特別的表達形式來模擬Hessian矩陣或者是他的逆使得表達式滿足擬牛頓條件。主要有DFP法(逼近Hession的逆)、BFGS(直接逼近Hession矩陣)、 L-BFGS(可以減少BFGS所需的存儲空間)。

五.可以進行多分類嗎?

方式一:

  • 1.將類型class1看作正樣本,其他類型全部看作負樣本,然後我們就可以得到樣本標記類型為該類型的概率p1。
  • 2.然後再將另外類型class2看作正樣本,其他類型全部看作負樣本,同理得到p2。
  • 3.以此循環

方式二:

  • 1.多元邏輯回歸 Softmax更合適一些。Softmax 回歸是直接對邏輯回歸在多分類的推廣,模型通過 softmax 函數來對概率建模

六.邏輯回歸有什麼優點

  • LR能以概率的形式輸出結果,而非只是0,1判定。
  • LR的可解釋性強,可控度高
  • 訓練快,feature engineering容易出效果
  • 因為結果是概率,可以做ranking model

七. 邏輯回歸有哪些應用

  • CTR預估/推薦系統的learning to rank/各種分類場景。
  • 某搜尋引擎廠的廣告CTR預估基線版是LR。
  • 某電商搜索排序/廣告CTR預估基線版是LR。
  • 某電商的購物搭配推薦用了大量LR。
  • 某新聞app排序基線是LR

八. 邏輯回歸為什麼要對特徵進行離散化

  • 非線性!邏輯回歸屬於廣義線性模型,表達能力受限;單變量離散化為N個後,每個變量有單獨的權重,相當於為模型引入了非線性,能夠提升模型表達能力,加大擬合; 離散特徵的增加和減少都很容易,易於模型的快速疊代;
  • 速度快!稀疏向量內積乘法運算速度快,計算結果方便存儲,容易擴展;
  • 魯棒性!離散化後的特徵對異常數據有很強的魯棒性:比如一個特徵是年齡>30是1,否則0。如果特徵沒有離散化,一個異常數據「年齡300歲」會給模型造成很大的干擾;
  • 方便交叉與特徵組合:離散化後可以進行特徵交叉,由M+N個變量變為M*N個變量,進一步引入非線性,提升表達能力;
  • 穩定性:特徵離散化後,模型會更穩定,比如如果對用戶年齡離散化,20-30作為一個區間,不會因為一個用戶年齡長了一歲就變成一個完全不同的人。當然處於區間相鄰處的樣本會剛好相反,所以怎麼劃分區間是門學問;
  • 簡化模型:特徵離散化以後,起到了簡化了模型,降低了模型過擬合的風險。

代碼演示-LogisticRegression

  • 數據集 iris
  • sklearn
## logistcs regresion
# encoding: utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression 
from sklearn.metrics import accuracy_score
    
# 1.加載數據
iris = datasets.load_iris()
X = iris.data[:, :3]  #取特質
Y = iris.target

# 2.拆分測試集、訓練集。
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=100)

# 3.標準化特徵值 min-max / starnder deviion (平均值 + 方差=1)
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
 
# 4. 訓練邏輯回歸模型
logreg = linear_model.LogisticRegression(C=1e5,max_iter=100, solver='liblinear',multi_class='ovr')
logreg.fit(X_train, Y_train)

# 5. 預測
##多元邏輯回歸 Softmax 回歸更合適一些。Softmax 回歸是直接對邏輯回歸在多分類的推廣,相應的模型也可以叫做多元邏輯回歸(Multinomial Logistic Regression)。
#模型通過 softmax 函數來對概率建模
y_pred= logreg.predict_proba(X_test_std)
acc = logreg.score(X_test_std,Y_test)

print('Train/Test split results:')
print("準確率為 %2.3f" % acc)
關鍵字: