【吳恩達機器學習】第三周—邏輯回歸、過擬合、正則化

31.jpg

1.分類問題(Regression)

在分類問題中,你要預測的變量 ?? 是離散的值,我們將學習一種叫做邏輯回歸 (Logistic Regression) 的算法,這是目前最流行使用最廣泛的一種學習算法。順便說一下,邏輯回歸算法是分類算法,我們將它作為分類算法使用。有時候可能因為
這個算法的名字中出現了“回歸”使你感到困惑,但邏輯回歸算法實際上是一種分類算法,它適用于標簽 ?? 取值離散的情況,如:1 0 0 1。

為什么不用線性回歸來解決分類問題 ?
簡單來說,因為分類問題的y取值為固定的幾個類別,譬如腫瘤分類為0 表示良性、1表示惡性,如果同樣用線性回歸y = k * x + b來表示,x為腫瘤尺寸,則得出的y范圍可能遠 > 1,但結果總會落到0和1上,會顯得很奇怪。

2.邏輯回歸(Logistic Regression)

前面說了,邏輯回歸是適用于分類問題的常見算法,這個算法的性質是:它的輸出值永遠在 0 到 1 之間。

3.假設函數表達式Hypothesis Representation

回到之前的乳腺癌分類上,我希望輸出的預測值是介于0~1之間,此時用邏輯回歸算法怎么實現呢?
其實,邏輯回歸中,可以用Sigmoid函數,來實現在R區間的輸入,得到0~1之間的輸出Sigmoid函數:
g(z) = \frac{1}{1+e^{-z}}函數圖像如下:

屏幕快照 2019-07-11 22.02.31.png
屏幕快照 2019-07-11 22.02.31.png
則,經過Sigmoid改良后的假設函數如下:

看圖可知,對于任意參數z:如果h_\theta(x) = 0.5,那么其為惡性/良性的概率為50%h_\theta(x) > 0.5,則我們判定預測值y = 1
h_\theta(x) < 0.5,則我們判定預測值y = 0。例如,如果對于給定的??,通過已經確定的參數計算得出h?? (??) = 0.7,則表示有 70%的幾率??為1(正向類),相應地??為0(負向類)的幾率為 1-0.7=0.3。
z = \theta^TX根據圖像可知:
z > 0時h_\theta (x) = g(\theta^TX) = g(z) > 0.5 預測值y 為1
z < 0時h_\theta (x) = g(\theta^TX) = g(z) < 0.5 預測值y 為0

4.判定邊界Decision Boundary

現在假設我們有一個模型:

1.png
1.png
并且參數?? 是向量[-3 1 1]。 則當?3 + ??1 + ??2 ≥ 0,即??1 + ??2 ≥ 3時,模型將預測 ?? =1。 我們可以繪制直線:
??1 + ??2 = 3,這條線便是我們模型的分界線,將預測為 1 的區域和預測為 0 的區域分隔開。
這條線即被稱為—判定邊界Decision Boundary


假設我們的數據呈現這樣的分布情況,怎樣的模型才能適合呢? 其實,判定邊界不一定是直線,還可能是曲線,如下:
2.png
2.png

因為需要用曲線才能分隔 ?? = 0 的區域和 ?? = 1 的區域,我們需要二次方特征:
h (??)=??(?? +?? ?? +?? ?? +?? ??2 +?? ??2)是[-1 0 0 1 1],則我們得到的判定邊界恰好是圓點在原點且半徑為 1 的圓形。

5.損失函數Cost Function

在之前的房間-面積模型中(單變量線性回歸問題),我們用到的是平方差損失函數,那么對此處的分類問題,我們可不可以用之前的平方差損失函數呢 ? 先給結論,不行,此處我們應該用交叉熵損失函數
為什么?J(\theta)= \frac{1}{2m}\Sigma^m_{i=1}=(h_\theta(x^{(i)} - y^{(i)}))^2而此處h_\theta x^{(i)} = \frac{1}{1+e^{-\theta^Tx^i}}帶入后得到的損失函數比較復雜,不過可以通過圖像看出J(\theta)\theta的關系:

