機器學習之多變量線性回歸(Linear Regression with multiple variables)


1. Multiple features(多維特征)

機器學習之單變量線性回歸(Linear Regression with One Variable)我們提到過的線性回歸中,我們只有一個單一特征量(變量)——房屋面積x。我們希望使用這個特征量來預測房子的價格。我們的假設在下圖中用藍線划出:

image
不妨思考一下,如果我們不僅僅知道房屋面積(作為預測房屋價格的特征量(變量)),我們還知道卧室的數量、樓層的數量以及房屋的使用年限,那么這就給了我們更多可以用來預測房屋價格的信息。

image

image

image

image

即,支持多變量的假設為:

image

這個公式中有n+1個參數和n個特征量(變量),為了使得公式能夠簡化一些,引入x0=1,則公式轉化為:

image

可以簡化為如下形式:

image

2. Gradient descent for multiple variables(多變量梯度下降)

image

image

3. Gradient descent in practice:Feature Scaling(特征縮放)

1

下面我們來介紹一些關於梯度下降運算中的實用技巧,首先是特征縮放 (feature scaling) 方法。

如果你有一個機器學習問題,並且這個問題有多個特征。如果你能確保這些特征都處在一個相近的范圍(確保不同特征的取值在相近的范圍內),這樣梯度下降法就能更快地收斂。

具體來說,假如你有一個具有兩個特征的問題,其中 x1 是房屋面積大小,它的取值在0到2000之間,x2 是卧室的數量,這個值取值范圍在1到5之間。如果你畫出代價函數J(θ) 的輪廓圖:

image

那么這個輪廓看起來,應該是如上圖左邊的樣子。

J(θ) 是一個關於參數 θ0 、θ1 和 θ2 的函數,我在此處忽略 θ0 (暫時不考慮 θ0)。並假想一個函數的參數,只有 θ1 和 θ2,但如果變量 x1 的取值范圍遠遠大於 x2 的取值范圍的話,那么最終畫出來的代價函數 J(θ) 的輪廓圖就會呈現出這樣一種非常偏斜並且橢圓的形狀。2000和5的比例會讓這個橢圓更加瘦長。

所以,這是一個又瘦又高的橢圓形輪廓圖,正是這些非常高大細長的橢圓形構成了代價函數 J(θ),如果你用這個代價函數來進行梯度下降的話,你要得到梯度值最終可能需要花很長一段時間才能得到。並且可能會來回波動,然后會經過很長時間,最終才收斂到全局最小值。

事實上,你可以想像如果這些輪廓再被放大一些的話,如上圖最左邊的那樣(如果你畫的再誇張一些,把它畫的更細更長),那么可能情況會更糟糕。梯度下降的過程可能更加緩慢,需要花更長的時間,反復來回振盪,最終才找到一條正確通往全局最小值的路。

在這樣的情況下一種有效的方法是進行特征縮放(feature scaling)。

2

舉例來說,把特征 x 定義為房子的面積大小除以2000,並且把 x2 定義為卧室的數量除以5。如此一來,表示代價函數 J(θ)的輪廓圖的形狀偏移就會沒那么嚴重,也許看起來會更圓一些。

如果你用這樣的代價函數,來進行梯度下降的話,那么梯度下降算法就會找到一條更快捷的路徑通向全局最小,而不是像剛才那樣,沿着一條讓人摸不着頭腦的路徑、一條復雜得多的軌跡來找到全局最小值。

因此,通過特征縮放,通過“消耗掉”這些值的范圍(在這個例子中,我們最終得到的兩個特征 x1 和 x2 都在 0 和 1 之間),你得到的梯度下降算法就會更快地收斂。

更一般地,我們執行特征縮放,將特征的取值約束到-1 到 +1 的范圍內(注意:特征 x0 是總是等於1,已經在這個范圍內)。但對其他的特征,我們可能需要通過除以不同的數來讓它們處於同一范圍內。-1 和 +1 這兩個數字並不是太重要。

image

如果你有一個特征 x1 ,它的取值在 0 和 3 之間,這沒問題。

如果你有另外一個特征,取值在-2 到 +0.5 之間,OK,這也沒什么關系。因為這也非常接近 -1 到 +1 的范圍。

但如果你有另一個特征,假如它的范圍在 -100 到 +100 之間,那么這個范圍跟 –1 到 +1 就有很大不同了,所以,這可能是一個不那么好的特征。

類似地,如果你的特征在一個非常非常小的范圍內,比如 -0.0001 和 +0.0001 之間,那么這同樣是一個比 –1 到 +1 小得多的范圍,因此,我們同樣會認為這個特征也不太好。

所以,你所認可的范圍可以大於或者小於 -1 到 +1 的范圍,但是也別太大或者太小到不可以接受的范圍。通常不同的人有不同的經驗,但是我們一般是這么考慮的:如果一個特征是在 -3 到 +3 的范圍內,那么你應該認為這個范圍是可以接受的。但如果這個范圍大於了 -3 到 +3 的范圍,我們可能就要開始注意了。如果它的取值在 -1/3  到 +1/3 的話,我們覺得也還不錯,可以接受,或者是 0 到 1/3  或 -1/3 到 0 這些典型的范圍,我們都認為是可以接受的。但如果特征的范圍取得很小的話,你就要開始考慮進行特征縮放了。

總的來說,不用過於擔心你的特征是否在完全相同的范圍或區間內,只要他們足夠接近的話,梯度下降法就會正常地工作。

3

除了在特征縮放中,將特征除以最大值以外,有時我們也會進行一個稱為均值歸一化的工作(mean normalization)

我的意思是這樣的,如果你有一個特征 xi,你就用 xi - μi 來替換它,通過這樣做,讓你的特征值,具有為0的平均值(μi 指所有 xi 的平均值)。

很明顯,我們不需要把這一步應用到 x0 中,因為 x0 總是等於1的,所以它不可能有為0的的平均值。

但是對其他的特征來說,比如房子的大小,取值介於 0 到 2000,並且假設房子面積的平均值等於1000,那么你可以用這個公式將 x1 的值變為 x1 減去平均值 μ1,再除以2000。

類似地,如果你的房子有五間卧室,並且平均一套房子有兩間卧室,那么你可以使用這個公式來歸一化你的第二個特征 x2。

在這兩種情況下你可以算出新的特征 x1 和 x2,這樣它們的范圍,可以在 -0.5 和 +0.5 之間。

image

當然這肯定不對,例如 x2 的值實際上有可能會大於0.5(例如(5-2)/ 5 = 0.6 ) 但很接近。

更一般的規律是,你可以用如下的公式:

(x1 - μ1)/S1

來替換原來的特征 x1

其中定義μ1的意思是,在訓練集中,特征 x1 的平均值。而 S1 是該特征值的范圍(最大值減去最小值)。當然,也可以把 S1 設為變量的標准差,但其實用最大值減最小值就可以了。

類似地,對於第二個特征 x2,你也同樣可以運用這個特征減去平均值再除以范圍,來替換原特征(范圍的意思依然是最大值減最小值)。

這類公式將把你的特征變成如下這樣的范圍,也許不是完全這樣,但大概是這樣的范圍:

-0.5 < Xi < 0.5

順便提一下,有些同學可能看文章比較仔細,如果我們用最大值減最小值來表示范圍的話,上面的 5 應該改成 4(如果最大值為5,那么減去最小值1,這個范圍值就是4)。

但不管這么說,這些取值都是非常近似的,只要將特征轉換為相近似的范圍,就都是可以的,特征縮放其實並不需要太精確,只是為了讓梯度下降能夠運行得更快一點而已。

小結

通過使用特征縮放這個簡單的方法,你可以讓梯度下降的速度變得更快,讓梯度下降收斂所需的循環次數更少

接下來我們將介紹另一種技巧來使梯度下降在實踐中工作地更好 。

4. Gradient descent in practice: Learning rate(學習速率)

1

接下來,我們將集中討論學習速率 α。

具體來說,這是梯度下降算法的更新規則,這里我想介紹的是如何調試(也就是如何確定梯度下降是正常工作的)以及如何選擇學習率 α。

image

2

怎樣確定梯度下降正常工作的?

梯度下降算法所做的事情就是為你找到一個 θ 值,並希望它能夠最小化代價函數 J(θ)。

我們通常可以在梯度下降算法運行時繪制出代價函數 J(θ) 的值。注意這里的 x 軸是表示梯度下降算法的迭代步數。

image
你可能會得到上圖那樣的一條曲線。

曲線上一點的含義是這樣的:假如當我運行完100步的梯度下降迭代之后,無論我得到什么 θ 值(無論如何,100步迭代之后,我將得到一個 θ 值),根據100步迭代之后得到的這個 θ 值,我們可以計算出代價函數 J(θ) 的值,而這個點的垂直高度就代表梯度下降算法經過100步迭代之后而算出的 J(θ) 值。

因此這條曲線顯示的是梯度下降算法迭代過程中代價函數 J(θ) 的值。

如果梯度下降算法正常工作,那么每一步迭代之后J(θ) 都應該下降。這條曲線用處在於,它可以告知你一些信息:例如,你可以觀察到上圖的這條曲線,當你達到300步迭代之后,也就是在300步到400步迭代之間,看起來 J(θ) 並沒有下降多少。當你到達400步迭代時,這條曲線看起來已經很平坦了。

也就是說,在這里400步迭代的時候,梯度下降算法基本上已經收斂了,因為代價函數並沒有繼續下降。

所以說,觀察這條曲線可以幫助你判斷梯度下降算法是否已經收斂。

順便提一下,對於每一個特定的問題而言,梯度下降算法所需的迭代次數可以相差很大。

也許對於某一個問題,梯度下降算法只需要30步迭代就可以收斂;然而換一個問題,也許梯度下降算法就需要3000步迭代;再對於另一個機器學習問題而言,則可能需要三百萬步迭代。

實際上,我們很難提前判斷梯度下降算法需要多少步迭代才能收斂。因此,通常我們需要畫出這類曲線,畫出代價函數隨迭代步數增加的變化曲線。

通常,我們可以通過看這種曲線,來試着判斷梯度下降算法是否已經收斂。

3

此外,也可以進行一些自動的收斂測試,也就是說用一種算法,來告訴你梯度下降算法是否已經收斂。

image
自動收斂測試一個非常典型的例子是:如果代價函數 J(θ) 的下降小於一個很小的值 ε ,那么就認為已經收斂。

比如可以選擇1e-3,但是通常要選擇一個合適的閾值 ε 是相當困難的。

因此 為了檢查梯度下降算法是否收斂,我們實際上還是通過觀察之前介紹的代價函數隨迭代步數增加的變化曲線,而不是依靠自動收斂測試。

4

此外,這種曲線圖也可以在算法沒有正常工作時,提前警告你。

image

具體地說,如果代價函數 J(θ) 隨迭代步數的變化曲線是上圖左上角的這個樣子,J(θ) 實際上在不斷上升,那么這就很明確的表示梯度下降算法沒有正常工作。

而這樣的曲線圖,通常意味着你應該使用較小的學習率 α。

同樣的 有時你可能看到上圖左下角這種形狀的 J(θ) 曲線,它先下降,然后上升,接着又下降,然后又上升,如此往復。

而解決這種情況的方法,通常同樣是選擇較小 α 值。

我們並不打算證明這一點,但對於我們討論的線性回歸,可以很容易從數學上證明,只要學習率足夠小,那么每次迭代之后,代價函數 J(θ)都會下降,因此如果代價函數沒有下降,那么可以認為是學習速率過大造成的。此時,你就應該嘗試一個較小的學習率。

當然,你也不希望學習速率太小。因為如果這樣,那么梯度下降算法可能收斂得很慢。

image

總結一下:

如果學習率 α 太小,你會遇到收斂速度慢的問題,而如果學習率 α 太大,代價函數 J(θ) 可能不會在每次迭代都下降,甚至可能不收斂,在某些情況下,如果學習率 α 過大,也可能出現收斂緩慢的問題。但更常見的情況是,你會發現代價函數 J(θ),並不會在每次迭代之后都下降。

而為了調試所有這些情況,繪制J(θ)隨迭代步數變化的曲線,通常可以幫助你弄清楚到底發生了什么。

具體來說,當我們運行梯度下降算法時,通常會嘗試一系列α值,如:

…,0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1,…

然后對於這些不同的 α 值,繪制 J(θ)隨迭代步數變化的曲線,然后選擇看上去使得 J(θ)快速下降的一個 α 值。

所以,在為梯度下降算法選擇合適的學習率時,可以大致按3的倍數來取值一系列α值,直到我們找到一個值它不能再小了,同時找到另一個值,它不能再大了。然后我盡量挑選,其中最大的那個 α 值,或者一個比最大值略小一些的合理的值。當我們做了以上工作時,通常就可以得到一個不錯的學習 速率值。

5. Features and polynomial regression(特征與多項式回歸)

1

你現在已經了解了多變量的線性回歸,本章將介紹選擇特征的方法以及如何得到不同的學習算法。當選擇了合適的特征后,這些算法往往是非常有效的。另外,我們會介紹多項式回歸,它使得你們能夠使用線性回歸的方法來擬合非常復雜的函數,甚至是非線性函數。

以預測房價為例,假設你有兩個特征,分別是房子臨街的寬度和垂直寬度。

image

實際上,當我們在運用線性回歸時,你不一定非要直接用給出的 x1 和 x2 作為特征,其實你可以自己創造新的特征。

如果我要預測的是房子的價格,我真正要需做的是確定真正能夠決定我房子大小的因素是什么,因此,我可能會創造一個新的特征 x ,它是臨街寬度與縱深的乘積,這得到的就是我擁有的土地的面積。然后,我可以讓假設 h 只使用一個特征,也就是土地的面積。

有時,通過定義新的特征,你可以得到一個更好的模型。

2

與選擇特征密切相關的一個概念被稱為多項式回歸(polynomial regression)。

如果你有一個住房價格的數據集,為了擬合它,可能會有多個不同的模型供選擇。

image
直線似乎並不能很好地擬合這些數據,你可以選擇二次模型,但是你會發現二次函數的模型似乎也並不好用,因為,一個二次函數的曲線最終會降回來。而我們並不認為房子的價格在高到一定程度后會下降回來。

因此,我們可以選擇另一個不同的多項式模型,例如,三次函數,在這里三次函數,對這個數據集擬合得更好,因為它不會在最后下降回來。

那么,我們到底應該如何將模型與我們的數據進行擬合呢?

我們只要將多元線性回歸算法做一個非常簡單的修改,就可以更好的與數據進行擬合。

按照我們以前假設的形式,我們知道如何對這樣的模型進行擬合,可以是:

hθ(X) = θ0 1 × X1+ θ2 × X2 + θ3 × X3

其中 X1,X2 和 X3 分別代表不同的特征。

那么,如果如何將數據擬合成三次模型?

可以將第一個特征 x1 設為房子的面積,將第二個特征 x2 設為房屋面積的平方,將第三個特征 x3 設為房子面積的立方。

那么僅僅通過將,這三個特征如上這樣設置,然后再應用線性回歸的方法,我們就可以擬合這個模型,並最終將一個三次函數擬合到我的數據上。

以上所做的,也可以理解為通過設置3個特征,從而將模型轉化為線性回歸模型。注:如果我們采用多項式回歸模型,在運行梯度下降算法前,進行特征縮放非常有必要。

3

需要說明的是,如果你像上面介紹的這樣選擇特征,那么特征的歸一化就變得更重要了,因為這三個特征的范圍有很大的不同。

因此,如果你使用梯度下降法,使用特征值的歸一化是非常重要的,這樣才能將他們的值的范圍變得具有可比性。

再來看一個例子,關於如何使你真正選擇出要使用的特征。

此前我們談到一個像這樣的二次模型並不是理想的,因為你知道也許一個二次模型能很好地擬合這個數據,但二次函數最后會下降,這是我們不希望看到的。

但是,除了轉而建立一個三次模型以外,你也許有其他的選擇特征的方法,如下:

image

小結

本章中,我們探討了多項式回歸,也就是如何將一個多項式,如一個二次函數或一個三次函數擬合到你的數據上。

除此之外,我們還討論了在使用特征時的選擇性。例如,我們不使用房屋的臨街寬度和縱深,而是把它們乘在一起,從而得到房子的土地面積這個特征。實際上,這似乎有點難以抉擇,這里有這么多不同的特征選擇,我該如何決定使用什么特征呢?

在之后的文章中,我們將探討一些算法,它們能夠自動選擇要使用什么特征,因此,你可以使用一個算法,它將通過你給出的數據,自動為你選擇到底應該選擇一個二次函數、一個三次函數或者還是其他別的函數。

但是,在我們學到那種算法之前,我希望你們知道你需要選擇使用什么特征,並且通過設計不同的特征,能夠其使用用更復雜的函數去擬合你的數據,而不是只用一條直線去擬合。

6. Normal equation(正規方程)

之前,我們一直都在使用梯度下降算法,但是對於某些線性回歸問題,正規方程式更好的解決方案。

正規方程通過求解以下的方程:

image

來求出使得代價函數最小的參數。

image

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM