關於邏輯迴歸,面試官們都怎麼問

本文發於微信訂閱號:NewBeeNLP,歡迎關注獲取更多幹貨資源。

「面試官們都怎麼問」系列文章主旨是儘可能完整全面地整理ML/DL/NLP相關知識點,不管是剛入門的新手、準備面試的同學或是溫故知新的前輩,我們希望都能通過這一系列的文章收穫到或多或少的幫助

一. 一句話概括邏輯迴歸

邏輯迴歸假設數據服從伯努利分佈,通過極大化似然函數的方法,運用梯度下降來求解參數,來達到將數據二分類的目的。

這句話包含了五點,接下來一一介紹:

  • 邏輯迴歸的假設
  • 邏輯迴歸的損失函數
  • 邏輯迴歸的求解方法
  • 邏輯迴歸的目的
  • 邏輯迴歸如何分類

二. 邏輯迴歸的假設

任何的模型都是有自己的假設,在這個假設下模型纔是適用的。

Hypothesis #1

邏輯迴歸的第一個基本假設是假設數據服從伯努利分佈。

伯努利分佈:是一個離散型概率分佈,若成功,則隨機變量取值1;若失敗,隨機變量取值爲0。成功概率記爲p,失敗爲q = 1-p。

fX(x)=px(1p)1x={p if x=1q if x=0f_{X}(x)=p^{x}(1-p)^{1-x}=\left\{\begin{array}{ll} p & \text { if } x=1 \\ q & \text { if } x=0 \end{array}\right.
在邏輯迴歸中,既然假設了數據分佈服從伯努利分佈,那就存在一個成功和失敗,對應二分類問題就是正類和負類,那麼就應該有一個樣本爲正類的概率pp,和樣本爲負類的概率q=1pq = 1- p。具體我們寫成這樣的形式:
p=hθ(x;θ)p=h_{\theta}(x ; \theta)
q=1hθ(x;θ)q=1-h_{\theta}(x ; \theta)

Hypothesis #2

邏輯迴歸的第二個假設是正類的概率由sigmoid的函數計算,即:
p=11+eθTxp=\frac{1}{1+e^{-\theta^{T} x}}
預測樣本爲正類的概率:
p(y=1x;θ)=hθ(x;θ)=11+eθTxp(y=1 | x ; \theta)=h_{\theta}(x ; \theta)=\frac{1}{1+e^{-\theta^{T} x}}
預測樣本爲負類的概率:
p(y=0x;θ)=1hθ(x;θ)=11+eθTxp(y=0 | x ; \theta)=1-h_{\theta}(x ; \theta)=\frac{1}{1+e^{\theta^{T} x}}
寫在一起,即預測樣本的類別:
y^=p=p(y=1x;θ)y(1p(y=1x;θ))1y\hat{y}=p=p(y=1 | x ; \theta)^{y}(1-p(y=1 | x ; \theta))^{1-y}

個人理解,解釋一下這個公式,並不是用了樣本的標籤yy,而是說你想要得到哪個的概率,y=1y = 1時意思就是你想得到正類的概率,y=0y = 0時就意思是你想要得到負類的概率。另外在求參數時,這個yy是有用的,這點在下面會說到。

另外關於這個值, y^\hat{y}是個概率,還沒有到它真正能成爲預測標籤的地步,更具體的過程應該是分別求出正類的概率即y=1y = 1時,和負類的概率y=0y = 0時,比較哪個大,因爲兩個加起來是1,所以我們通常默認的是隻用求正類概率,只要大於0.5即可歸爲正類,但這個0.5是人爲規定的,如果願意的話,可以規定爲大於0.6纔是正類,這樣的話就算求出來正類概率是0.55,那也不能預測爲正類,應該預測爲負類。

三. 邏輯迴歸的損失函數

都說邏輯迴歸的損失函數是它的極大似然函數,但是爲啥呢?

先一句話概括一下極大似然估計,順便就複習了,以防面試官問起來:

極大似然估計:利用已知的樣本結果信息,反推最具有可能(最大概率)導致這些樣本結果出現的模型參數值(模型已定,參數未知)

再聯繫到邏輯迴歸裏,一步步來分解上面這句話,首先確定一下模型是否已定,模型就是用來預測的那個公式:
y^=(11+eθTx)y(11+eθTx)1y\hat{y}=\left(\frac{1}{1+e^{-\theta^{T} x}}\right)^{y}\left(\frac{1}{1+e^{\theta^{T} x}}\right)^{1-y}
參數就是裏面的θ\theta ,那什麼是樣本結果信息,就是我們的xxyy,是我們的樣本,分別爲特徵和標籤,我們的已知信息就是在特徵取這些值的情況下,它應該屬於y類(正或負)。

反推最具有可能(最大概率)導致這些樣本結果出現的參數,舉個例子,我們已經知道了一個樣本點,是正類,那麼我們把它丟入這個模型後,它預測的結果一定得是正類啊,正類纔是正確的,纔是我們所期望的,我們要儘可能的讓它最大,這樣才符合我們的真實標籤。反過來一樣的,如果你丟的是負類,那這個式子計算的就是負類的概率,同樣我們要讓它最大,所以此時不用區分正負類。

這樣串下來,一切都說通了,概括一下:

一個樣本,不分正負類,丟入模型,多的不說,就是一個字,讓它大

一直只提了一個樣本,但對於整個訓練集,我們當然是期望所有樣本的概率都達到最大,也就是我們的目標函數,本身是個聯合概率,但是假設每個樣本獨立,那所有樣本的概率就可以寫成:
lossfunction=i=1N(11+eθTxi)yi(11+eθTxi)1yiloss function=\prod_{i=1}^{N}\left(\frac{1}{1+e^{-\theta^{T} x_{i}}}\right)^{y_{i}}\left(\frac{1}{1+e^{\theta^{T} x_{i}}}\right)^{1-y_{i}}

個人理解,此時,只能叫它目標函數,因爲它是我們的目標,那損失函數是啥呢?一般別的算法裏,損失函數都是真實值和預測值的誤差確定的,所以很好理解。

查了半天資料,好像沒有個官方的概念是介紹log損失函數的,那我只能個人理解繼續上了,邏輯迴歸沒有損失函數,這個log損失函數是強行叫它的。那爲啥叫它log損失函數呢?

我們的目標是最大化上面那個目標函數,那我們就要向目標方向前進,要最大,那就求導啊,要求導,那就化簡啊,不然太複雜了,那怎麼化簡呢?

  • 第一步,取對數,去掉連乘,變爲連加,直接給出化簡後的結果:
    log(loss_function)=i=1N(yilog(11+eθTxi)+(1yi)log(11+eθTxi))\log (loss\_function)=\sum_{i=1}^{N}\left(y_{i} \log \left(\frac{1}{1+e^{-\theta^{T} x_{i}}}\right)+\left(1-y_{i}\right) \log \left(\frac{1}{1+e^{\theta^{T} x_{i}}}\right)\right)
  • 第二步,爲了迎合一般要最小化損失函數,所以加個負號:
    log(loss_function)=i=1N(yilog(11+eθTxi)+(1yi)log(11+eθTxi))-\log (loss\_function)=-\sum_{i=1}^{N}\left(y_{i} \log \left(\frac{1}{1+e^{-\theta^{T} x_{i}}}\right)+\left(1-y_{i}\right) \log \left(\frac{1}{1+e^{\theta^{T} x_{i}}}\right)\right)
  • 化簡之後(步驟就不詳細放了),就可以稱爲損失函數了:
    loss=i=1N((yiθTxi)log(1+eθTxi))\text {loss}=\sum_{i=1}^{N}\left(\left(y_{i} \theta^{T} x_{i}\right)-\log \left(1+e^{\theta^{T} x_{i}}\right)\right)

四. 邏輯迴歸的求解方法:

一般都是用梯度下降法來求解,梯度下降又有隨機梯度下降,批梯度下降,small batch 梯度下降三種方式:

  • 簡單來說 批梯度下降會獲得全局最優解,缺點是在更新每個參數的時候需要遍歷所有的數據,計算量會很大,並且會有很多的冗餘計算,導致的結果是當數據量大的時候,每個參數的更新都會很慢。
  • 隨機梯度下降是以高方差頻繁更新,優點是使得sgd會跳到新的和潛在更好的局部最優解,缺點是使得收斂到局部最優解的過程更加的複雜。
  • 小批量梯度下降結合了sgd和batch gd的優點,每次更新的時候使用n個樣本。減少了參數更新的次數,可以達到更加穩定收斂結果,一般在深度學習當中我們採用這種方法。

加分項,看你了不瞭解諸如Adam,動量法等優化方法(在這就不展開了,以後有時間的話專門寫一篇關於優化方法的)。因爲上述方法其實還有兩個致命的問題:

  • 第一個是如何對模型選擇合適的學習率。自始至終保持同樣的學習率其實不太合適。因爲一開始參數剛剛開始學習的時候,此時的參數和最優解隔的比較遠,需要保持一個較大的學習率儘快逼近最優解。但是學習到後面的時候,參數和最優解已經隔的比較近了,你還保持最初的學習率,容易越過最優點,在最優點附近來回振盪,通俗一點說,就很容易學過頭了,跑偏了。
  • 第二個是如何對參數選擇合適的學習率。在實踐中,對每個參數都保持的同樣的學習率也是很不合理的。有些參數更新頻繁,那麼學習率可以適當小一點。有些參數更新緩慢,那麼學習率就應該大一點。

五. 邏輯迴歸的目的

將數據二分類

六. 邏輯迴歸的如何分類

這個在上面的時候提到了,要設定一個閾值,判斷正類概率是否大於該閾值,一般閾值是0.5,所以只用判斷正類概率是否大於0.5即可。

七. 邏輯迴歸爲什麼用極大似然函數作爲損失函數

一般和平方損失函數(最小二乘法)拿來比較,因爲線性迴歸用的就是平方損失函數,原因就是平方損失函數加上sigmoid的函數將會是一個非凸的函數,不易求解,會得到局部解,用對數似然函數得到高階連續可導凸函數,可以得到最優解。

其次,是因爲對數損失函數更新起來很快,因爲只和x,y有關,和sigmoid本身的梯度無關。

八. 邏輯迴歸在訓練的過程當中,如果有很多的特徵高度相關或者說有一個特徵重複了100遍,會造成怎樣的影響

先說結論,如果在損失函數最終收斂的情況下,其實就算有很多特徵高度相關也不會影響分類器的效果。

但是對特徵本身來說的話,假設只有一個特徵,在不考慮採樣的情況下,你現在將它重複100遍。訓練以後完以後,數據還是這麼多,但是這個特徵本身重複了100遍,實質上將原來的特徵分成了100份,每一個特徵都是原來特徵權重值的百分之一。

如果在隨機採樣的情況下,其實訓練收斂完以後,還是可以認爲這100個特徵和原來那一個特徵扮演的效果一樣,只是可能中間很多特徵的值正負相消了。

九. 爲什麼我們還是會在訓練的過程當中將高度相關的特徵去掉

去掉高度相關的特徵會讓模型的可解釋性更好

可以大大提高訓練的速度。如果模型當中有很多特徵高度相關的話,就算損失函數本身收斂了,但實際上參數是沒有收斂的,這樣會拉低訓練的速度。其次是特徵多了,本身就會增大訓練的時間。

十. 邏輯迴歸的優缺點總結:

優點:

  • 形式簡單,模型的可解釋性非常好。從特徵的權重可以看到不同的特徵對最後結果的影響,某個特徵的權重值比較高,那麼這個特徵最後對結果的影響會比較大。
  • 模型效果不錯。在工程上是可以接受的(作爲baseline),如果特徵工程做的好,效果不會太差,並且特徵工程可以大家並行開發,大大加快開發的速度。
  • 訓練速度較快。分類的時候,計算量僅僅只和特徵的數目相關。並且邏輯迴歸的分佈式優化sgd發展比較成熟,訓練的速度可以通過堆機器進一步提高,這樣我們可以在短時間內迭代好幾個版本的模型。
  • 資源佔用小,尤其是內存。因爲只需要存儲各個維度的特徵值。
  • 方便輸出結果調整。邏輯迴歸可以很方便的得到最後的分類結果,因爲輸出的是每個樣本的概率分數,我們可以很容易的對這些概率分數進行cut off,也就是劃分閾值(大於某個閾值的是一類,小於某個閾值的是一類)。

缺點:

  • 準確率並不是很高。因爲形式非常的簡單(非常類似線性模型),很難去擬合數據的真實分佈。
  • 很難處理數據不平衡的問題。舉個例子:如果我們對於一個正負樣本非常不平衡的問題比如正負樣本比 10000:1.我們把所有樣本都預測爲正也能使損失函數的值比較小。但是作爲一個分類器,它對正負樣本的區分能力不會很好。
  • 處理非線性數據較麻煩。邏輯迴歸在不引入其他方法的情況下,只能處理線性可分的數據,或者進一步說,處理二分類的問題 。
  • 邏輯迴歸本身無法篩選特徵。有時候,我們會用gbdt來篩選特徵,然後再上邏輯迴歸。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章