3.png
3.png
可以看出,損失函數曲線比較【浪】,擁有多個局部最優解,曲線非凸,如果用這樣的代價函數來讓機器學習迭代,則容易陷入局部最優解中,而找不到全局最優解,即找不到使得損失函數值最小的loss,也就找不到最優化的模型。
故,不可用采用平方損失函數,作為替代,我們可以采取【交叉熵損失函數】

凸函數:
對于實數集上的凸函數,一般的判別方法是求它的二階導數,如果其二階導數在區間上非負,就稱為凸函數
簡單的例子 y = x^2 二階導為2 > 0,故其為凸函數(形狀上看上去是凹的,千萬別弄反!)

在這里,我們定義損失函數 :
J(\theta) = \frac{1}{m}\Sigma^m_{i=1}Cost(h_\theta(x^{(i)}) , y^{(i)})其中:
Cost(h_\theta(x) , y) = \begin{cases} -log(h_\theta(x)), & \text{if y = 1} \\[2ex] -log(1-h_\theta(x)), & \text{if y = 0} \end{cases}

復習一下對數函數,簡單的y = log_2x 函數經過點(1,0)、(2,1)函數圖像如下:

image.png

下面,讓我們推導一波公式:
h_\theta(x)Sigmod函數(單調遞增,導數>0),log函數隱藏了常數項底數,我們設其為a=2,簡化一下上面的Cost()函數
Cost(t , y) = \begin{cases} -log_a(t), & \text{if y = 1} \\[2ex] -log_a(1-t), & \text{if y = 0} \end{cases} 令t = h_\theta(x)

t 的取值范圍為(0,1)
y = 1時,[Cost(t,1)]' = [-log_a(t)]' = -\frac{1}{tlna} < 0 函數單調遞減,且t趨于1時,Cost() 趨于 0。示意圖左下:

7.png
7.png
y = 0時, 函數單調增,且t 趨于0, 趨于 0,示意圖右上。

最后,合并一下:
Cost(h_\theta(x) , y) = -y*log(h_\theta(x))-(1-y)*log(1-h_\theta(x))
J(\theta)= \frac{1}{m}\Sigma^m_{i=1}Cost(h_\theta(x^{(i)}) , y^{(i)}) = -\frac{1}{m}\Sigma^m_{i=1}[y^{(i)}*log(h_\theta(x^{(i)}))+(1-y^{(i)})*log(1-h_\theta(x^{(i)}))]

此損失/代價函數即為可以進行梯度下降求導的,沒有局部最優解的凸函數:


9.png
9.png

證明過程見文章末尾

Python代碼實現如下:

import numpy as np
def cost(theta, X, y):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
return np.sum(first - second) / (len(X))

在得到這樣一個代價函數以后,我們便可以用梯度下降算法來求得能使代價函數最小的參數了。算法為:
8.png
8.png

一些梯度下降算法之外的選擇:
除了梯度下降算法以外,還有一些常被用來令代價函數最小的算法,這些算法更加復雜和優越,而且通常不需要人工選擇學習率,通常比梯度下降算法要更加快速。這些算法有:

  • 共軛梯度(Conjugate Gradient)
  • 局部優化法(Broyden fletcher goldfarb shann,BFGS)
  • 有限內存局部優化法(LBFGS)

10.png
10.png
注:雖然得到的梯度下降算法表面上看上去與線性回歸的梯度下降算法一樣,但是這里的與線性回歸中不同,所以實際上是不一樣的。
另外,在運行梯度下降算法之前,進行特征縮放依舊是非常必要的。

6.簡化的損失函數和梯度下降

在上面我們得出損失函數公式如下:
J(\theta)= \frac{1}{m}\Sigma^m_{i=1}Cost(h_\theta(x^{(i)}) , y^{(i)}) = -\frac{1}{m}\Sigma^m_{i=1}[y^{(i)}*log(h_\theta(x^{(i)}))+(1-y^{(i)})*log(1-h_\theta(x^{(i)}))]那么為了使損失函數盡量小,我們對其求梯度(求導過程見第5.點末尾):?

image

現在,如果你把這個更新規則和我們之前用在線性回歸上的進行比較的話,你會驚訝地發現,這個式子正是我們用來做線性回歸梯度下降的。那么,線性回歸和邏輯回歸是同一個算法嗎?要回答這個問題,我們要觀察邏輯回歸看
看發生了哪些變化。實際上,假設的定義發生了變化。
對于線性回歸假設函數:
h_\theta(x) = \theta^TX = \theta_0x_0 + \theta_1x_1 + \theta_2x_2+...+\theta_nx_n

