1. 程式人生 > 實用技巧 >【機器學習】#4-6

【機器學習】#4-6

多變數線性迴歸(Linear Regression with Multiple Variables)

4.1多維特徵

多維特徵就是有多個特徵,比如房價模型中增加房子的樓層數等等,模型的特徵為\(\left( {x_{1}},{x_{2}},...,{x_{n}} \right)\)

\(n\) 代表特徵的數量

\({x^{\left( i \right)}}\)代表第 \(i\) 個訓練例項,是特徵矩陣中的第\(i\)行,是一個向量vector)。

例如:

\({x}^{(2)}\text{=}\begin{bmatrix} 1416\\\ 3\\\ 2\\\ 40 \end{bmatrix}\)

\({x}_{j}^{\left( i \right)}\)代表特徵矩陣中第 \(i\) 行的第 \(j\) 個特徵,也就是第 \(i\) 個訓練例項的第 \(j\) 個特徵。

如上圖的\(x_{2}^{\left( 2 \right)}=3,x_{3}^{\left( 2 \right)}=2\)

支援多變數的假設 \(h\) 表示為:\(h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}\)

為了使得公式能夠簡化一些,引入\(x_{0}=1\)

,則公式轉化為:\(h_{\theta} \left( x \right)={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}\)

此時模型中的引數是一個\(n+1\)維的向量,任何一個訓練例項也都是\(n+1\)維的向量,特徵矩陣\(X\)的維度是 \(m*(n+1)\)。 因此公式可以簡化為:\(h_{\theta} \left( x \right)={\theta^{T}}X\),其中上標\(T\)代表矩陣轉置。

4.2多變數梯度下降

構建一個代價函式,這個代價函式是所有建模誤差的平方和,即:\(J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}\)

其中:\(h_{\theta}\left( x \right)=\theta^{T}X={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}\)

梯度下降:
\({\theta_{j}}:={\theta_{j}}-\alpha \frac{\partial }{\partial {\theta_{j}}}J\left({\theta}_{0},{\theta}_{1},...,{\theta}_{n} \right)\)

4.3特徵縮放

在我們面對多維特徵問題的時候,我們要保證這些特徵都具有相近的尺度,這將幫助梯度下降演算法更快地收斂。

最簡單的方法是令:\({{x}_{n}}=\frac{{{x}_{n}}-{{\mu}_{n}}}{{{s}_{n}}}\)
其中 \({\mu_{n}}\)是平均值,\({s_{n}}\)是標準差。

4.4學習率

梯度下降演算法收斂所需要的迭代次數根據模型的不同而不同,我們不能提前預知,我們可以繪製迭代次數和代價函式的圖表來觀測演算法在何時趨於收斂。

梯度下降演算法的每次迭代受到學習率的影響,如果學習率\(a\)過小,則達到收斂所需的迭代次數會非常高;如果學習率\(a\)過大,每次迭代可能不會減小代價函式,可能會越過區域性最小值導致無法收斂。

通常可以考慮嘗試些學習率:

\(\alpha=0.01,0.03,0.1,0.3,1,3,10\)

4.5特徵和多項式迴歸

線性迴歸並不適用於所有資料,有時我們需要曲線來適應我們的資料,比如一個二次方模型:\(h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}\)
或者三次方模型: \(h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}+{\theta_{3}}{x_{3}^3}\)

通常我們需要先觀察資料然後再決定準備嘗試怎樣的模型。 另外,我們可以令:

\({{x}_{2}}=x_{2}^{2},{{x}_{3}}=x_{3}^{3}\),從而將模型轉化為線性迴歸模型。

根據函式圖形特性,我們還可以使:

\({{{h}}_{\theta}}(x)={{\theta }_{0}}\text{+}{{\theta }_{1}}(size)+{{\theta}_{2}}{{(size)}^{2}}\)

或者:

\({{{h}}_{\theta}}(x)={{\theta }_{0}}\text{+}{{\theta }_{1}}(size)+{{\theta }_{2}}\sqrt{size}\)

注:如果我們採用多項式迴歸模型,在執行梯度下降演算法前,特徵縮放非常有必要。

4.6正規方程

除了梯度下降法外,對於某些線性迴歸問題我們可以直接通過正規方程求出\({\theta}\).

即求解方程:\(\frac{\partial}{\partial{\theta_{j}}}J\left( {\theta_{j}} \right)=0\)

假設我們的訓練集特徵矩陣為 \(X\)(包含了 \({{x}_{0}}=1\))並且我們的訓練集結果為向量 \(y\),則利用正規方程解出向量 \(\theta ={{\left( {X^T}X \right)}^{-1}}{X^{T}}y\)

梯度下降與正規方程的比較:

