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函數:
函數圖像如下:

看圖可知,對于任意參數z:如果 = 0.5,那么其為惡性/良性的概率為50%
> 0.5,則我們判定預測值y = 1
< 0.5,則我們判定預測值y = 0。例如,如果對于給定的??,通過已經確定的參數計算得出h?? (??) = 0.7,則表示有 70%的幾率??為1(正向類),相應地??為0(負向類)的幾率為 1-0.7=0.3。
而 根據圖像可知:
z > 0時 > 0.5 預測值y 為1
z < 0時 < 0.5 預測值y 為0
4.判定邊界Decision Boundary
現在假設我們有一個模型:

??1 + ??2 = 3,這條線便是我們模型的分界線,將預測為 1 的區域和預測為 0 的區域分隔開。
這條線即被稱為—判定邊界Decision Boundary
假設我們的數據呈現這樣的分布情況,怎樣的模型才能適合呢? 其實,判定邊界不一定是直線,還可能是曲線,如下:

因為需要用曲線才能分隔 ?? = 0 的區域和 ?? = 1 的區域,我們需要二次方特征:
h (??)=??(?? +?? ?? +?? ?? +?? ??2 +?? ??2)是[-1 0 0 1 1],則我們得到的判定邊界恰好是圓點在原點且半徑為 1 的圓形。
5.損失函數Cost Function
在之前的房間-面積模型中(單變量線性回歸問題),我們用到的是平方差損失函數,那么對此處的分類問題,我們可不可以用之前的平方差損失函數呢 ? 先給結論,不行,此處我們應該用交叉熵損失函數
為什么?而此處
帶入后得到的損失函數比較復雜,不過可以通過圖像看出
和
的關系:

故,不可用采用平方損失函數,作為替代,我們可以采取【交叉熵損失函數】
凸函數:
對于實數集上的凸函數,一般的判別方法是求它的二階導數,如果其二階導數在區間上非負,就稱為凸函數
簡單的例子 y = x^2 二階導為2 > 0,故其為凸函數(形狀上看上去是凹的,千萬別弄反!)
在這里,我們定義損失函數 :
其中:
復習一下對數函數,簡單的 函數經過點(1,0)、(2,1)函數圖像如下:
下面,讓我們推導一波公式:
是
函數(單調遞增,導數>0),
函數隱藏了常數項底數,我們設其為a=2,簡化一下上面的
函數
t 的取值范圍為(0,1)
當y = 1時, 函數單調遞減,且t趨于1時,
趨于 0。示意圖左下:

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

證明過程見文章末尾
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))
在得到這樣一個代價函數以后,我們便可以用梯度下降算法來求得能使代價函數最小的參數了。算法為:
一些梯度下降算法之外的選擇:
除了梯度下降算法以外,還有一些常被用來令代價函數最小的算法,這些算法更加復雜和優越,而且通常不需要人工選擇學習率,通常比梯度下降算法要更加快速。這些算法有:
- 共軛梯度(Conjugate Gradient)
- 局部優化法(Broyden fletcher goldfarb shann,BFGS)
- 有限內存局部優化法(LBFGS)

另外,在運行梯度下降算法之前,進行特征縮放依舊是非常必要的。
6.簡化的損失函數和梯度下降
在上面我們得出損失函數公式如下:
那么為了使損失函數盡量小,我們對其求梯度(求導過程見第5.點末尾):?
現在,如果你把這個更新規則和我們之前用在線性回歸上的進行比較的話,你會驚訝地發現,這個式子正是我們用來做線性回歸梯度下降的。那么,線性回歸和邏輯回歸是同一個算法嗎?要回答這個問題,我們要觀察邏輯回歸看
看發生了哪些變化。實際上,假設的定義發生了變化。
對于線性回歸假設函數:
而邏輯回歸中假設函數:
因此,即使更新參數的規則看起來基本相同,但由于假設的定義發生了變化,所以邏輯函數的梯度下降,跟線性回歸的梯度下降實際上是兩個完全不同的東西。
最后還有一點,我們之前在談線性回歸時講到的特征縮放,我們看到了特征縮放是如何提高梯度下降的收斂速度的,這個特征縮放的方法,也適用于邏輯回歸。如果你的特征范圍差距很大的話,那么應用特征縮放的方法,同樣也可以讓邏輯回歸中,梯度下降收斂更快。
就是這樣,現在你知道如何實現邏輯回歸,這是一種非常強大,甚至可能世界上使用最廣泛的一種分類算法。
7.高級優化
現在我們換個角度來看什么是梯度下降,我們有個代價函數,而我們想要使其最小化,那么我們需要做的是編寫代碼,當輸入參數
時,它們會計算出兩樣東西:
以及j等于 0、 1 直到n時的偏導數項。