而邏輯回歸中假設函數:
h_\theta(x) = g(\theta^TX) = \frac{1}{1+e^{-\theta^TX}}因此,即使更新參數的規則看起來基本相同,但由于假設的定義發生了變化,所以邏輯函數的梯度下降,跟線性回歸的梯度下降實際上是兩個完全不同的東西。
最后還有一點,我們之前在談線性回歸時講到的特征縮放,我們看到了特征縮放是如何提高梯度下降的收斂速度的,這個特征縮放的方法,也適用于邏輯回歸。如果你的特征范圍差距很大的話,那么應用特征縮放的方法,同樣也可以讓邏輯回歸中,梯度下降收斂更快。
就是這樣,現在你知道如何實現邏輯回歸,這是一種非常強大,甚至可能世界上使用最廣泛的一種分類算法。

7.高級優化

現在我們換個角度來看什么是梯度下降,我們有個代價函數J(\theta),而我們想要使其最小化,那么我們需要做的是編寫代碼,當輸入參數J(\theta)時,它們會計算出兩樣東西:J(\theta)以及j等于 0、 1 直到n時的偏導數項。

11.png
11.png
假設我們已經完成了可以實現這兩件事的代碼,那么梯度下降所做的就是反復執行這些更新。對于梯度下降來說,我認為從技術上講,你實際并不需要編寫代碼來計算代價函數。你只需要編寫代碼來計算導數項,但是,如果你希望代碼還要能夠監控的收斂性,那么我們就需要自己編寫代碼來計算代價函數和偏導項


梯度下降并不是我們可以使用的唯一算法,還有其他一些算法,更高級、更復雜。如果我們能用這些方法來計算代價函數J(\theta)和偏導數項\frac{?}{?\theta_i}J(\theta)的話,那么這些算法就是為我們優化代價函數的不同方法, 共軛梯度法 BFGS (變尺度法) 和 L-BFGS (限制變尺度法) 就是其中一些更高級的優化算法。它們需要有一種方法來計算J(\theta)以及需要一種方法計算導數項,然后使用比梯度下降更復雜的算法來最小化代價函數。
這三種算法有許多優點:
一個是使用這其中任何一個算法,你
通常不需要手動選擇學習率
\alpha,所以對于這些算法的一種思路是,給出計算導數項和代價函數的方法,你可以認為算法有一個智能的內部循環,而且,事實上,他們確實有一個智能的內部循環,稱為線性搜索(line search)算法,它可以自動嘗試不同的學習率\alpha ,并自動選擇一個好的學習速率,因此它甚至可以為每次迭代選擇不同的學習速率,那么你就不需要自己選擇。這些算法實際上在做更復雜的事情,而不僅僅是選擇一個好的學習率,所以它們往往最終收斂得遠遠快于梯度下降,不過關于它們到底做什么的詳細討論,已經超過了本門課程的范圍。

8.多元/多類別分類Multiclass Classification

這里插播一句,吳恩達老師的課實在是太好了,生動形象....點贊??

現實世界中,沒有那么多的非黑即白的二元分類問題,更多的是多分類,譬如給你柑橘類水果?
可能是橘子、柚子、蘆柑、橙子...這么多分類。那么問題來了,如果你用AI模型來判斷,模型會告訴你它是橙子,概率在50%,那么它究竟是怎么運作的?
模型會生成一系列置信度,譬如:水果是橘子、柚子、蘆柑、橙子的概率分別是20%、35%、38%、50%,最終挑選一個概率最高的類別label,將這個水果歸類到label中。
比較一下二元分類問題和多元分類問題,他們的數據集看上去可能是這樣:

12.png
12.png
我們之前學習過了二元分類問題的模型和算法,用邏輯回歸 + 梯度下降可以完美地解決,那么對于三元、多元分類問題呢 ?其實原理是類似的
用白話過一遍流程:
遍歷每個類、譬如第一輪我只關注綠色三角,那么我可以建立模型將綠三角標記為正向類 y = 1、將紅叉叉和藍框框都標記為負向類;經過這一輪的模型,我就可以判斷出一個數據是綠三角的概率了;然后再對紅叉叉建立模型將紅叉叉標記為正相類 y = 2,綠三角和藍框框都標為負向類,最后建立模型來對藍框框做同樣的操作。
總之就是有N個類別就建立N個模型,對于一個樣本,我們需要用這N個模型依次檢驗其在該模型下屬于正向類的概率。