梯度下降 正規方程
需要選擇學習率\(\alpha\) 不需要
需要多次迭代 一次運算得出
當特徵數量\(n\)大時也能較好適用 需要計算\({{\left( {{X}^{T}}X \right)}^{-1}}\) 如果特徵數量n較大則運算代價大,因為矩陣逆的計算時間複雜度為\(O\left( {{n}^{3}} \right)\),通常來說當\(n\)小於10000 時還是可以接受的
適用於各種型別的模型 只適用於線性模型,不適合邏輯迴歸模型等其他模型

特徵變數小於1w通常用正規方程,大於1w更傾向於使用梯度下降

正規方程的python實現:

import numpy as np
    
 def normalEqn(X, y):
    
   theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等價於X.T.dot(X)
    
   return theta

6 邏輯迴歸(Logistic Regression)

6.1分類問題

對於二元分類問題

我們將因變數(dependent variable)可能屬於的兩個類分別稱為負向類(negative class)和正向類(positive class),則因變數\(y\in { 0,1 \\}\) ,其中 0 表示負向類,1 表示正向類。

由於y是離散的(0或1),如果使用線性迴歸的話輸出的y可能遠大於1或遠小於0,這與我們的條件不符,而邏輯迴歸的特徵就是它的輸出值永遠在0和1之間。

邏輯迴歸是一種分類演算法,適用於標籤y取值離散的情況

6.2 假說表示

我們引入一個新的模型,邏輯迴歸,該模型的輸出變數範圍始終在0和1之間。
邏輯迴歸模型的假設是: \(h_\theta \left( x \right)=g\left(\theta^{T}X \right)\)
其中:
\(X\) 代表特徵向量
\(g\) 代表邏輯函式(logistic function)是一個常用的邏輯函式為S形函式(Sigmoid function),公式為: \(g\left( z \right)=\frac{1}{1+{{e}^{-z}}}\)

python程式碼實現:

import numpy as np
    
def sigmoid(z):
    
   return 1 / (1 + np.exp(-z))

該函式的影象為:

合起來,我們得到邏輯迴歸模型的假設:

對模型的理解: \(g\left( z \right)=\frac{1}{1+{{e}^{-z}}}\)

\(h_\theta \left( x \right)\)的作用是,對於給定的輸入變數,根據選擇的引數計算輸出變數=1的可能性(estimated probablity

\(h_\theta \left( x \right)=P\left( y=1|x;\theta \right)\) (就是一個條件概率)

例如,如果對於給定的\(x\),通過已經確定的引數計算得出\(h_\theta \left( x \right)=0.7\),則表示有70%的機率\(y\)為正向類,相應地\(y\)為負向類的機率為1-0.7=0.3。

6.3判定邊界

在邏輯迴歸中,我們預測:

\({h_\theta}\left( x \right)>=0.5\)時,預測 \(y=1\)

\({h_\theta}\left( x \right)<0.5\)時,預測 \(y=0\)

根據上面繪製出的 S 形函式影象,我們知道當

\(z=0\)\(g(z)=0.5\)

\(z>0\)\(g(z)>0.5\)

\(z<0\)\(g(z)<0.5\)

\(z={\theta^{T}}x\) ,即:
\({\theta^{T}}x>=0\) 時,預測 \(y=1\)
\({\theta^{T}}x<0\) 時,預測 \(y=0\)

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

並且引數\(\theta\) 是向量[-3 1 1]。 則當\(-3+{x_1}+{x_2} \geq 0\),即\({x_1}+{x_2} \geq 3\)時,模型將預測 \(y=1\)
我們可以繪製直線\({x_1}+{x_2} = 3\),這條線便是我們模型的分界線,將預測為1的區域和預測為 0的區域分隔開。

假使我們的資料呈現這樣的分佈情況,怎樣的模型才能適合呢?


因為需要用曲線才能分隔 \(y=0\) 的區域和 \(y=1\) 的區域,我們需要二次方特徵:\({h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}+{\theta_{3}}x_{1}^{2}+{\theta_{4}}x_{2}^{2} \right)\)是[-1 0 0 1 1],則我們得到的判定邊界恰好是圓點在原點且半徑為1的圓形。

我們可以用非常複雜的模型來適應非常複雜形狀的判定邊界。

6.4代價函式

我們用代價函式來擬合引數\({\theta}\)

