1. 機器學習眼中的線性回歸
左圖是原始建模數據,目的是用來尋找玩偶數量和成本的某種關係。右圖將數據可視化得到散點圖。
第一步 進行場景確定
第二步 定義損失函數
建模的目的:模型預測值與真實值之間的差距越小越好。下面有兩種定義損失函數的方法。帶「帽子」的變量代表預測值。不帶的表示觀測值。
由於以上兩點原因,所以採用右邊的函數作為損失函數。
實際上使用左面的函數定義損失函數也能得到一個線性模型,只是並不是我們常說的線性回歸模型而已。
所以:損失函數是機器學習模型的核心。(即使相同的模型形式,不同的損失函數對應著不同模型的效果)。
如果把模型看成是人工智慧,那麼損失函數就是它的三觀。
題外話:
由於模型的損失函數是由人定義的,那麼從倫理的角度來講,不能再將「技術無罪」作為作惡的藉口和理由,特別是在模型日益成為我們生活主宰的今天。
第三步 特徵提取
原始數據比較乾淨,所以並不需要進行數據清洗。在本題中玩偶個數可以作為特徵直接使用。
第四步 確定模型形式和參數估計
第五步 評估模型效果
對於回歸問題,常用的模型評估指標有兩個:
均方差(MSE):預測值與真實值的平均差距。L指的是上面定義的損失函數。
決定係數(R2):數據變化被模型解釋的比例。
第一個公式為成本變化幅度。即真實值與真實值平均值之間的差值的平方和。
第二個公式是未被模型所解釋的變化幅度。即真實值與預測值之間的差值的平方和。從建模的角度來講,我們希望該公式得到的值越小越好。
所以,決定係數的公式如下:結果越接近於1,模型的預測效果越好。
2. 統計眼中的線性回歸
2.1 模型的假設
在機器學習的角度,我們並不太關心 x 和 y 的數學關係是怎麼樣的。整個的建模過程是機械化的。我們只是關心能用什麼樣的公式能讓從 x 出發的預測值與真實值 y 之間的關係最小的可以了。
站在統計學的角度出發,我們試圖弄清楚變量 y 與 x 之間的數學關係。
比如 04/01 和 04/02 兩天的玩偶個數都是10,但前者成本為7.7,後者成本為9.87.這說明變量 y 似乎帶有某種隨機性。並且在散點圖中,我們同樣得到 x 與 y 似乎存在某種線性關係。
在上面公式的基礎上,進一步假設。其中假設的 第二點 和 第三點 可能與現實情況衝突。
根據這三個假設我們可以進一步來分析為什麼會存在 x 相同而 y 不同的情況。
首先假設模型的 a, b, σ(假設1:隨機擾動項服從的正態分布的方差)是已知的。這時候我們可以看到 y 是由 ax + b + 隨機值 構成,那麼就說明 y 本身就是一個隨機值。而且也可以很清楚的證明 yi是服從 期望為 10a+b 方差為 σ2的正態分布。所以,有 相同的玩偶個數,不同的成本 這種情況出現正是因為 成本分別是同一正態分布的兩次獨立觀測值。
所以,在統計學的眼裡,我們得到的變量值其實是一個隨機變量的觀測值,它並不是一個確定的值。因此,統計學希望通過這樣一個隨機變量的觀測值去挖掘真實的值是多少。
2.2 參數估計公式(最大似然估計法 Maximum Likelihood Estimation, MLE)
根據上面的模型假設,可以得到:
由於 y 是隨機變量,就可以定義參數的似然函數(Likelihood function):
這裡的似然函數 L 其實就是 y 的聯合條件概率。並且 yi 是相互獨立的,那麼就可以將似然函數 L 改寫成每一點概率的乘積的形式。這一點可以極大地方便後面的數學處理。
既然 y 是隨機變量,那麼模型參數估計的原則就是 y出現的概率達到最大。
這就是所謂的 最大似然估計法(Maximum Likelihood Estimation, MLE)。
2.3 最大似然估計法與機器學習模型參數估計公式的關係
在機器學習中,首先定義了損失函數,也就是模型真實值與預測值之間的差距。
在機器學習中,參數估計的原則就是使 損失函數達到最小值。
而在統計學中,我們從 y 是隨機變量這一點出發,參數估計的原則就是使 y出現的概率達到最大。
將統計學中的最大似然估計法翻譯成公式:
由於 L 這裡是乘積的形式:
那麼為了數學上好處理,引入自然對數函數,也就是以 e為底(2.71828...)的對數函數。對於它有以下性質:
同時,我們也注意到自然對數函數本身是一個增函數,也就是說 L 達到最大值的時候 ln(L) 也達到最大值,因此可以把尋找參數 a, b 的公式改寫為:
從之前已經證明 yi 服從正態分布,因此將 lnL 展開,得到如下的式子:
我們可以注意到 前面(一個紅線)是一個固定的值,後面(兩個紅線)才是變量。如果我們想要 lnL 達到最大值,那麼我們就要後面的變量達到最小值。所以最終的參數估計公式也就變成了:
這就與前面機器學習裡面的 線性回歸模型(最小二乘法OLS)的參數估計公式相同。
在之前機器學習的討論中,我們知道 只要定義一種不同的損失函數,就有一種新的線性回歸模型。那麼為什麼我們通常使用的就是 最小二乘法(OLS)線性回歸模型呢?
就是因為它使用的損失函數背後有極為強大的數學基礎。
由於 最大似然估計法 與 OLS線性回歸模型 的參數估計公式是相同的,所以它們得到的結果是一樣的。
2.4 置信區間
根據 2.3 的討論,我們有了模型參數估計值的公式:
根據模型參數估計公式,可以得到參數 a, b 的估計值。但是,使用不同數據訓練模型的時候,會得到不同的參數估計值。(這裡的不同的數據,指的是符合同一規律的數據)。
例如:我們採用 04/01,04/02,04/03 和 04/04,04/05,04/06 日期的數據分別訓練模型可得到兩個估計值,而且這兩個值是不相同的:
這是因為 模型參數的估計值只是一個隨機變量,具體數值依賴於使用的數據。而且數學上可以證明,參數估計值本身是隨機變量,並且服從正態分布。
數學上的證明較為繁瑣,所以這裡就採用一個實證的例子:
既然得到的估計值只是隨機變量的一次觀測值,那麼我們更關心這個估計值離真實值有多遠?
在統計學裡,解決方案就是 定義參數真實值的置信區間。
在上面的證明,我們可以得知估計值服從以真實值為期望的正態分布。參數的真實值就是 a 。我們假設這個正態分布的方差為σ2,那麼大部分估計值就會落在以 真實值a 為中心,2倍 σ 為半徑的區間裡面。
將其翻譯為數學公式,即為:
因此,可以定義參數 a 的 95% 的置信區間:
所以,95%的置信區間表示:
重複100次的模型訓練,並按公式得到置信區間,那麼有95次,參數 a 的真實值將落在這個區間裡。
也可以 「通俗地」 理解為參數 a 的大概取值範圍。
後面一句話其實不太嚴謹,因為一開始 假設 參數 a 的真實值是一個確定的值,但是現在又說大概的範圍,這又將參數 a 作為一個隨機值進行處理,這前後是矛盾的。不過,依然可以這樣通俗的進行理解。
置信區間就是控制模型結果隨機性的一個工具。也就是說我們得到的參數的估計值其實是一個隨機變量。它並不等於真實值,但是我們可以用置信區間去控制這個真實值大概所在的區間範圍是多少。
2.5 假設檢驗
除了置信區間外,還可以使用假設檢驗來得到更有把握的結果。
具體來說,我們剛剛得到了 a 的估計值,但是我們不知道 a 的真實值是多少。那麼我們可以做一個假設,比如我們假設 a = 0 。那麼根據這個假設,以及 a 的估計值服從正態分布,那麼我們可以得到在 a = 0 的情況下,也就是在這個假設成立的條件下,估計值大致分布的區間也就是 0-2σ 到 0+2σ。
這時,我們得到模型估計值是 0.98 。它沒有落在大致分布的區間內,這是概率很小的事情。那麼在這個情況下,我們就可以拒絕之前的假設 a = 0。 因為在這個假設成立的條件下,幾乎不可能的事情發生了。
換個角度來看,使用剛剛定義的置信區間,我們得到 0 並沒有在置信區間內,根據這個我們也可以拒絕 a = 0 這樣的一個假設。
總結一下:
1. 對於單個參數的假設檢驗與置信區間比較類似,二者相通。
2. 也可以對多個參數做組合的假設檢驗。
3. 模型陷阱(過擬合與模型幻覺)
3.1 模型陷阱概述
在現實生活中,搭建模型主要有兩種用途。
1. 正向運用:對未知情況做預測。(也就是知道 x1, x2, x3.....對 y 值進行預測)
要求準確度很高,得到的 y 越接近真實值越好。
易受到過度擬合幹擾。
2. 反向運用:解釋數據之間的聯動效應。(也就是目標值 y 與什麼變量有關)
數據驅動的本質。不是特別關心模型的準確性,而是關心模型的可靠性。
易受到模型幻覺幹擾。(也就是誤以為某個 x 與最終值 y 是有關係的)
過度擬合 和 模型幻覺 統稱為 模型陷阱。
3.2 過度擬合
同樣以 y=x 為真實的模型結果為例。隨著模型更加複雜,均方差和決定係數確實是向更好的方向進行發展。但是實際上我們知道模型就是最簡單的 y=x 線性模型。這裡就是一個悖論,我們使用評估模型的指標並沒有挑選出更真實的模型,這就是所謂的過度擬合。
對於過度擬合來說
1. 對於已知數據,模型越複雜 「效果越好」。
這裡有一個既當運動員又當裁判員的問題。歷史數據我們用來搭建模型,但也使用它來對模型的效果進行評估,這是導致這個問題的原因。
2. 模型的擴展性非常差。
如果我們使用後面三幅圖的模型進行預測,那麼結果是非常不準確的。
解決方法分為兩類:
1. 數據層面
在現實生活中,模型的使用周期如下圖
由於我們的目的是為了預測未知數據,所以我們可以把歷史數據集分為兩份。一份是訓練集,一份是測試集。首先使用訓練集估計模型的參數,然後採用測試集評估模型效果。
通過這種辦法,就可以把部分歷史數據當成了未知數據。
2. 模型層面
模型層面的解決方法:奧卡姆剃刀原則。
對於訓練集來說,通常模型越複雜,結果的誤差也就越小(如下圖 藍線)。但對於測試集來說,當模型太複雜通常會遇到 過度擬合 的現象,當模型太簡單會遇到 欠擬合 的現象,這兩種現象誤差都會很大。
我們的目的是選擇 剛剛好的模型複雜程度使得在測試集上的誤差達到最小。
但在現實中,最佳選擇是非常難實現的。這時候有一個很好的解決辦法,就是奧卡姆剃刀原則。
Occam's Razor: 如無必要,切勿假定繁多。
這句話的意思是,如果兩個模型對於未知數據的預測結果差不多的時候,應該選擇更加簡單的那個模型。
3.3 機器學習對於模型幻覺的解決方法(懲罰項 L1,L2範數及網格搜尋)
在現實中,控制模型複雜程度的方法主要有兩種:
1. 模型本身的複雜度。(比如 線性回歸 比 神經網絡 更簡單)。
2. 模型使用的特徵,包括個數以及特徵的複雜度。( x 的個數)
第二種方法實現起來更加容易,但是會引起 模型幻覺。
模型幻覺 指 不相關的特徵 被加入到模型裡,且被認為與預測結果有相關性。
3.3.1 懲罰項
回顧一下使用的數據,x 指的是玩偶個數,y 指的是生產成本。他們之間的關係是 y = x + 一個隨機變量
這時我們引入一個不相關的變量 z,但是這裡假設我們不知道它是無關的。這時的方程就變成了
y = ax + bz + c
但是其實在這個模型裡參數 b 和 c的真實值都為 0 。
根據之前的討論,可以定義 y = ax + bz + c 的損失函數。在 損失函數L 中我們希望 讓真實值等於 0 的 b,c 儘可能的靠近 0 。
解決方案就是 加入懲罰項 。加入懲罰項後,a, b, c 的值越遠離 0 ,損失函數 L 的值也就越大。這就使得模型的參數儘可能的靠近 0 。從另外一個角度來說,如果 b 的估計值為 0 ,這相當於在模型裡沒有使用變量 z 通過這種方式,自動地限制了模型的複雜程度。在理想情況下,無論參數 b 的值是多少,都不會影響原損失函數的取值,因此這樣的一個公式會使不相關的 b 和 c 靠近 0 , 而不是讓 a 靠近 0 。
其中 α 被稱為懲罰力度。
上面的懲罰項被稱為L1懲罰項(L1 範數),如果加入了 L1懲罰項,整個模型就被稱為 Lasso回歸。
下面的懲罰項被稱為 L2懲罰項(L2 範數),如果加入了 L2懲罰項,整個模型就被稱為 Ridge回歸。
3.3.2 網格搜尋
首先,看看增加懲罰項後,模型的結果有什麼變化。我們可以看出懲罰力度 α 越大,b 和 c 的估計值越靠近於 0 ,a 的值就越靠近於 1 。三者越來越靠近它的真實值。但是這不意味著 懲罰力度 α 總是越大越好。那該如何選擇 懲罰力度 α 呢?
這裡需要注意的是,對於 a, b, c 是有數學公式來求最優值的。但是 懲罰力度 α 是沒有的。能想到的辦法就只有 網格搜尋,也就是一種遍歷的辦法。給定一些 α 的備選值分別去訓練模型。最後選擇技術指標最好的 α 作為最終的 α 。
總結一下,機器學習對於模型幻覺的解決辦法。這裡還有一個問題,如果模型有超參數,那麼測試集也出現了既當裁判員又當運動員的問題。即超參數選擇和測試指標都用了測試集。這時候就將數據分成三個集合 訓練集,驗證集,測試集。這樣就解決了這個問題。
a,b,c 是模型的參數,懲罰力度 α 是模型的超參數。
3.4 統計分析的解決方法(假設檢驗)
模型的式子是 y = ax + bz + c,在圖片中我們可以得到b,c的估計值都不等於0,但是根據後面的結果,我們可以得到 b,c都不顯著。換句話說,並不能拒絕 b,c 的真實值等於0的假設。換個角度看,在 b,c 的95%置信區間內都包含了0,所以依然並不能拒絕 b,c 的真實值等於0的假設。所以才實際操作中,如果模型的參數不顯著,就可以將其排除。因此 將變量 z 排除出模型,重新建模。參數 c 被稱為截距項,是一個特殊的參數,這裡並不排除。
3.5 機器學習和統計解決模型幻覺的方法比較
機器學習雖然使無關變量前面的係數儘可能接近於 0 ,但是仍未能完全排除。而統計分析可以將無關的變量完全排除出模型。但這就說明統計分析需要更多的人為幹預,是否排除無關變量是一個人為的選擇,隨意性較大。(具體是多少的顯著度是沒辦法量化的,比如 顯著度5%還是1% 就認為不顯著)。
目的在於預測,可以採用機器學習方法。目的在於分析 y 和 x 之間的關係,儘可能使用統計方法。
4. 模型的生命周期
模型的一生分為兩個階段。一是模型的訓練(下圖虛線以下部分),二是模型的使用(下圖虛線以上部分)。
連接這兩個階段的IT工具就是模型的保存和讀取。
如果訓練模型和使用模型都是 Python 程序,則可以使用 pickle 來實現模型的持久化(保存和讀取)。
pickle 是 Python 的一個標準模塊,它可以將 Python 對象保存為文件,也可以從保存文件裡還原相應的 Python 對象。
如果訓練模型和使用模型分別使用兩種不同的語言,則可以使用 PMML 來實現模型在不同程式語言之間的保存和讀取。
PMML 是一種描述預測模型的標準,它與使用的程式語言無關。
PMML 主要記錄三類信息:模型類別、模型變量、模型參數。