9.過擬合over-fitting

過擬合

過度擬合的意思,意味著模型訓練過程中,對訓練集的模擬和學習過度貼合;
過擬合帶來的影響:模型訓練時的檢測率很高效果很好,但是用于實際檢驗時,效果很差,模型不能很準確地預測,即泛化能力差。

欠擬合

和過擬合相對,欠擬合是指模型和數據集間的擬合程度不夠,學習不足。
欠擬合的影響:和過擬合相對,欠擬合是指模型和數據集間的擬合程度不夠,可能是學習輪數不夠、數據集特征不規則、模型選擇有問題等。欠擬合時,模型的泛化能力同樣會很差。

泛化能力(generalization ability)

是指一個機器學習算法對于沒有見過的樣本的識別能力。泛化能力自然是越高越好。

分類問題和回歸問題中都可能存在過擬合的問題,見下圖:
image.png

解決或改善?

1.丟棄一些不能幫助我們正確預測的特征。可以是手工選擇保留哪些特征,或者使用一些模型選擇的算法來幫忙(例如 PCA)
2.正則化。 保留所有的特征,但是減少參數的大小(magnitude)。

10.正則化

假設回歸問題中,過擬合的模型如下:
h_\theta(x) = \theta^TX = \theta_0 + \theta_1x_1 + \theta_2x_2^2 + \theta_3x_3^3 + \theta_4x_4^4從第9.點中圖像上,我們可以看出,正是那些高次項導致了過擬合的產生,所以降低高次項的系數\theta我們就能降低過擬合程度。但是,我們不能直接修改模型中的參數大小,而通過修改代價函數中參數大小來實現“曲線救國”
正常回歸問題的損失函數如下:J(\theta)= \frac{1}{2m}\Sigma^m_{i=1}=(h_\theta(x^{(i)} - y^{(i)}))^2對損失函數做梯度下降算法,如下:
[圖片上傳失敗...(image-d793a0-1583758276758)]可見,每次迭代中,為了使迭代后的參數\theta變更小,我們需要使-\alpha\frac{?}{?\theta_i}J(\theta)盡可能大,而學習率固定,所以我們只能想辦法讓倒數項盡可能大。所以我們可以對損失/代價函J(\theta)做一波修改:

14.png
14.png
可見,我們給參數和加上了系數,這可以稱為【懲罰】,對修改后的代價函數,做梯度下降算法對的更新如下:
對的更新如下:

可見,對于參數和,因為有系數的存在,每次求導都會讓其降低的更多更快,而且,不會影響其他參數項的下降,從而達到比較理想的效果。

1.一般表示

如果我們有\theta_1,\theta_2...,\theta_n 總計n個參數(通常\theta_0不用懲罰),通常會對所有的參數進行懲罰,并設置系數\lambda,這樣的結果是得到了一個較為簡單的能防止過擬合問題的假設函數:

15.png
15.png
其中被稱為正則化參數****Regularization Parameter
經過正則化處理后的模型與原模型對比圖如下:
16.png
16.png
藍色是處理前,過擬合的模型數據表現,粉紅色的是經過正則化處理后的表現。
如果正則化系數過小,將會導致效果不好,模型的擬合度依舊很高;
如果正則化系數過大,則會將除了以外的所有系數都懲罰殆盡,導致假設函數近似: 即變成圖中的紅線。

2.正則化線性回歸

此處比較簡單,我就直接貼圖了:
image.png

3.正則化邏輯回歸

此處比較簡單,我就直接貼圖了:

19.png
19.png
20.png
20.png

需要說明的是:雖然加了正則化后、邏輯回歸和線性回歸的梯度下降公式看上去一樣,但實際意義由于假設函數的不同,而完全不同。
Python代碼:

import numpy as np
def costReg(theta, X, y, learningRate):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:the
ta.shape[1]],2))
return np.sum(first - second) / (len(X)) + reg
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容