終於有人把線性迴歸講明白了!

IT公社
數據分析不是個事
Sep 18, 2021

作者:莫凡

公眾號:大數據DT

線性迴歸:“鋼鐵直男”解決迴歸問題的正確方法

本文將介紹機器學習演算法,我們選擇從線性迴歸(Linear Regression)開始。

許多機器學習教材習慣一上來就深入演算法的細節,這當然也有好處,但學習一門之前不大接觸的新技術時,我更傾向於遵循學習思維三部曲的節奏:是什麼(What)、為什麼(Why)和怎麼做(How)。如果我們之前未接觸過機器學習,那麼開始學習時首先問的當然是“機器學習是什麼”。

所以我們選擇從線性迴歸演算法開始。線性迴歸演算法不但結構簡單,原理好懂,同時又包含了機器學習演算法的典型運作特徵,方便你鳥瞰機器學習演算法的執行全貌,以及仔細觀察每個組成構件的細節情況。如果此前你並不瞭解機器學習,不妨將線性迴歸當作機器學習演算法中的入門任務。

學習新技術一直存在這樣的矛盾:技術太複雜則擔心學不會,技術太簡單又擔心是不是已經過時了。畢竟我們這個時代的計算機科學正在一日千里地飛速發展著,計算機類教材裡的許多技術可能已經被新興技術取代而退出了歷史舞臺,只是出於知識結構的完整性等考慮才像恐龍骨架一樣在教材裡保留著一席之地。

但請放心,線性迴歸完全不是這麼一回事。線性迴歸是一套在當下仍然具有很高實戰價值的演算法,在很多現實場景中仍然發揮著不可替代的作用,不但“麻雀雖小,五臟俱全”,適合介紹剖析,而且還像麻雀一樣,蹦蹦跳跳地活躍在機器學習應用的第一線。

想要說清楚線性迴歸,先回到“線性迴歸”這個嚇人的名字上。在通往機器學習的路上有著各色各樣的攔路虎,首先跳出來嚇你一哆嗦的肯定是那些古古怪怪的術語,“線性迴歸”就是裡面的傑出代表。

初次接觸“線性迴歸”,可能都不知道該怎麼斷句,一不小心就要被嚇得乾脆打退堂鼓。不要怕它,首先我們將這個看似無從下手的詞分成“線性”和“迴歸”兩塊,可以認為這代表了兩個知識領域:前者是一類模型,叫“線性模型”;後者是一類問題,叫“迴歸問題”。這樣“線性迴歸”這個詞可以理解成一句話,即用線性模型來解決迴歸問題。

線性模型和迴歸問題湊成一對並非是劇本一開始就安排好的。迴歸問題是機器學習中非常經典的一類問題,換句話說,就是有許許多多的方法模型都會用於解決迴歸問題。但除了迴歸問題,這些方法模型也可以解決其他問題,如分類問題。

總而言之,問題和模型是多對多的關係,問題提出要求,模型給予解決,畢竟演算法和人生一樣,沒有劇本只有驚喜,遇上了又能對得上,那才好湊成一對,所以當大家用線性模型解決迴歸問題時發現還挺順手並經常用,後來乾脆起了“線性迴歸”這個名字。

介紹完了名字,接下來就是“正菜”。大多數教材最習慣的做法是一上來就丟擲各種眼花繚亂的公式,讓人深深陷入術語、符號和推導等細節之中,就像是正要開始學游泳,不知就裡便被扔進了大海,從此拖著長長的心理陰影。

細節很重要,但理念更重要,剛接觸機器學習誰都只是一張白紙,要在上面大展宏圖,首先得確定基本主題,然後勾勒整體脈絡,最後才是新增細節。這也正是本書介紹機器學習的方式。

機器學習是問題導向的,正因有了問題才會設計算法,這是機器學習最主要的脈絡。本文要解決的問題是迴歸問題,用的方法是線性迴歸演算法。如果也將線性迴歸演算法比作一架機器,那線性方程和偏差度量就是組成這架機器的兩大構件,它們在權值更新這套機制下齊心協力地運轉,最終解決迴歸問題。

這也是本文的要點,請格外加以關注:

迴歸問題
線性方程
偏差度量
權值更新

用於預測未來的迴歸問題

所以如果你擔心接下來將要看到什麼深奧的術語則大可不必,機器學習並非憑空而生的學科,這裡所說的迴歸問題正是從統計學那裡借來的救兵。

兩百年前,與達爾文同時代的統計學家高爾頓在研究父代與子代的身高關係時,發現一種“趨中效應”:如果父代身高高於平均值,則子代具有更高機率比他父親要矮,簡單來說就是身高迴歸平均值。“迴歸”一詞也由此而來。

在迴歸的世界裡,萬物的發展軌跡都不是一條單調向上走或向下走的直線,而是循著均值來回波動,一時會墜入低谷,但也會迎來春暖花開,而一時春風得意,也早晚會遇到坎坷挫折,峰迴路轉,否極泰來,從這個角度看,迴歸與其說是一個統計學問題,不如說更像是一個哲學問題。

那麼什麼是迴歸問題呢?迴歸問題的具體例子很多,簡單來說各個資料點都沿著一條主軸來回波動的問題都算是迴歸問題。

迴歸問題中有許多非常接地氣的問題,譬如根據歷史氣象記錄預測明天的溫度、根據歷史行情預測明天股票的走勢、根據歷史記錄預測某篇文章的點選率等都是迴歸問題。正因為迴歸問題充滿了濃厚的生活氣息,也就成為一類十分常見的機器學習問題。

當然,迴歸問題作為一種型別,有著自己獨特的結構特徵,在上面描述什麼是迴歸問題時,我刻意反覆使用“歷史”和“預測”這兩個詞,原因正是記錄歷史值和預測未來值是迴歸問題的兩個代表性特徵。

在機器學習中,迴歸問題和分類問題都同屬有監督學習,在資料形式上也都十分相似,那麼怎麼區分一個問題究竟是迴歸問題還是分類問題呢?

迴歸問題和分類問題最大的區別在於預測結果

根據預測值型別的不同,預測結果可以分為兩種,一種是連續的,另一種是離散的,結果是連續的就是預測問題。

這裡的“連續”不是一個簡單的形容詞,而是有著嚴格的數學定義。不過額外引入太多複雜的概念反而會偏離主線,好在“連續”是一個可以感受的概念,最直接的例子就是時間,時間當然是連續的,連續型數值在程式設計時通常用int和float型別來表示,包括線性連續和非線性連續兩種,如圖3–1所示。

▲圖3–1 連續型資料

相比之下,離散型數值的最大特徵是缺乏中間過渡值,所以總會出現“階躍”的現象,譬如“是”和“否”,通常用bool型別來表示,如圖3–2所示。

▲圖3–2 離散型資料

怎樣預測未來

迴歸問題是一類預測連續值的問題,而能滿足這樣要求的數學模型稱作迴歸模型,我們即將介紹的線性迴歸就是迴歸模型中的一種。許多教材講到迴歸模型,總是匆匆進入具體的演算法當中,而往往忽略替初學者解答一個問題:為什麼迴歸模型能夠進行預測?這是一個似乎理所當然,但其實並沒有那麼不喻自明的問題。

許多人對“預測”的第一印象也許是傳說中的一個故事,有兩位高人結伴出行,晚上歇於一處破廟,甲對乙說,“睡覺別靠牆,我剛掐指一算,寅時牆會倒。”乙不屑一顧地擺擺手,“我剛才也掐指一算,牆是倒向右邊,我靠左睡可保無憂。”

故事裡的高人也是要看書的,不過多半看的是《奇門遁甲》,而不太可能是《機器學習》。奇門遁甲不在本書的討論範圍,那麼,機器學習的迴歸模型能不能實現精準的預測呢?

也許可以,不過要有條件:需要有充足的歷史資料。資料的重要性怎麼強調都不為過,如果將機器學習演算法比作一架機器,那麼資料就是驅動這架機器的燃料,沒有燃料驅動,機器設計得再精巧也只能是擺設。

我們不是要預測未來嗎,為什麼反而說歷史資料這麼重要呢?這個問題涉及哲學,可以追溯到世界是萬事萬物相互聯絡的統一整體,或者簡單一點,不妨把預測當作一次偵探小說中的推理過程,犯罪手法總是要留下痕跡的,只要你找到相關聯的線索,就能夠推理出最終的結果。

當然,預測難就難在待預測物件與什麼相關是未知的,不過好在其中的關聯關係就藏在歷史資料之中,你要做的就是透過機器學習演算法把它挖掘出來。機器學習演算法並不發明關係,只是關聯關係的搬運工。有一種尚存爭議的觀點甚至說得更直白:機器學習遠不是什麼欲說還休的神秘技術,從數學的角度看就是擬合,對輸入資料點的擬合。

機器學習實現預測的流程

機器學習演算法究竟有什麼魔力,竟然能夠預測未來?不妨就以前面兩個高人的故事為例,用科學觀點來研究牆體坍塌的問題。牆體坍塌可能由許多偶然因素導致,我們都不是土木專家,不妨憑感覺隨手列出幾條可能導致牆坍塌的因素:

1.譬如可能與砌牆的材質有關,土坯牆總比水泥牆容易垮塌;
2.可能與使用時間的長短有關;
3.可能與承建商有關,喜歡偷工減料的工程隊容易出“豆腐渣工程”;
4.還有一些外部環境因素,譬如整天風吹雨淋的牆容易垮塌;
5.最後就是牆體坍塌之前總會有一些早期跡象,譬如已經出現很多裂縫等。

上面所列因素有三種情況:與坍塌密切相關,與坍塌有點關係,以及與坍塌毫無瓜葛。如果人工完成預測任務,當然最重要的工作就是找出哪些是密切相關的,放在第一位;哪些是有點關係的,放在參考位置;哪些毫無瓜葛,統統刪掉。

可是我們又怎麼知道哪些因素有哪些關係呢?這時我們就可以製作一張調查表,把砌牆用的什麼材料、已經用了多久、出現了多少條裂縫等情況一一填進去,這就是前面所說的資料集中每一條樣本資料的維度。就像商家很喜歡透過網上問卷來了解使用者偏好一樣,我們也利用調查表來了解牆體坍塌有什麼“偏好”。

調查表大概形式如下表所示。

最後一欄是“坍塌機率”,這是我們最關心的,也是有監督學習所必需的。這些已知的坍塌機率以及相關的維度資料將為未知機率的預測提供重要幫助。

最後也是最關鍵的一步,是找出各個維度和坍塌之間的機率,而這個步驟將由模型自行完成。

我們要做的只是將長長的歷史資料輸入迴歸模型,迴歸模型就會透過統計方法尋找牆體坍塌的關聯關係,看看使用時間的長短和承建商的選擇誰更重要,相關術語叫作訓練模型,從數學的角度看,這個過程就是透過調節模型引數從而擬合數據。怎樣調節引數來擬合數據是每一款機器學習模型都需要思考的重要問題。

模型訓練完畢後,再把當前要預測的牆體情況按資料維度依次填好,迴歸模型就能告訴我們當前牆體坍塌機率的預測結果了。流程如圖3–3所示。

▲圖3–3 迴歸模型訓練示意圖

可以看出,迴歸模型就是預測的關鍵,我們透過給模型“喂”資料來訓練它,最終讓它具備了預測的能力。也許你對“模型”這個詞感到陌生又好奇,不知道該在腦海裡給它分配一個什麼樣的形象。而圖3–3的“模型”是一個大大的四方盒子,塞進資料就能吐出預測結果,像是奇幻故事中巫師手中具有神奇魔力的水晶球。

不用著急,“模型”這個詞將貫穿我們對機器學習的整個巡禮,就像慶典遊行裡的花車正等著我們逐一觀賞呢。接下來迎面走來的就是第一款模型 — — 線性模型。

線性方程的“直男”本性

也許你對名為“模型”的大盒子充滿期待,同時又擔心會冒出一大堆數學符號,所以不敢馬上掀開一窺究竟。不過,線性模型反倒更像是一個過度包裝的大禮盒,大大的盒子開啟一看,裡面孤零零隻有一樣東西:線性方程。第一次接觸時各種名詞很容易把人繞糊塗,不急,我們先把名詞之間的關係捋一捋。

前面在介紹機器學習的基本原理時,提到“假設函式”這個術語,假設函式是一類函式,所起的作用就是預測,這裡的線性方程就是線性迴歸模型的假設函式。

別看名字挺“高冷”,其實特別簡單。“線性”就是“像直線那樣”,譬如線性增長就是像直線那樣增長。我們知道,直線是最簡單的幾何圖形,而線性方程說直白一點,就是能畫出直線的一種方程。如果方程有性格的話,那麼線性方程一定就是“直男”的典型代表。

直線方程最大的特點就是“耿直”,由始至終都是直來直去,函式影象如圖3–4所示。

▲圖3–4 線性函式的函式影象

這樣看好像也沒什麼,但對比一下同樣常見的以2為底數的對數函式(見圖3–5a)和指數函式(見圖3–5b)就能明顯看出,其他函式多多少少都要帶一點弧度,這是變化不均勻所導致的。相比之下,直線方程開始是什麼樣子則始終是什麼樣子。

▲圖3–5 非線性函式的函式影象

直線方程通常寫作y=kx+b,k稱為斜率,b稱為截距,這兩個引數可以看作兩枚重要的旋鈕,直接控制直線進行“旋轉”和“平移”的動作。具體來說,透過調整斜率,可以改變直線的角度。

在圖3–6的四幅圖中,直線均具有相同的截距,黑實線斜率均為2,但右上、左下、右下的三幅圖中灰線斜率分別為1、1/2和0,對比黑實線可以看出,透過改變斜率可以使直線出現“旋轉”的動作效果。

▲圖3–6 4條斜率不同的線性函式影象對比

直線還有另一種調節方法。透過調整截距b,可以實現直線的上下平移。如圖3–7所示,這三條平行的直線具有相同的斜率,但截距相差1,可以看到直線出現了上下平移的動作效果。

“旋轉”和“平移”就是直線的全部看家本領了,這正體現了線性方程簡單直率的“直男”本性。

準確來說,線性方程和直線方程還是存在一點微小差別的。直線是二維平面圖形,而線性所在的空間則可能是多維的。不過,無論是在二維平面還是在多維空間,直線所能做的也就是“旋轉”和“平移”兩套動作,線性模型想要擬合能夠調節的引數,主要也就只有這兩個。

▲圖3–7 三條截距相差1的線性函式影象對比

在機器學習中,斜率k通常用字母w表示,是權值(weight)的首字母。透過調整w和b的值就能控制直線在多維空間中進行旋轉和平移,扮演的角色很像老式收音機上的旋鈕,透過旋轉旋鈕就可能收聽到想要的電臺。

這個透過調整權值來達到目的的過程叫作權值調整或者權值更新,對於線性模型而言,學習過程的主要工作就是權值調整,只要旋動旋鈕,合理搭配旋轉和平移這兩套簡單的動作,就能完成對輸入資料的擬合工作,從而解決迴歸問題。

關於調整權值的另一種解釋

在機器學習中,透過調整權值來完成學習,並最終進行預測的演算法很多,這也是一種非常常見的學習手段。對於為什麼調整權值能夠進行預測,實際上也有多種解釋,上面從幾何角度給出瞭解釋,此外還有代數角度的解釋。

以三個輸入維度A、B、C來預測P為例,我們的線性方程可以寫為:

F=W1*A+W2*B+W3*C

假設我們知道P的值其實就是與A的值有關,與B、C毫無關係,那麼,怎樣調整線性方程才可以根據輸入準確預測出P的值呢?

我們知道,線性方程的計算結果F是三個維度的加權和,想要使F與P最接近,只需要讓線性方程中B、C這兩個加項對結果影響最小即可。這個好辦,只要使這兩項的權值最小,也就是W2和W3的值為0就可以了。

這就是從代數角度來解釋為什麼調整權值能夠提高預測結果的準確性。這裡實際上體現了一種假設,就是待預測的結果與輸入的某個或某幾個維度相關,而調整權值的目的就是使得與預測結果相關度高的權值越高,確保相關維度的值對最終加權和的貢獻越大,反之權值越低,貢獻越小。

最簡單的迴歸問題 — — 線性迴歸問題

前面我們介紹了什麼是迴歸問題,也直觀感受了線性方程的“直男”本性,那麼在這一節將對為什麼模型能進行預測給出一個很直接的回答。當然,學術界對於這個問題的認識還未完全統一,這裡選擇沿用一種當前最主流的觀點。

直到目前為止,我們還不能全面地瞭解這個世界,但紛繁複雜的現實世界大體還是遵循著某種規律的,我們不妨叫作“神秘方程”。而我們在機器學習領域所做的,就是通過歷史資料訓練模型,希望能夠使我們的模型最大限度地去擬合“神秘方程” — — 一旦偷看了導演的劇本,還怕有什麼劇情不能預測嗎?

不過,也許你已經發現,這存在一個問題。

就拿線性模型來說吧,線性模型是用直線方程去擬合數據,但直線可是“鋼鐵直男”,它的動作也只有兩套而已啊!模型的能力是有上限的,能力跟不上,想最大限度地擬合也還是心有餘而力不足。

所以,選擇模型的關鍵不在於模型的複雜程度,而在於資料分佈。你也許會擔心,線性模型簡單好懂,這也是它為什麼特別適合用來做入門任務,但唯一的問題是它太簡單了,現實世界這麼複雜,它真的能夠解決問題嗎?

要知道尺有所短,寸有所長,迴歸問題是一個大類,其中有一類問題叫線性迴歸問題,遇到這種問題不用線性模型還真就不行。下面,我們就來看看線性迴歸是怎樣完成預測的。

利用線性迴歸進行預測的極速入門

線上性迴歸問題裡,所要預測的“神秘方程”當然也是線性方程。這類方程存在固有特徵,最明顯的就是資料集點沿線性分佈,所以用線性模型效果最好。也許你不敢相信,這個世界這麼複雜,真的有這麼簡單的“神秘方程”嗎?真的有,而且你肯定還見過,一起來回憶一下:

已知小明前年3歲,去年4歲,今年5歲,請問小明明年幾歲?

首先這無疑是個預測連續值的問題,明明白白是一個迴歸問題。迴歸關注的是幾個變數之間的相互變化關係,如果這種關係是線性的,那麼這就是一個線性迴歸問題,適合用線性模型解決。我們按照機器學習的習慣,把已知條件整理成資料集,這是一個三行兩列的矩陣:

[[2017,3],
[2018,4],
[2019,5]]

這是一個二維矩陣,如果畫出影象,兩個維度之間的線性關係就一目瞭然。這裡以年份為X軸、年齡為Y軸將記錄的資料畫出來,得到3個呈線性排列的資料點(見圖3–8a)。把這些點用線段連線起來,就能更清楚地看到這3個點排成了一條直線(見圖3–8b)。

這條直線寫成線性方程就是y=x-2014,即所謂的“假設函式”。線性迴歸的預測就依賴於這條方程,2019年剛剛過去,我們當然只能知道2019年之前的真實資料,但對於未來也就是小明在2019年之後的年齡,透過這條線性方程即可以預測得到。

譬如把“2020”作為x輸入,就能計算出對應的y值是“6”,也就得到了2020年小明將是6歲的預測結果。這個例子很簡單,但已經完整地展示了線性迴歸“預測魔力”背後的原理,線性迴歸的預測魔力還經常被運用在經濟和金融等場景,聽起來更高階,不過就原理來說,也只是這個簡單例子的延伸和拓展。

▲圖3–8 呈線性關係的資料集點分佈(a),如果連起來會出現一條直線(b)

關於作者:莫凡,新技術深度愛好者,曾經從事資訊保安前沿技術跟蹤研究和資料分析工作,在各類資訊保安類技術期刊發表文章五十餘篇,現轉為投身高階知識“白菜化”專案,希望能讓將更多聽起來高大上的名詞沾一沾“人間煙火”,成為日常生活中真正用得上的知識。

本文摘編自《機器學習演算法的數學解析與Python實現》,經出版方授權釋出。

編輯:於騰凱
校對:龔力

--

--