而梯度下降并不是我們可以使用的唯一算法,還有其他一些算法,更高級、更復雜。如果我們能用這些方法來計算代價函數和偏導數項
的話,那么這些算法就是為我們優化代價函數的不同方法, 共軛梯度法 BFGS (變尺度法) 和 L-BFGS (限制變尺度法) 就是其中一些更高級的優化算法。它們需要有一種方法來計算
以及需要一種方法計算導數項,然后使用比梯度下降更復雜的算法來最小化代價函數。
這三種算法有許多優點:
一個是使用這其中任何一個算法,你通常不需要手動選擇學習率,所以對于這些算法的一種思路是,給出計算導數項和代價函數的方法,你可以認為算法有一個智能的內部循環,而且,事實上,他們確實有一個智能的內部循環,稱為線性搜索(line search)算法,它可以自動嘗試不同的學習率
,并自動選擇一個好的學習速率,因此它甚至可以為每次迭代選擇不同的學習速率,那么你就不需要自己選擇。這些算法實際上在做更復雜的事情,而不僅僅是選擇一個好的學習率,所以它們往往最終收斂得遠遠快于梯度下降,不過關于它們到底做什么的詳細討論,已經超過了本門課程的范圍。
8.多元/多類別分類Multiclass Classification
這里插播一句,吳恩達老師的課實在是太好了,生動形象....點贊??
現實世界中,沒有那么多的非黑即白的二元分類問題,更多的是多分類,譬如給你柑橘類水果?
可能是橘子、柚子、蘆柑、橙子...這么多分類。那么問題來了,如果你用AI模型來判斷,模型會告訴你它是橙子,概率在50%,那么它究竟是怎么運作的?
模型會生成一系列置信度,譬如:水果是橘子、柚子、蘆柑、橙子的概率分別是20%、35%、38%、50%,最終挑選一個概率最高的類別label,將這個水果歸類到label中。
比較一下二元分類問題和多元分類問題,他們的數據集看上去可能是這樣:

用白話過一遍流程:
遍歷每個類、譬如第一輪我只關注綠色三角,那么我可以建立模型將綠三角標記為正向類 y = 1、將紅叉叉和藍框框都標記為負向類;經過這一輪的模型,我就可以判斷出一個數據是綠三角的概率了;然后再對紅叉叉建立模型將紅叉叉標記為正相類 y = 2,綠三角和藍框框都標為負向類,最后建立模型來對藍框框做同樣的操作。
總之就是有N個類別就建立N個模型,對于一個樣本,我們需要用這N個模型依次檢驗其在該模型下屬于正向類的概率。
9.過擬合over-fitting
過擬合
過度擬合的意思,意味著模型訓練過程中,對訓練集的模擬和學習過度貼合;
過擬合帶來的影響:模型訓練時的檢測率很高效果很好,但是用于實際檢驗時,效果很差,模型不能很準確地預測,即泛化能力差。
欠擬合
和過擬合相對,欠擬合是指模型和數據集間的擬合程度不夠,學習不足。
欠擬合的影響:和過擬合相對,欠擬合是指模型和數據集間的擬合程度不夠,可能是學習輪數不夠、數據集特征不規則、模型選擇有問題等。欠擬合時,模型的泛化能力同樣會很差。
泛化能力(generalization ability)
是指一個機器學習算法對于沒有見過的樣本的識別能力。泛化能力自然是越高越好。
分類問題和回歸問題中都可能存在過擬合的問題,見下圖:解決或改善?
1.丟棄一些不能幫助我們正確預測的特征。可以是手工選擇保留哪些特征,或者使用一些模型選擇的算法來幫忙(例如 PCA)
2.正則化。 保留所有的特征,但是減少參數的大小(magnitude)。
10.正則化
假設回歸問題中,過擬合的模型如下:
從第9.點中圖像上,我們可以看出,正是那些高次項導致了過擬合的產生,所以降低高次項的系數
我們就能降低過擬合程度。但是,我們不能直接修改模型中的參數大小,而通過修改代價函數中參數大小來實現“曲線救國”
正常回歸問題的損失函數如下:對損失函數做梯度下降算法,如下:
[圖片上傳失敗...(image-d793a0-1583758276758)]可見,每次迭代中,為了使迭代后的參數變更小,我們需要使
盡可能大,而學習率固定,所以我們只能想辦法讓倒數項盡可能大。所以我們可以對損失/代價函
做一波修改:

對的更新如下:
可見,對于參數和,因為有系數的存在,每次求導都會讓其降低的更多更快,而且,不會影響其他參數項的下降,從而達到比較理想的效果。
1.一般表示
如果我們有 總計n個參數(通常
不用懲罰),通常會對所有的參數進行懲罰,并設置系數
,這樣的結果是得到了一個較為簡單的能防止過擬合問題的假設函數:

經過正則化處理后的模型與原模型對比圖如下:

如果正則化系數過小,將會導致效果不好,模型的擬合度依舊很高;
如果正則化系數過大,則會將除了以外的所有系數都懲罰殆盡,導致假設函數近似: 即變成圖中的紅線。
2.正則化線性回歸
此處比較簡單,我就直接貼圖了:3.正則化邏輯回歸
此處比較簡單,我就直接貼圖了:


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