對於線性迴歸模型,我們定義的代價函式是所有模型誤差的平方和。理論上來說,我們也可以對邏輯迴歸模型沿用這個定義,但是問題在於,當我們將\({h_\theta}\left( x \right)=\frac{1}{1+{e^{-\theta^{T}x}}}\)帶入到這樣定義了的代價函式中時,我們得到的代價函式將是一個非凸函式(non-convexfunction

這意味著我們的代價函式有許多區域性最小值,這將影響梯度下降演算法尋找全域性最小值。

線性迴歸的代價函式為:\(J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{1}{2}{{\left( {h_\theta}\left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}\)

我們重新定義邏輯迴歸的代價函式為:\(J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{{Cost}\left( {h_\theta}\left( {x}^{\left( i \right)} \right),{y}^{\left( i \right)} \right)}\),其中

\({h_\theta}\left( x \right)\)\(Cost\left( {h_\theta}\left( x \right),y \right)\)之間的關係如下圖所示:

這樣構建的\(Cost\left( {h_\theta}\left( x \right),y \right)\)函式的特點是:當實際的 \(y=1\)\({h_\theta}\left( x \right)\)也為 1 時誤差為 0,當 \(y=1\)\({h_\theta}\left( x \right)\)不為1時誤差隨著\({h_\theta}\left( x \right)\)變小而變大;當實際的 \(y=0\)\({h_\theta}\left( x \right)\)也為 0 時代價為 0,當\(y=0\)\({h_\theta}\left( x \right)\)不為 0時誤差隨著 \({h_\theta}\left( x \right)\)的變大而變大。

將構建的 \(Cost\left( {h_\theta}\left( x \right),y \right)\)簡化如下:

\(Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)\)

帶入代價函式得到:

\(J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}\)

即:\(J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}\)

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))

在得到這樣一個代價函式以後,我們便可以用梯度下降演算法來求得能使代價函式最小的引數了。演算法為:

Repeat {
\(\theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j} J(\theta)\)
(simultaneously update all )
}

求導後得到:

Repeat {
\(\theta_j := \theta_j - \alpha \frac{1}{m}\sum\limits_{i=1}^{m}{{\left( {h_\theta}\left( \mathop{x}^{\left( i \right)} \right)-\mathop{y}^{\left( i \right)} \right)}}\mathop{x}_{j}^{(i)}\)
(simultaneously update all )
}

一些梯度下降演算法之外的選擇:
除了梯度下降演算法以外,還有一些常被用來令代價函式最小的演算法,這些演算法更加複雜和優越,而且通常不需要人工選擇學習率,通常比梯度下降演算法要更加快速。這些演算法有:共軛梯度Conjugate Gradient),區域性優化法(Broyden fletcher goldfarb shann,BFGS)和有限記憶體區域性優化法(LBFGS)

6.5簡化的成本函式和梯度下降

邏輯迴歸的代價函式:
\(Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)\)
\(=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}\)

使用梯度下降法最小化代價函式
\(J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}\)

用這個式子更新所有theta值
\({\theta_j}:={\theta_j}-\alpha \frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}}){x_{j}}^{(i)}}\)

把這個偏導數項\(\frac{\partial }{\partial {\theta_j}}J\left( \theta \right)\)放回到原來式子這裡,我們就可以將梯度下降演算法寫作如下形式:
\({\theta_j}:={\theta_j}-\alpha \frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}}){x_{j}}^{(i)}}\)

雖然式子看似相同,但線性迴歸梯度下降和邏輯迴歸梯度下降是不同的

對於線性迴歸假設函式:

\({h_\theta}\left( x \right)={\theta^T}X={\theta_{0}}{x_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}}+...+{\theta_{n}}{x_{n}}\)

而現在邏輯函式假設函式:

\({h_\theta}\left( x \right)=\frac{1}{1+{{e}^{-{\theta^T}X}}}\)

因此,即使更新引數的規則看起來基本相同,但由於假設的定義發生了變化,所以邏輯函式的梯度下降,跟線性迴歸的梯度下降實際上是兩個完全不同的東西。

特徵縮放的方法,也適用於邏輯迴歸。如果你的特徵範圍差距很大的話,那麼應用特徵縮放的方法,同樣也可以讓邏輯迴歸中,梯度下降收斂更快

6.6

6.7多類別分類:一對多

一對多的資料集和二元資料集

對於一對多的分類工作,我們使用一對餘的方法,即將其分為多個二元分類問題


我們將多個類中的一個類標記為正向類(\(y=1\)),然後將其他所有類都標記為負向類,這個模型記作\(h_\theta^{\left( 1 \right)}\left( x \right)\)。接著,類似地第我們選擇另一個類標記為正向類(\(y=2\)),再將其它類都標記為負向類,將這個模型記作 \(h_\theta^{\left( 2 \right)}\left( x \right)\),依此類推。
最後我們得到一系列的模型簡記為: \(h_\theta^{\left( i \right)}\left( x \right)=p\left( y=i|x;\theta \right)\)其中:\(i=\left( 1,2,3....k \right)\)

最後,在我們需要做預測時,我們將所有的分類機都執行一遍,然後對每一個輸入變數,都選擇最高可能性的輸出變數。