邏輯回歸(Logistic Regression)
邏輯回歸的定義
簡單來說, 邏輯回歸(Logistic Regression)是一種用於解決二分類(0 or 1)問題的機器學習方法,用於估計某種事物的可能性。比如某用戶購買某商品的可能性,某病人患有某種疾病的可能性,以及某廣告被用戶點擊的可能性等。 注意,這里用的是“可能性”,而非數學上的“概率”,logisitc回歸的結果並非數學定義中的概率值,不可以直接當做概率值來用。該結果往往用於和其他特征值加權求和,而非直接相乘。
那么邏輯回歸與線性回歸是什么關系呢?
邏輯回歸(Logistic Regression)與線性回歸(Linear Regression)都是一種廣義線性模型(generalized linear model)。邏輯回歸假設因變量 y 服從伯努利分布,而線性回歸假設因變量 y 服從高斯分布。 因此與線性回歸有很多相同之處,去除Sigmoid映射函數的話,邏輯回歸算法就是一個線性回歸。可以說,邏輯回歸是以線性回歸為理論支持的,但是邏輯回歸通過Sigmoid函數引入了非線性因素,因此可以輕松處理0/1分類問題。
假設函數(Hypothesis function)
首先我們要先介紹一下Sigmoid函數,也稱為邏輯函數(Logistic function):
其函數曲線如下:
從上圖可以看到sigmoid函數是一個s形的曲線,它的取值在[0, 1]之間,在遠離0的地方函數的值會很快接近0或者1。它的這個特性對於解決二分類問題十分重要
邏輯回歸的假設函數形式如下:
所以:
其中 是我們的輸入,
為我們要求取的參數。
一個機器學習的模型,實際上是把決策函數限定在某一組條件下,這組限定條件就決定了模型的假設空間。當然,我們還希望這組限定條件簡單而合理。而邏輯回歸模型所做的假設是:
這個函數的意思就是在給定 和
的條件下
的概率。
這里 就是我們上面提到的sigmoid函數,與之相對應的決策函數為:
選擇0.5作為閾值是一個一般的做法,實際應用時特定的情況可以選擇不同閾值,如果對正例的判別准確性要求高,可以選擇閾值大一些,對正例的召回要求高,則可以選擇閾值小一些。
決策邊界(Decision Boundary)
決策邊界,也稱為決策面,是用於在N維空間,將不同類別樣本分開的平面或曲面。
注意:決策邊界是假設函數的屬性,由參數決定,而不是由數據集的特征決定。
這里我們引用Andrew Ng 課程上的兩張圖來解釋這個問題:
- 線性決策邊界
這里決策邊界為:
- 非線性決策邊界:
這里決策邊界為:
上面兩張圖很清晰的解釋了什么是決策邊界,決策邊界其實就是一個方程,在邏輯回歸中,決策邊界由 定義。
這里我們要注意理解一下假設函數和決策邊界函數的區別與聯系。決策邊界是假設函數的屬性,由假設函數的參數( )決定。
在邏輯回歸中,假設函數 用於計算樣本屬於某類別的可能性;決策函數
用於計算(給出)樣本的類別;決策邊界
是一個方程,用於標識出分類函數(模型)的分類邊界。
代價函數(Cost Function)
什么是代價函數?
假設有訓練樣本 ,模型為
, 參數為
。
(
表示
的轉置)。
<1>. 概況來講,任何能夠衡量模型預測出來的值 與真實值
之間的差異的函數都可以叫做代價函數
,如果有多個樣本,則可以將所有代價函數的取值求均值,記做
。因此很容易就可以得出以下關於代價函數的性質:
<2>. 當我們確定了模型 ,后面做的所有事情就是訓練模型的參數
。那么什么時候模型的訓練才能結束呢?這時候也涉及到代價函數,由於代價函數是用來衡量模型好壞的,我們的目標當然是得到最好的模型(也就是最符合訓練樣本的模型)。因此訓練參數的過程就是不斷改變
,從而得到更小的
的過程。理想情況下,當我們取到代價函數J的最小值時,就得到了最優的參數
,記為:
例如, ,表示我們的模型完美的擬合了觀察的數據,沒有任何誤差。
<3>. 在優化參數θ的過程中,最常用的方法是梯度下降,這里的梯度就是代價函數 對
的偏導數。由於需要求偏導,我們可以得到另一個關於代價函數的性質:
- 選擇代價函數時,最好挑選對參數
可微的函數(全微分存在,偏導數一定存在)
代價函數的常見形式
經過上面的描述,一個好的代價函數需要滿足兩個最基本的要求:能夠評價模型的准確性,對參數 可微。
<1>. 在線性回歸中,最常用的是均方誤差(Mean squared error),即
<2>. 在邏輯回歸中,最常用的是代價函數是交叉熵(Cross Entropy),交叉熵是一個常見的代價函數,在神經網絡中也會用到。下面是《神經網絡與深度學習》一書對交叉熵的解釋:
交叉熵是對「出乎意料」(譯者注:原文使用suprise)的度量。神經元的目標是去計算函數x→y=y(x)。但是我們讓它取而代之計算函數x→a=a(x)。假設我們把a當作y等於1的概率,1−a是y等於0的概率。那么,交叉熵衡量的是我們在知道y的真實值時的平均「出乎意料」程度。當輸出是我們期望的值,我們的「出乎意料」程度比較低;當輸出不是我們期望的,我們的「出乎意料」程度就比較高。
在1948年,克勞德·艾爾伍德·香農將熱力學的熵,引入到信息論,因此它又被稱為香農熵(Shannon Entropy),它是香農信息量(Shannon Information Content, SIC)的期望。香農信息量用來度量不確定性的大小:一個事件的香農信息量等於0,表示該事件的發生不會給我們提供任何新的信息,例如確定性的事件,發生的概率是1,發生了也不會引起任何驚訝;當不可能事件發生時,香農信息量為無窮大,這表示給我們提供了無窮多的新信息,並且使我們無限的驚訝。更多解釋可以看這里。
- 符號說明同上
代價函數的常見形式(cont)
但是我們會疑問,為什么這么定義代價函數呢?下面我會簡單的解釋一下:
對於單個的樣本來講, 所對應的
為:
上面的方程等價於:
當 時:
其函數圖像為:
從圖中可以看出, ,當預測值
時,可以看出代價h_\theta(x)=\frac{1}{1+e{-\thetaTx}}函數
的值為0,這正是我們希望的。如果預測值
即
,意思是預測
的概率為0,但是事實上
,因此代價函數
相當於給學習算法一個懲罰。
同理,我們也可以畫出當 時, 函數
的圖像:
代價函數與參數
代價函數衡量的是模型預測值h(θ) 與標准答案y之間的差異,所以總的代價函數J是h(θ)和y的函數,即,J=f(h(θ), y)。又因為y都是訓練樣本中給定的,h(θ)有θ決定,所以,最終還是模型參數θ的改變導致了J的改變。對於不同的θ,對應不同的預測值h(θ),也就對應着不同的代價函數J的取值。變化過程為:
為了更直觀的看到參數對代價函數的影響,舉個簡單的例子:
有訓練樣本{(0, 0), (1, 1), (2, 2), (4, 4)},即4對訓練樣本,每個樣本中第1個是x的值,第2個是y的值。這幾個點很明顯都是y=x這條直線上的點。如下圖:
import matplotlib.pyplot as plt
import numpy as np
X = np.array([[0, 1, 2, 4]]).T # 都轉換成列向量
y = np.array([[0, 1, 2, 4]]).T
theta1 = np.array([[0, 0]]).T # 三個不同的theta_1值
theta2 = np.array([[0, 0.5]]).T
theta3 = np.array([[0, 1]]).T
X_size = X.shape
X_0 = np.ones((X_size[0],1)) # 添加x_0
X_with_x0 = np.concatenate((X_0, X), axis=1)
h1 = np.dot(X_with_x0, theta1)
h2 = np.dot(X_with_x0, theta2)
h3 = np.dot(X_with_x0, theta3)
plt.plot(X, y, 'rx', label='y')
plt.plot(X, h1, 'b', label='h1, theta_1=0')
plt.plot(X, h2, 'm', label='h2, theta_1=0.5')
plt.plot(X, h3, 'g', label='h3, theta_1=1')
plt.xlabel('X')
plt.ylabel('y/h')
plt.axis([-0.1, 4.5, -0.1, 4.5])
plt.legend(loc='upper left')
plt.savefig('liner_gression_error.png', dpi=200)
常數項為0,所以可以取θ0=0,然后取不同的θ1,可以得到不同的擬合直線。當θ1=0時,擬合的直線是y=0,即藍色線段,此時距離樣本點最遠,代價函數的值(誤差)也最大;當θ1=1時,擬合的直線是y=x,即綠色線段,此時擬合的直線經過每一個樣本點,代價函數的值為0。
通過下圖可以查看隨着θ1的變化,J(θ)的變化情況:
# 計算代價函數的值
def calcu_cost(theta, X, y):
m = X.shape[0] # sample size
X_0 = np.ones((m,1))
X_with_x0 = np.concatenate((X_0, X), axis=1)
h = np.dot(X_with_x0, theta)
return(np.dot((h-y).T, (h-y))/(2*m))
X = np.array([[0, 1, 2, 4]]).T
y = np.array([[0, 1, 2, 4]]).T
theta_0 = np.zeros((101, 1))
theta_1 = np.array([np.linspace(-2, 4, 101)]).T
theta = np.concatenate((theta_0, theta_1), axis=1) # 101組不同的參數
J_list = []
for i in range(101):
current_theta = theta[i:i+1].T
cost = calcu_cost(current_theta, X, y)
J_list.append(cost[0,0])
plt.plot(theta_1, J_list)
plt.xlabel('theta_1')
plt.ylabel('J(theta)')
plt.savefig('cost_theta.png', dpi=200)
從圖中可以很直觀的看到θ對代價函數的影響,當θ1=1時,代價函數J(θ)取到最小值。因為線性回歸模型的代價函數(均方誤差)的性質非常好,因此也可以直接使用代數的方法,求J(θ)的一階導數為0的點,就可以直接求出最優的θ值。
代價函數與梯度
梯度下降中的梯度指的是代價函數對各個參數的偏導數,偏導數的方向決定了在學習過程中參數下降的方向,學習率(通常用α表示)決定了每步變化的步長,有了導數和學習率就可以使用梯度下降算法(Gradient Descent Algorithm)更新參數了, 即求解使 最小的參數
:
看來其和線性回歸中的梯度下降函數形式一模一樣,但其實是不一樣的,因為在logistic回歸中
關於從 到
推導如下: