03.29 機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

01 引言

人工智能和機器學習已經是時下火熱的技術。各行各業的人都想著如何利用人工智能和機器學習使他們的工作變的更加簡單高效。

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

機器學習

機器學習知識需要由淺入深,一步一步的學習。

這篇文章,我們一起學習一下線性迴歸吧!

02 線性迴歸是什麼?

函數的定義講究的是 獨立參數 x 非獨立參數 y之間的對應關係。

y = f(x)

學好了函數,也就無意中為我們奠定了學習 迴歸(Regression)的基礎。

怎麼理解線性迴歸?

線性迴歸 = 線性 + 迴歸

第一:先理解什麼是迴歸?

機器學習的目的主要是找到

目標值 T 和 一堆數據之間的關係,而確定機器學習中的關係的方法有:分類和迴歸

怎麼去區分分類和迴歸呢?

看目標值 T 是定性的值還是定理的值:

定量輸出稱為迴歸;

定性輸出稱為分類;

比方說:

  • A: 預測明天是多少度?數據有今天的度數x,天氣情況y(晴天,雨天,陰天);
  • B: 預測明天是什麼天氣?數據有今天的度數x,天氣情況y(晴天,雨天,陰天);

一起來看看A和B兩個例子;今天的度數x是一個連續的值;而天氣情況確實一個類別,三種情況選其一;

也就是說A和B的輸入數據類型是一樣的!

A中預測明天有多少度?A會給出一個具體的值,且這個值是在一個連續的範圍內。我們管這種叫做迴歸。也就是定量輸出稱為迴歸;

B中預測明天是什麼天氣?B給出的結果是一個定性的結果,這種叫分類。定性輸出稱為分類;

雷區1: 很多人會通過輸入數據的類型來判斷分類還是迴歸,其實這和輸入數據真沒啥關係!

第二:再理解什麼是線性?

函數中,目標值T 和參數x,y,z之間的關係有很多種。比方說,

y = x,這就是線性關係;x和y的關係可以由一條直線表示;

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

體重和糖攝入量的關係

y = x^2,這可不是線性關係了;因為x和y的關係是拋物線了;

一步一步學 線性迴歸

StatQuest上已經很好的介紹了線性迴歸的方法,我就借用一下啦!(因為感覺說的不會比他的好!)。

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

在StatQuest例子中,需要找到老鼠體重和老鼠尺寸大小之間的關係,數據點如上圖。看著線性關係挺明顯的。

第一步:假設關係

老鼠大小 = a * 老鼠體重 + b

怎麼確定a和b的值就是線性迴歸的目標。

順便提一下,這個就是假設函數 h(x),h代表的是假設英文的頭字母(Hypothesis);

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

第二步:確定一個標準

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!
機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

如上圖,根據數據,我們可以畫出無數條線來表示這個線性關係。到底怎麼去選擇最優的呢?

不管畫的線如何變,數學表達式不會變。

老鼠大小 = a * 老鼠體重 + b

那麼,通過這個式子,輸出任意一個老鼠體重,就會給出一個老鼠大小值。我們定義為 預測值_i;

在已知的數據中,老鼠體重是對應的一個實際值的,定義為 實際值_i

| 預測值_i - 實際值_i | 不就是預測誤差嘛!

這樣,科學家們又造出了一個 損失函數(Cost Function),也就是說所決定的關係要使得 損失函數最小。

線性迴歸的損失函數如下:

所有誤差平方的平均值

J = sum((預測值_i - 實際值_i)^2) / n

n是數據點的個數;sum是求和的意思。

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!
機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

我們有了這個目標,就旋轉直線(改變斜率a)和上下移動改變截距(改變b)。上圖是隻改變斜率a的圖,最後在一個角度的時候,我們使得 損失函數 J最小了。而這個過程,可以通過梯度下降來求得,具體的以後的文章會重點解釋。

對了,線性迴歸的損失函數 J還有一個名字,叫做Mean Squared Error(MSE)。

03 稍微提一下Gradient Descent(梯度下降)

我希望我的朋友們,都是看過我之前文章的。因為講這個需要點微積分,具體是偏微分的知識。

討厭的公式來了。還是這張圖。

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

我們知道,損失函數 J = sum((預測值_i - 實際值_i)^2) / n。上圖就是一個 J - a(斜率)的關係圖。

知道微積分的朋友應該知道怎麼去找最小值,不就是找到 極小值的方法嗎?導數為0,切線水平。

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

公式

具體過程是假定一個a或者b,算出偏微分,然後對a或者b進行調整。具體調整的方法這裡不展開討論了。

同時考慮a和b的話,其實是找三維圖像的最低點,如下圖:

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

三維圖像

04 勤學要好問:為什麼損失函數里要用距離的平方而不是距離的絕對值?

大家有想過這個問題嗎?誤差是| 預測值_i - 實際值_i | ,那我取誤差絕對值的和的最小值不也可以稱為一個損失函數嘛。

千萬不要以為這個平方是隨隨便便來的。背後的道理真的我不願意講,因為公式太多。

誤差 = 預測值_i - 實際值_i

這個誤差是符合一定概率分佈的。看過我之前的文章介紹海量數據的中心極限定理的朋友,應該知道這個誤差 可以被假定為:

平均值 u = 0,方差為σ 的正態分佈。

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

正態分佈

那麼在已知正太分佈的情況下,每一個數據點都會對應一個誤差,而誤差出現的概率,準確的說是Likelihood是可以通過 正態分佈的函數求得的。

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

likelihood(概率)

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

所有數據點 誤差概率相加

當我們對上述函數取對數可得:

機器學習:線性迴歸簡單有效,但是千萬不要踩到雷區!

取對數

最大似然分析,不懂得看我之前的文章。我們要保證 L 最大,只要保證上式 右邊值最大。

式子右邊 第一項和第二項是定值,只要保證第三項最小就可以使 L最大。

由於 u = 0,只要 sum((誤差值_i)^2) 最小就可以啦!

這就是為什麼 損失函數 J要採用平方的數學解釋啦!

05 Python實現線性迴歸

Python真的是搭上了 人工智能和機器學習的大船,發展是真的好。

Python中的 sklearn 包是可以用來解決 線性迴歸的問題的。

  • from sklearn.linear_model import LinearRegression

首先我們要從sklearn.linear_model中引入 LinearRegression 這個函數;

  • 逃學博士 = LinearRegression(normalize=True)

LinearRegression 賦給變量名 逃學博士;

  • 逃學博士.fit(x, y)

這樣就可以做出線性迴歸啦!

簡單吧!

06 總結

對了,千萬不要認為線性迴歸簡單、好用,就可以亂用。

隨意使用會出笑話的。

比方說:中國人口肥胖比例 = 10% * 十年的次數

希望大家喜歡我的文章。

“逃學博士”:理工科直男一枚,在冰天雪地的加拿大攻讀工程博士。閒暇之餘分享點科學知識和學習乾貨。


分享到:


相關文章: