線性迴歸演算法模型與線性分類演算法模型聯絡與區別初探

Andrew.Hann發表於2017-08-28

1. 線性演算法模型

0x1:線性迴歸和線性分類中的“線性”指的是什麼

線性(linear),指量與量之間按比例、成直線的關係,在數學上可以理解為一階導數為常數的函式;
非線性(non-linear)則指不按比例、不成直線的關係,一階導數不為常數

0x2:從輸入輸出角度看"迴歸"和"分類"的區別

線性分類問題和線性迴歸問題都要根據訓練樣本訓練出一個實值函式g(x),g(x)也叫對映函式

1. 迴歸模型: 給定一個新的輸入特徵, 推斷它所對應的輸出y(連續值實值)是多少, 也就是使用y=g(x)來推斷任一輸入x所對應的輸出值。
注意: 如果我們將回歸模型(regression model)的連續輸出進行離散化,雖然看起來得到了有限個離散類別,但其本質還是迴歸模型,只是對輸出做了特殊處理

2. 分類模型: 給定一個新的輸入特徵, 推斷它所對應的類別(大多數情況是二分類如: +1, -1,也可以基於二分類擴充套件出多分類), 也就是使用y=sign(g(x))來推斷任一輸入x所對應的類別.
注意: 模型的輸出結果類別是有限的

0x3:典型線性迴歸和線性分類演算法

1. 典型線性迴歸演算法

1. Linear Regression: 輸出一個標量 wx+b,這個值是連續值,所以可以用來處理迴歸問題
2. SVR(Support Vector Regression):輸出 wx+b,即某個樣本點到分類面的距離,是連續值,所以是迴歸模型
3. Naive Bayes用於分類: 預測結果y是離散的類別,所以得到離散的 p(y|x),給定 x ,輸出每個類上的概率
4. 前饋神經網路(如 CNN 系列)用於迴歸: 最後一層有m個神經元,每個神經元輸出一個標量,m個神經元的輸出可以看做向量 v,然後全部連到一個輸出神經元上,則這個神經元輸出 wv+b,是一個連續值,可以處理迴歸問題,和 Linear Regression 思想一樣

2. 典型線性分類演算法

1. Logistic Regression(邏輯斯蒂迴歸):把 Linear Regression的 wx+b 通過 sigmoid 函式對映到(0,1)上,並劃分一個閾值,大於閾值的分為一類,小於等於分為另一類,可以用來處理二分類問題
2. SVM(Support Vector Machine): 把SVR得到的距離用 sign(·) 函式進行離散化處理,距離為正(在超平面一側)的樣本點是一類,為負的是另一類,所以是分類模型 
3. Naive Bayes用於分類: 對最大後驗預測結果p(y|x)求期望 ΣyP(y|x)(即得到概率密度),就得到連續值
4. 前饋神經網路(如 CNN 系列)用於分類: m個神經元最後連線到 N 個神經元,就有 N 組w值不同的 wv+b,同理可以歸一化(比如用 softmax )變成 N個類上的概率,然後取概率最大的那一類作為N分類的預測結果

3. 感知機屬於線性迴歸還是線性分類演算法?

這裡我們來思考一下這個問題,感知機使用的是超分介面是線性迴歸模型(是一個線性函式),類似下圖

然後感知機使用的不同softmax進行區間壓縮,而是直接用了“y是否大於0”作為判別法則,把結果 y > 0和y < 0對應的輸入 x 分成兩類。我個人更願意將其理解為簡化版本的邏輯斯蒂迴歸,因為從圖上就可以看到,感知機對區別度較大的樣本分類效果很好,但是對區別度較小的(靠近0)的中間那塊,這樣一刀切的方式就很容易造成誤報和漏報

但其本質還是:基於線性迴歸的結果,進行離散化得到有限個分類結果。和上面討論的典型線性分類演算法核心思想是一樣的

0x4:迴歸和分類各自的應用場景

1. 迴歸問題的應用場景 - 迴歸是對真實值的一種"逼近預測"
    1) 迴歸問題通常是用來預測一個值,如預測房價、未來的天氣情況等等
    2) 例如一個產品的實際價格為500元,通過迴歸分析預測值為499元,我們認為這是一個比較好的迴歸分析
    3) 預測明天的氣溫是多少度,這是一個迴歸任務

2. 分類問題的應用場景 - 分類並沒有逼近的概念,最終正確結果只有一個,錯誤的就是錯誤的,不會有相近的概念
    1) 分類問題是用於將事物打上一個標籤,通常結果為離散值
    2) 例如判斷一幅圖片上的動物是一隻貓還是一隻狗)
    3) 預測明天是陰、晴還是雨,就是一個分類任務,但是很容易理解

總體來說,迴歸模型對精度要求更低,它允許模型包含一定的誤差,只要不影整體擬合結果即可

Relevant Link:

http://blog.csdn.net/caroline_wendy/article/details/13294893
https://my.oschina.net/zzw922cn/blog/544221?p=1
http://www.jianshu.com/p/d6f206c869ed
http://zh.numberempire.com/derivativecalculator.php

 

2. 線性迴歸模型

迴歸模型適合用在"值預測"的場景中,這裡的場景就非常靈活了,根據資料集的不同,對映函式g(x)可以是線性函式,也可以是非線性函式。我們本文重點討論線性函式相關問題,關於非線性函式問題放在文章的最末尾簡單討論

0x1:線性相關性分析 - 線性迴歸的原理基礎

線性迴歸分析(Linear Regression Analysis)是確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法

線性迴歸分析法是以相關性原理為基礎的.相關性原理是預測學中的基本原理之一

在統計學中,線性迴歸(Linear regression)是利用稱為線性迴歸方程的最小二乘函式對一個或多個自變數和因變數之間的關係(這個關係就是要通過訓練樣本獲得的知識)進行建模的一種迴歸分析。這種函式是一個或多個(即多元線性迴歸可以看成是很多個一元線性迴歸的線性組合)稱為迴歸係數的模型引數的線性組合

例如:

一個地區的房價和麵積、地段、層數、周邊配套等因素組成。
這裡面積、地段、層數、周邊配套就是自變數;房價就是因變數。
線性迴歸要做的是就是找到一個數學公式能相對較完美地把所有自變數組合(加減乘除)起來,得到的結果和房價接近。這裡的所謂“數學公式”就是一個線性模型

0x2:從一元線性迴歸說起

在迴歸分析中,只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,這種迴歸分析稱為一元線性迴歸分析(其實也就是我們最熟悉的y=f(x)函式)。接下來我們用一個例子來思考如何去解決一個現實中常見的問題,在一開始我們先不涉及最小二乘法、損失函式、牛頓法、梯度下降這些概念,我們只是單純地去思考和解決問題

1. 問題描述

比方說有一個公司,每月的廣告費用和銷售額,如下表所示

如果我們把廣告費和銷售額畫在二維座標內,就能夠得到一個散點圖,如果想探索廣告費和銷售額的關係,就可以利用一元線性迴歸做出一條擬合直線

2. 這條線是怎麼畫出來的

很自然地,我們要思考一個問題:我們能不能畫出這樣一條直線,它能很好地解釋歷史上廣告費和銷售額的關係,並且還能幫助我們預測將來新的投入更多的廣告費,銷售額能到的具體數值。我們假設這樣一個一元線性方程:

Y = ax + b(a、b分別代表2個引數,是我們需要通過觀察資料計算得到的)

但是我們發現,這裡的a、b引數可能的取值空間是無限的,就算是如上圖所示的基本和點集擬合的直線,上下稍微微調一些也是無限的,那到底選哪一條是"相對最精確"的呢?(絕對精確是不可能的,誤差總是存在的)。很自然地,我們需要引入一個"標準"來評價模型引數空間中,哪一個是最好的,這就是經驗損失函式(注意區別於結構損失函式)

損失函式其 - 殘差平方和(又稱誤差平方和,SSE,Sum of Squaresfor Error)

直觀上,我們把我們預測的線性函式對每一個X的迴歸值(迴歸函式上的Y值)和真實值進行相減,為了防止負值的出現加上平方,得到一個平方和,最後對比所有的模型引數,誰的平方和最小,誰就是最佳的迴歸函式

然後利用平均數,把上面式子中每個括號裡的內容進一步化簡。例如

則:

於是

對於函式Q,分別對於a和b求偏導數,然後令偏導數等於0,就可以得到一個關於a和b的二元方程組,就可以求出a和b了。這個方法被稱為最小二乘法

進一步化簡,可以消掉2n,最後得到關於a,b的二元方程組為

最後得出a和b的求解公式:

有了這個公式,對於廣告費和銷售額的那個例子,我們就可以算出那條擬合直線具體是什麼,分別求出公式中的各種平均數,然後帶入即可,最後算出a=1.98,b=2.25

最終的迴歸擬合直線為Y=1.98X+2.25,利用迴歸直線可以做一些預測,比如如果投入廣告費2萬,那麼預計銷售額為6.2萬

線性迴歸問題中使用最小二乘法求解全域性最優解

上面提到的殘差平方和,就是最小二乘法用於評估當前損失函式的方法,我線上性迴歸中所談到的最小二乘是指俠義的最小二乘方法,它是一種閉式解的引數求解方法,通過對所有輸入樣本的殘差平方和公式求解最小誤差條件下的極值(導數為0),一步獲得全域性最優解

https://zhuanlan.zhihu.com/p/21852600
https://www.zhihu.com/question/24095027/answer/30698645
https://www.zhihu.com/question/37031188
https://www.zhihu.com/question/20822481

3. 為什麼對歷史資料擬合的看起來不是那麼準?

上面得到了迴歸擬合直線:Y=1.98X+2.25,但是我們仔細觀察一下會發現這條迴歸直線對歷史資料擬合的並不是那麼準,很多的點都沒有落在直線上。這是為什麼呢?對這個問題,存在幾個原因:
1. 異常噪音點:樣本本身可能存在一些“離群異常點”,這些點無法和模型完美的擬合
2. 非線性:這個是個嚴重的問題,意味著我們的建模就錯誤了,目標問題根本就不是一個線性關係問題,強行用線性模型擬合肯定是不行的
3. 異質性:導致因變數的自變數不在我們選取的特徵中,換句話說,即我們選擇的特徵不能很好的體現出線性型的特徵。對於銷售額這個例子來說,其實廣告費只是影響銷售額的其中一個比較重要的因素,可能還有經濟水平、產品質量、客戶服務水平等眾多難以說清的因素在影響最終的銷售額,那麼實際的銷售額就是眾多因素相互作用最終的結果,由於銷售額是波動的,迴歸線只表示廣告費一個變數的變化對於總銷售額的影響,所以必然會造成偏差,所以才會有實際值和迴歸值是有差異的,因此迴歸線只能解釋一部分影響。那麼實際值與迴歸值的差異,就是除了廣告費之外其他無數因素共同作用的結果,是不能用迴歸線來解釋的 

這就反回來啟發我們,應該用一個更加切近真實情況的損失評估標準來評估我們的迴歸線,為了引入這個新的損失評估標準,我們先來引入一個新的誤差函式

SST(總偏差)=SSR(迴歸線可以解釋的偏差)+SSE(迴歸線不能解釋的偏差)

總偏差平方和(又稱總平方和,SST,Sum of Squaresfor Total):是每個因變數的實際值(給定點的所有Y)與因變數平均值(給定點的所有Y的平均)的差的平方和,即,反映了因變數取值的總體波動情況。實際上也就是方差

迴歸平方和(SSR,Sum of Squares forRegression):因變數的迴歸值(直線上的Y值)與其均值(給定點的Y值平均)的差的平方和,即,它是由於自變數x的變化引起的y的變化,反映了y的總偏差中由於x與y之間的線性關係引起的y的變化部分,是可以由迴歸直線來解釋的

殘差平方和(又稱誤差平方和,SSE,Sum of Squaresfor Error):因變數的各實際觀測值(給定點的Y值)與迴歸值(迴歸直線上的Y值)的差的平方和,它是除了x對y的線性影響之外的其他因素對y變化的作用,是不能由迴歸直線來解釋的

R^2=SSR/SST 或 R^2=1-SSE/SST, R^2的取值在0,1之間,越接近1說明擬合程度越好

可以看到,我們將SSR(迴歸線可以解釋的偏差)除以(歸一化)一個總偏差,以此來更加準確地評估我們的迴歸線對真實情況的擬合。 
1. 假如所有的點都在迴歸線上,說明SSE為0,則R^2=1,意味著Y的變化100%由X的變化引起,沒有其他因素會影響Y,迴歸線能夠完全解釋Y的變化
2. 如果R^2很低,說明X和Y之間可能不存線上性關係

還是回到最開始的廣告費和銷售額的例子,這個迴歸線的R^2為0.73,說明擬合程度還可以

引申思考:相關係數R:如何擬合程度差到一定程度會怎麼樣?說明了什麼?

繼續上面的例子,如果我們的資料集是下圖所示

不用做數學分析,從肉眼上我們也可以看出,這個迴歸線的擬合效果非常差,但似乎這個迴歸線也"盡力"了,它只能擬合到這種程度了(根據平方差損失函式)。為了定量說明這個問題,我們需要引入相關係數R

注意和上面說的判定係數R^2的區分理解,判定係數來判斷迴歸方程的擬合程度,表示擬合直線能多大程度上反映Y的波動。

在統計中還有一個類似的概念,叫做相關係數R(學名是皮爾遜相關係數,因為這不是唯一的一個相關係數,而是最常見最常用的一個),用來表示X和Y作為兩個隨機變數的線性相關程度,取值範圍為【-1,1】。

1. 當R=1,說明X和Y完全正相關,即可以用一條直線,把所有樣本點(x,y)都串起來,且斜率為正
2. 當R=-1,說明完全負相關,及可以用一條斜率為負的直線把所有點串起來
3. 如果在R=0,則說明X和Y沒有線性關係,注意,是沒有線性關係,說不定有其他關係(例如非線性關係)
這就告訴我們,如果遇到這種情況,即我們用線性迴歸發現無法很好地擬合我們的訓練樣本,這個時候其實是有兩種可能
1. 我們的特徵工程有問題,選錯了一個和目標值Y不相關或相關性很差的特徵X
2. 特徵X選對了,但是X和Y是非線性關係,強行用線性迴歸自然無法得到好的結果

我們在建模之前,就需要先對我們的業務場景進行充分的瞭解,根據實際業務場景中資料的規律選擇合適的擬合模型

Relevant Link:

http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py
http://www.jianshu.com/p/fcd220697182
http://studyai.site/2016/07/22/%E6%96%AF%E5%9D%A6%E7%A6%8F%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E7%A8%8B%20%E7%AC%AC%E4%B8%80%E5%91%A8%20(4)%E4%B8%80%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/
https://baike.baidu.com/item/%E4%B8%80%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E9%A2%84%E6%B5%8B%E6%B3%95

0x3:擴充套件到多元線性迴歸

將上面一元的例子推廣到多元的情況。多元線性迴歸模型(multivariable linear regression model )

在實際經濟問題中,一個變數往往受到多個變數的影響,有時幾個影響因素主次難以區分,或者有的因素雖屬次要,但也不能略去其作用。例如,家庭消費支出,除了受家庭可支配收入的影響外,還受諸如家庭所有的財富、物價水平、金融機構存款利息等多種因素的影響。在這種複雜問題的擬閤中,我們要用到多元線性函式

多元迴歸分析預測法,是指通過對兩個或兩個以上的自變數與一個因變數的相關分析,建立預測模型進行預測的方法。當自變數與因變數之間存線上性關係時,稱為多元線性迴歸分析

1. 多元線性模型數學公式

假定被解釋變數與多個解釋變數之間具有下面的線性關係(即滿足下面關於變數X的多元線性函式),則稱X和Y的關係組成了一個多元線性迴歸模型


其中被解釋變數解釋變數未知引數隨機誤差項。可以看到,多元線性函式其實是由很多個一元線性函式線性組合而成

對於組觀測值,其方程組形式為:

其矩陣形式為

=+

即:

其中

被解釋變數的觀測值向量解釋變數的觀測值矩陣總體迴歸引數向量隨機誤差項向量

總體迴歸方程表示為: 

2. 迴歸變數的選擇與逐步迴歸 - 建立多元線性迴歸模型前怎麼去做特徵工程 

有時候我們在建立多元線性模型進行預測的時候遇到效果不好,可能就會一味的增加X的個數,也許碰巧確實增加的X中有一些是和Y相關性較高的X特徵,所以擬合和預測效果提高了,我們誤以為做了正確的事情然後暗自高興,但其實可能浪費了大量的計算資源,其實只要增加其中幾個有限的特徵X就可以達到相同的效果

建立多元性迴歸模型時,為了保證迴歸模型具有優良的解釋能力和預測效果,應首先注意自變數的選擇,其準則是:

(1) 自變數對因變數必須有顯著的影響,並呈密切的線性相關(相關係數R值較大);
(2) 自變數與因變數之間的線性相關必須是真實的,而不是形式上的,這就要求我們在建模前對業務場景有充分的瞭解。這裡舉一個例子來說明,也許在訓練集中,天氣的情況和你這個月的收入正好呈現強正相關,但這也許只是樣本量不足帶來的一種假象,事實上是不符合真實規律的;
(3) 自變數之間應具有一定的互斥性,即自變數之間的相關程度不應高於自變數與因變數之因的相關程度,這條準則意思是特徵自變數之間最好不要存在太多的冗餘關係,當出現冗餘時可以考慮降維處理(例如PCA);
(4) 自變數應具有完整的統計資料,其預測值容易確定

在實際問題中,影響因變數Y的因素(自變數)很多,我們希望從中挑選出影響顯著的自變數來建立迴歸關係式,這就涉及到自變數選擇的問題。

在迴歸方程中若漏掉對Y影響顯著的自變數,那麼建立的迴歸式用於預測時將會產生較大的偏差。但迴歸式若包含的變數太多,且其中有些對Y影響不大,顯然這樣的迴歸式不僅使用不方便,而且反而會影響預測的精度。因而選擇合適的變數用於建立一個"最優"的迴歸方程是十分重要的問題。

選擇"最優"子集的變數(特徵)篩選法包括

1. 逐步迴歸法(Stepwise)
2. 向前引入法(Forward)
3. 向後剔除法(Backwad)

1. 向前引入法

向前引入法是從迴歸方程僅包括常數項開始,把自變數逐個引入迴歸方程。具體地說,先在m個自變數中選擇一個與因變數線性關係最密切的變數(利用X和Y的相關係數R),記為,然後在剩餘的m-1個自變數中,再選一個,使得聯合起來二元迴歸效果最好,第三步在剩下的m-2個自變數中選擇一個變數,使得聯合起來回歸效果最好,...如此下去,直至得到"最優"迴歸方程為止。

向前引入法中的終止條件為,給定顯著性水平,當某一個對將被引入變數的迴歸係數作顯著性檢查時,若p-value (即提高的幅度小於一定的閾值),則引入變數的過程結束,所得方程即為"最優"迴歸方程。

向前引入法有一個明顯的缺點,就是由於各自變數可能存在著相互關係,因此後續變數的選入可能會使前面已選入的自變數變得不重要。這樣最後得到的"最優"迴歸方程可包含一些對Y影響不大的自變數。即存在冗餘的可能

2. 向後剔除法

向後剔除法與向前引入法正好相反,首先將全部m個自變數引入迴歸方程,然後逐個剔除對因變數Y作用不顯著的自變數。具體地說,從迴歸式m個自變數中選擇一個對Y貢獻最小的自變數,比如,將它從迴歸方程中剔除;然後重新計算Y與剩下的m-1個自變數回歸方程,再剔除一個貢獻最小的自變數,比如,依次下去,直到得到"最優"迴歸方程為止。

向後剔除法中終止條件與向前引入法類似。即直到減小的幅度小於一定的閾值說明就收斂了

向後剔除法的缺點在於,前面剔除的變數有可能因以後變數的剔除,變為相對重要的變數,這樣最後得到的"最優"迴歸方程中有可能漏掉相對重要的變數。

3. 逐步迴歸法

向前引入法和向後剔除法的缺點原因已經清楚了,很自然地我們會想到找一種動態調和的方法來綜合使用這2種技術,逐步迴歸法就應運而生了,逐步迴歸法是上述兩個方法的綜合。向前引入中被選入的變數,將一直保留在方程中。向後剔除法中被剔除的變數,將一直排除在外。這兩種方程在某些情況下會得到不合理的結果。於是,可以考慮到,被選入的的變數,當它的作用在新變數引入後變得微不足道時,可以將它刪除;被剔除的變數,當它的作用在新變數引入情況下變得重要時,也可將它重新選入迴歸方程。這樣一種以向前引入法為主,變數可進可出的篩選變數方法,稱為逐步迴歸法
逐個引入自變數。每次引入對Y影響最顯著的自變數,並對方程中的老變數逐個進行檢驗,把變為不顯著的變數逐個從方程中剔除掉,最終得到的方程中既不漏掉對Y影響顯著的變數,又不包含對Y影響不顯著的變數

3. 根據訓練樣本(觀測資料)來推測出多元線性模式的引數 - 最大似然估計思想

多元線性迴歸模型包含多個解釋變數,多個解釋變數同時對被解釋變數發生作用,若要考察其中一個解釋變數對的影響就必須假設其它解釋變數保持不變來進行分析。因此多元線性迴歸模型中的迴歸係數為偏回歸係數,即反映了當模型中的其它變數不變時,其中一個解釋變數對因變數的均值的影響。

由於引數都是未知的,可以利用樣本觀測值對它們進行估計。若計算得到的引數估計值為,用引數估計值替代總體迴歸函式的未知引數,則得多元線性樣本回歸方程: .其中引數估計值樣本回歸值樣本擬合值樣本估計值

其矩陣表達形式為:

其中擬合值列向量樣本觀測矩陣引數估計值列向量

4. 多元線性模型下怎麼評估擬合程度的好壞?

1. 殘差平方估計

和一元線性迴歸一樣,在多元的情況下也可以使用最小二乘估計來得到擬合值和實際值的差距

觀測值與迴歸值的殘差為:

由最小二乘法可知從訓練樣本估計得到的引數估計值應使全部觀測值與迴歸值的殘差的平方和最小,即使


取得最小值。根據多元函式的極值原理,分別對求一階偏導,並令其等於零,即

化簡得下列方程組

 (3.3)

上述個方程稱為正規方程,其矩陣形式為


因為

為引數估計值向量

根據上式可得到正規方程組:

2. 可決係數R2

與一元線性迴歸中可決係數r2相對應,多元線性迴歸中也有多重可決係數r2,它是在因變數的總變化中,由迴歸方程解釋的變動(迴歸平方和)所佔的比重,R2越大,迴歸方各對樣本資料點擬合的程度越強,所有自變數與因變數的關係越密切。計算公式為:

R^2=\frac{\sum(\hat{y}-\bar{y})^2}{\sum(y-\bar{y})^2} =1-\frac{\sum(y-\hat{y})^2}{\sum(y-\bar{y})^2}

分母表示實際值和實際均值的殘差平方和,分子表示擬合值和實際均值的殘差平方和

3. 估計標準誤差

估計標準誤差,即因變數y的實際值與迴歸方程求出的估計值\hat{y}之間的標準誤差,估計標準誤差越小,迴歸方程擬合程度越好

S_y=\sqrt{\frac{\sum(y-\hat{y})^2}{n-k-1}}

其中,k為多元線性迴歸方程中的自變數的個數。除此之後還顯著性檢驗,F檢驗等,本質上都類似的,都是用來評估擬合值和真實值之間的差距程度,這裡就不一一列舉
注意多重共線性問題
多重共線性是指在多元線性迴歸方程中,自變數之間有較強的線性關係,這種關係若超過了因變數與自變數的線性關係,則迴歸模型的穩定性受到破壞,迴歸係數估計不準確。需要指出的是,在多元迴歸模型中,多重共線性的難以避免的,只要多重共線性不太嚴重就行了。判別多元線性迴歸方程是否存在嚴懲的多重共線性,可分別計算每兩個自變數之間的可決係數r2,若r2 > R2或接近於R2,則應設法降低多重線性的影響
降低多重共線性的辦法主要是轉換自變數的取值,如
1. 變絕對數為相對數或平均數
2. 或者更換其他的自變數 

Relevant Link:

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html 
https://zh.wikipedia.org/wiki/%E7%B7%9A%E6%80%A7%E5%9B%9E%E6%AD%B8
https://medium.com/towards-data-science/simple-and-multiple-linear-regression-in-python-c928425168f9https://baike.baidu.com/item/%E5%A4%9A%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E6%A8%A1%E5%9E%8B
http://www.cnblogs.com/dfcao/p/ng_ml_2.html
http://www.cnblogs.com/zgw21cn/archive/2008/12/24/1361287.html 
https://onlinecourses.science.psu.edu/stat501/node/311
http://wiki.mbalib.com/wiki/%E5%A4%9A%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E9%A2%84%E6%B5%8B

0x4:非線性迴歸

1. 非線性模型和線性模型的區別

非線性迴歸生成一個用於描述連續響應變數與一個或多個預測變數之間的非線性關係的方程,並預測新觀測值。注意:線性迴歸和非線性迴歸之間的根本差別,以及兩種分析的命名依據,在於可接受何種形式的模型函式

1. 線性迴歸要求線性引數: 這限制方程只能有一種基本形式。當模型中的各項之間是相加關係,並且每一項只包含一個與該項相乘的引數時,引數是線性的,即 y = βo + β1X1 + β2X2 + ... + βkXk
2. 而非線性迴歸則不要求,它既可以是線性引數也可以是非線性引數

除此之外,非線性迴歸使用不同於線性迴歸的過程來使殘差誤差平方和 (SSE) 最小化

2. 非線性迴歸數學模型

和線性迴歸模型一樣,在訓練之前需要先建立非線性迴歸的數學模型,模型代表了從實際場景中問題的數學抽象,更具體來說就是我們需要對我們要擬合/預測的問題有一個先驗的瞭解,這個瞭解包括

1. 我們可以抽象出的特徵有哪些
2. 特徵和待預測值的關係是怎樣的?線性地還是非線性的?如果是非線性的那曲線形狀大致是怎樣的?

換句話說,如果樣本資料足夠好,特徵足夠有效,規律本身就已經呼之欲出了,用什麼模型去擬合都查不了太多,效果都會是很好的

下表列舉了一些的非線性迴歸模型的示例模型語法。隨機選擇的模型不太可能很好地擬合資料。引數的適當起始值是必要的,有些模型還要求使用約束才能實現收斂性

名稱模型表示式
漸近迴歸 b1 + b2 * exp(b3 * x)
漸近迴歸 b1 – (b2 * (b3 ** x))
密度(D) (b1 + b2 * x) ** (–1 / b3)
Gauss b1 * (1 – b3 * exp(–b2 * x ** 2))
Gompertz b1 * exp(–b2 * exp(–b3 * x))
Johnson-Schumacher b1 * exp(–b2 / (x + b3))
對數修改 (b1 + b3 * x) ** b2
對數 Logistic b1 – ln(1 + b2 * exp(–b3 * x))
Metcherlich 的收益遞減規律 b1 + b2 * exp(–b3 * x)
Michaelis Menten b1 * x / (x + b2)
Morgan-Mercer-Florin (b1 * b2 + b3 * x ** b4) / (b2 + x ** b4)
Peal-Reed b1 / (1+ b2 * exp(–(b3 * x + b4 * x **2 + b5 * x ** 3)))
三次比 (b1 + b2 * x + b3 * x ** 2 + b4 * x ** 3) / (b5 * x ** 3)
四次比 (b1 + b2 * x + b3 * x ** 2) / (b4 * x ** 2)
Richards b1 / ((1 + b3 * exp(–b2 * x)) ** (1 / b4))
Verhulst b1 / (1 + b3 * exp(–b2 * x))
Von Bertalanffy (b1 ** (1 – b4) – b2 * exp(–b3 * x)) ** (1 / (1 – b4))
韋伯 b1 – b2 * exp(–b3 * x ** b4)
產量密度 (b1 + b2 * x + b3 * x ** 2) ** (–1)

在選定預期函式後,若變數間非線性關係式已知(多數未知),且難以用變數變換法將其線性化,則進行數值迭代的非線性迴歸分析

這裡需要注意的是,雖然理論上我們需要事先指定用於執行非線性迴歸的預期函式,設定了預期函式之後才能夠根據訓練集去訓練出模型引數,但在實際的業務場景問題建模過程中,我們遇到的最多的問題就是:

1. 要解決問題似乎太過複雜,導致肉眼或者先驗經驗無法給出判斷該用什麼預期函式建模
2. 可能需要付出很多精力才能確定可以為資料提供最佳擬合的函式。這通常需要額外的研究、專業領域知識和試錯分析。另外,對於非線性方程,在確定每個預測變數對響應的影響時可能不如線性方程那樣直觀

若實際問題的曲線型別不易確定時,由於任意曲線皆可由多項式來逼近,故常可用多項式迴歸來擬合曲線。但這樣就導致引數的解空間很大,也就要花費更多的時間去擬合樣本資料,深度神經網路DNN就是典型的例子

3. 非線性迴歸引數估計策略

非線性模型中的引數估計無法像線性模型中那樣直接求解一個closed form,本質上還是求導太複雜,因此在非線性模型中需要使用基於估計思想的方法進行逐步估計

非線性迴歸分析引數估計的方法也有多種,主要方法有

1. 非線性最小二乘估計(nonlinear least squares estimator, NLS):模型本身複雜無法一次得到全域性最優解,只能通過迭代的方法來逐步進行引數優化
2. 非線性最大似然估計(Nonlinear maximum likelihood estimator, NMLE)

4. 非線性迴歸引數估計迭代演算法介紹

實際上,非線性最小二乘估計和非線性極大似然估計都是非線性優化的問題,雖然策略方法不變,但是因為最小二乘涉及到求導極值方程,這線上性情況是下很容易的,但是到了非線性領域對高階方程求偏導就變得十分困難,有時候甚至無法完成。這意味著在非線性迴歸方程中,我們無法通過直接求導得到極值,所以非線性迴歸中常常使用"逐步逼近"的思想,在不斷地迭代中不斷逼近最優的模型引數

最速下降法

最速下降法(又稱梯度法,或Steepest Descent),是無約束最優化領域中最簡單的演算法,它屬於比較古老提出的一種演算法。但是,它的理念思想卻對之後提出的非線性迴歸模型的引數搜尋奠定了基礎,我們會發現在其他某些演算法中,也有最速下降法的“影子”

最速下降法只使用目標函式的一階導數資訊,從“梯度法”這個名字可以看出它的本意是取目標函式值“最快下降”的方向作為搜尋方向。於是問題來了:沿什麼方向,目標函式 f(x)的值下降最快呢?答案是沿負梯度方向  d =gk (即負一階導數方向),函式值下降最快。我們通過公式推導來說明一下該結論的原理

將目標函式在點處泰勒展開:

高階無窮小 o(α) 可忽略,由於我們定義了步長 α>0(即朝某個方向前進的一段距離),同時,只有當 時, f(x)<f(xk) (即函式值是下降的)。所以 dk和gk的方向至少需要是相反的,才能達到下降的目的
同時Cauchy-Schwartz不等式(柯西-許瓦茲不等式)可得:
當且僅當 dk=gk 時,等號成立,所以 dk =gk 時, 最小(<0), f(x) 下降量最大

所以 gk 是最快速下降方向

但是最速下降法並不如它名字裡說的是最速的,事實是,它只在區域性範圍內具有“最速”性質。對整體求解過程而言,它的下降非常緩慢。

dk = -gk本質上意味著GD不斷在走90度折角的Z字型下降,所以下降過程是不斷來回折的,並不快

最速下降法(梯度法)衍生改進 - 批量梯度下降法(Batch Gradient Descent,BGD)

BGD顧名思義,是一次使用整批m個樣本參與計算loss function

(1)將J(theta)對theta求偏導,得到每個theta對應的的梯度,m代表樣本個數:

(2)由於是要最小化風險函式,所以按每個引數theta的梯度負方向,來更新每個theta:

(3)從上面公式可以注意到每更新一步,都要用到樣本的所有的資料,如果m很大,那麼可想而知這種方法的迭代速度會相當的慢。對於批量梯度下降法,樣本個數m,x為n維向量,一次迭代需要把m個樣本全部帶入計算,

迭代一次計算量為m*n2

批量梯度下降法改進 - 隨機梯度下降(Stochastic Gradient Descent,SGD)

BGD的缺點是一次用到了整批樣本參與運算,然而我們知道冗餘特性在很多資料集中都是廣泛存在的,即一個樣本集中存在部分的樣本在各個維度上的特徵是類似的,對於這種情況,

即使我們不使用全部的樣本集參與運算也不會損失太多精確度。隨機梯度下降正是藉助"隨機思想"從完整的樣本集中取樣一個相對較小批次的子資料集作為本次loss function的運算輸入,

在降低m的前提下力求儘量少的損失精確度,兩者的關係可以這樣理解:隨機梯度下降方法以損失很小的一部分精確度和增加一定數量的迭代次數為代價,換取了總體的優化效率的提升。增加的迭代次數遠遠小於樣本的數量

但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次迭代都向著整體最優化方向

高斯 - 牛頓法

牛頓法是一種在實數域和複數域上近似求解方程的方法。方法使用函式f(x)的泰勒級數的前面幾項來尋找方程f(x) = 0的根。牛頓法最大的特點就在於它的收斂速度很快

首先,選擇一個接近函式 (x)零點的 x0,計算相應的 (x0) 和切線斜率f  ' (x0)(這裡f ' 表示函式 f  的導數)。然後我們計算穿過點(x0,  f  (x0)) 並且斜率為'(x0)的直線和 軸的交點的x座標,也就是求如下方程的解:

我們將新求得的點的 座標命名為x1,通常x1會比x0更接近方程f  (x) = 0的解。因此我們現在可以利用x1開始下一輪迭代。迭代公式可化簡為如下所示:

已經證明,如果f  ' 是連續的,並且待求的零點x是孤立的,那麼在零點x周圍存在一個區域,只要初始值x0位於這個鄰近區域內(如果不在這個區域內就可能出現區域性最優但全域性不最優),那麼牛頓法必定收斂。 並且,

如果f  ' (x)不為0, 那麼牛頓法將具有平方收斂的效能. 粗略的說,這意味著每迭代一次,牛頓法結果的有效數字將增加一倍。下圖為一個牛頓法執行過程的例子。

由於牛頓法是基於當前位置的切線來確定下一次的位置,所以牛頓法又被很形象地稱為是"切線法"

牛頓法的優缺點

優點:
1. 頓法是二階收斂,梯度下降是一階收斂,所以牛頓法就更快。如果更通俗地說的話,比如你想找一條最短的路徑走到一個盆地的最底部,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之後,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。(牛頓法目光更加長遠,所以少走彎路;相對而言,梯度下降法只考慮了區域性的最優,沒有全域性思想。)

缺點:
1. 牛頓法是一種迭代演算法,每一步都需要求解目標函式的Hessian矩陣的逆矩陣,計算比較複雜。

從幾何上說,牛頓法就是用一個二次曲面去擬合你當前所處位置的區域性曲面,而梯度下降法是用一個平面去擬合當前的區域性曲面,通常情況下,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優下降路徑

注:紅色的牛頓法的迭代路徑,綠色的是梯度下降法的迭代路徑

牛頓法改進 - 擬牛頓法(Quasi-Newton Methods)

擬牛頓法的本質思想是改善牛頓法每次需要求解複雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的複雜度

擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函式的梯度。通過測量梯度的變化,構造一個目標函式的模型使之足以產生超線性收斂性。這類方法大大優於最速下降法,尤其對於困難的問題。另外,因為擬牛頓法不需要二階導數的資訊,所以有時比牛頓法更為有效

牛頓一拉夫森法

牛頓—拉夫森(Newton-raphson)法的基本思想也是利用泰勒級數展開近似,通過迭代運算尋找最小二乘函式最優解的數值解法。

但區別在於,牛頓—拉夫森法的迭代運算,相當於在前一個引數估計向量的基礎上,按單位移動幅度(通常稱為“步長”)搜尋更好的引數估計值,因此牛頓—拉夫森法也是一 種搜尋法(不斷進行區域性最優搜尋)

牛頓—拉夫森法的優點是搜尋方向和步長的確定比較科學,因此找到滿足精度要求最優水平的搜尋次數一般要小一些。

牛頓—拉夫森方法的缺點是迭代運算中需要反覆計算梯度向量,特別是海塞矩陣的逆矩陣,因此計算工作量很大。事實上,人們在實際應用中常常並不按照牛頓一 拉夫森法進行搜尋,而是根據一些簡單法則確定搜尋的步長,如“雙向線性搜尋法”就是其中常用的方法之一

格點搜尋法

Relevant Link:

https://support.minitab.com/zh-cn/minitab/18/help-and-how-to/modeling-statistics/regression/supporting-topics/nonlinear-regression/understanding-nonlinear-regression/
https://support.minitab.com/zh-cn/minitab/18/help-and-how-to/modeling-statistics/regression/supporting-topics/nonlinear-regression/understanding-algorithms-and-starting-values-in-nonlinear-regression/
http://blog.csdn.net/ice110956/article/details/22735535
http://202.121.199.249/foundrymate/lessons/data-analysis/24/241.HTM
http://www.cnblogs.com/maybe2030/p/4751804.html#_label1
https://www.codelast.com/%E5%8E%9F%E5%88%9B-%E5%86%8D%E8%B0%88-%E6%9C%80%E9%80%9F%E4%B8%8B%E9%99%8D%E6%B3%95%E6%A2%AF%E5%BA%A6%E6%B3%95steepest-descent/
http://gaolei786.github.io/r/statistics/nlm.smooth.reg.html 
http://kuangnanfang.com/zb_users/upload/2015/09/201509201442740102956811.pdf

 

3. 線性分類模型

0x1: 邏輯斯蒂迴歸分類模型

邏輯斯蒂迴歸(logistic regression)是統計學中的經典分類方法,它屬於對數線性模型。邏輯斯蒂迴歸模型源自邏輯斯蒂分佈,其分佈函式F(x)是S形函式。邏輯斯蒂迴歸模型是由輸入的線性函式表示的輸出的對數機率模型

1. 邏輯斯蒂分佈(logistic distribution)

邏輯斯諦分佈是指連續隨機變數X具備下列分佈函式和密度函式

其中,u為未知引數,r > 0為形狀引數

可以看到,邏輯斯諦分佈函式是一條S形曲線(sigmoid curve),該曲線以點(u, 1/2)為中心對稱。曲線在中心附近增長速度較快,在兩端增長速度較慢

1. 形狀引數r的值越小,曲線在中心附近增長得越快,也即越接近階躍函式
2. 階躍點由位置引數u決定

2. 二項邏輯斯蒂迴歸模型(二項即代表label只有兩種可能)

二項邏輯斯蒂迴歸模型(binomial logistic regression model)是一種分類模型,由條件概率分佈P(Y | X)表示,形式為引數化的邏輯斯諦分佈,隨機變數X取值為實數,Y取值為0或1,通過監督學習的方法來估計模型引數

對於給定的輸入例項x,按照上式可以求得P(Y = 1 | x)和P(Y = 0 | x),邏輯斯蒂迴歸比較兩個條件概率值的大小,將例項x分到概率值較大的那一類

3. 邏輯斯蒂迴歸模型的特點

我們前面說過,邏輯斯蒂迴歸模型屬於對數線性模型,通過兩邊加入對數log,可以讓邏輯斯蒂迴歸呈現出線性形式,我們來引出下一個話題:機率

一個事件的機率(odds):指該事件發生與不發生的概率比值,若事件發生概率為p,那麼事件發生的機率就是:那麼該事件的對數機率(log odds或者logit)就是: 

那麼,對邏輯迴歸而言,Y=1對數機率就是: 

也就是說,輸出Y=1的對數機率是由輸入x的線性函式表示的模型,這就是 邏輯迴歸模型。當 w⋅x的值越接近正無窮,P(Y=1|x) 概率值也就越接近1.

這看起來是一個非常直觀的概率模型,所以,在神經網路中也引入了sigmoid函式作為啟用函式的概念,每一個sigmoid函式就是一個決策單元

4. 邏輯斯蒂迴歸模型引數估計

模型建立後,接下來如何去求解模型中的引數。在統計學中,常常使用極大似然估計法來求解,即找到一組引數,使得在這組引數下,我們的訓練樣本資料被正確分類的似然度(概率)最大

邏輯斯蒂迴歸模型學習時,對於給定的訓練資料集T = {(x1, y1),(x2,y2),....,(xn, yn)},設:

似然函式:

對數似然函式:

現在要求 w 使得L(w) 最大,這樣,問題就變成了以對數似然函式為目標函式的最優化問題,邏輯斯蒂迴歸屬於非線性模型,常用的最優化方法是梯度下降GD或者擬牛頓法

假設w的極大似然估計值是,那麼學到的邏輯斯蒂迴歸模型為:,該模型可用於之後的預測中

這裡我們插入一個問題:為什麼不是最小化損失函式策略,確實最大化似然函式策略?

實際上,對數似然損失在單個資料點上的定義為: 

如果取整個資料集上的平均對數似然損失,我們恰好可以得到: 

即在邏輯迴歸模型中,我們最大化似然函式和最小化對數似然損失函式這兩種策略實際上是等價的。可見損失函式背後的本質還是概率

5. 多項式邏輯斯蒂迴歸(多項代表label有多種可能)

在大於2的多分類問題中,要用到多項式邏輯斯蒂迴歸模型(multi-nominal logistic regression model)。假設離散型隨機變數Y的取值集合是{1,2,...,K},則模型公式為:

同樣,二項邏輯斯蒂迴歸的引數估計法也可以推廣到多項邏輯斯蒂迴歸

雖然邏輯迴歸能夠用於分類,不過其本質還是線性迴歸。它僅線上性迴歸的基礎上,在特徵到結果的對映中加入了一層sigmoid函式(非線性)對映,即先把特徵線性求和,然後使用sigmoid函式來預測。
正是這個簡單的邏輯函式,使得邏輯迴歸模型成為了機器學習領域一顆耀眼的明星,神經網路中的感知機中也有邏輯斯蒂迴歸迴歸模型的影子

邏輯斯蒂迴歸比線性迴歸優勢在於:線性迴歸在整個實數域內敏感度一致。而邏輯迴歸就是一種減小預測範圍,將預測值限定為[0,1]間的一種迴歸模型。邏輯曲線在z=0時,十分敏感,這讓模型能夠對資料集中細節的差別具備較靈敏的分類能力(未知引數r越小,靈敏度越高),在z>>0或z<<0處(兩頭位置),都不敏感

邏輯斯蒂迴歸可以看成是一個通過log壓縮到【0,1】值域中的線性迴歸模型

Relevant Link:

http://blog.csdn.net/xbinworld/article/details/43919445
http://blog.sciencenet.cn/blog-427701-688352.html
http://blog.csdn.net/ppn029012/article/details/8775597
http://blog.csdn.net/richard2357/article/details/17241039
http://blog.sciencenet.cn/blog-508318-633085.html
http://blog.csdn.net/daunxx/article/details/51816588
https://chenrudan.github.io/blog/2016/01/09/logisticregression.html
http://www.52cs.org/?p=286
https://www.zhihu.com/question/21329754/answer/18004852
https://yoyoyohamapi.gitbooks.io/mit-ml/content/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/articles/%E5%9B%9E%E5%BD%92%E9%97%AE%E9%A2%98.html

0x2: 最大熵模型

1. 最大熵原理

最大熵模型(maximum entropy model)由最大熵原理推導實現。最大熵原理是概率模型學習中的一個準則,即

學習概率模型時,在所有可能的概率模型(分佈)中,熵最大的模型是最好的模型。通常用約束條件來確定概率模型的集合,所以,最大熵原理也可以表述為在滿足約束條件的模型集合中選取熵最大的模型

假設離散隨即變數X的概率分佈是P(X),則其熵:,熵滿足下列不等式:,其中| X |代表X的取值個數,當且僅當X的分佈是均勻分佈時右邊的等號成立,即當X服從均勻分佈時,熵最大。

直觀地說,最大熵原理認為要選擇的概率模型首先必須滿足已有的事實,即約束條件。在沒有更多資訊的情況下,那些不確定的部分都是"等可能的"(即等概率)。最大熵原理通過熵的最大化來表示等可能性。"等可能性"不好公式化,而熵則是一個可優化逼近的數值指標

2. 最大熵模型的定義(k=2)- 為了引出之後的論點:最大熵模型是邏輯斯蒂迴歸的泛化形式,邏輯斯蒂迴歸是最大熵對應類別為二類時的特殊情況

最大熵原理是統計學的一般原理,將它應用到分類得到最大熵模型,在進行下面推導之前,先上幾個數學符號定義

  1. π(x)u 表示,輸入時x, 輸出的 y=u的概率;
  2. A(u,v) 是一個指示函式,若u=v,則 A(u,v)=1;否則 A(u,v)=0
  3. 我們的目標,就是從訓練資料中,學習得到一個模型,使得 π(x)u 最大化,也就是輸入x,預測結果是 y 的概率最大,也就是使得 π(x)y 最大;

最大熵模型滿足下列的一些性質:

基於資訊理論理論,我們可以得到π() 的,定義如下:

根據最大熵原理,有了目標(策略)π() 最大,在上面的4個約束條件下。求解約束最優化問題

為了簡化運算。可以通過拉格朗日乘子,將約束最優化問題轉換為無約束最優化的對偶問題。我們的拉格朗日式子可以寫成如下:,對L求偏導,得到:,令偏導=0,得到:,從而得到:,因為有約束條件:,所以:,因此,可以得到:,把代入π(),並且簡化一下式子:

3. 最大熵模型是邏輯斯蒂迴歸的泛化形式(k=2)

最大熵模型和邏輯斯蒂迴歸模型的背後都是概率統計原理,邏輯迴歸跟最大熵模型沒有本質區別。邏輯迴歸是最大熵對應類別為二類時的特殊情況,為了證明這個論點,我們先來回顧邏輯斯蒂迴歸

標準的邏輯迴歸是二類模型,有: ,我們用一個更加泛化的形式來表達 π()

可以看到,在k=2的情況下,最大熵模型和邏輯斯蒂迴歸模型是等價的

1. 邏輯迴歸跟最大熵模型沒有本質區別。邏輯迴歸是最大熵對應類別為二類時的特殊情況
2. 指數簇分佈的最大熵等價於其指數形式的最大似然 

3. 二項式分佈的最大熵解等價於二項式指數形式(sigmoid)的最大似然  
4. 多項式分佈的最大熵等價於多項式分佈指數形式(softmax)的最大似然 

最大熵模型與邏輯斯蒂迴歸模型有類似的形式,它們又稱為對數線性模型(log linear model)(即在對數化情況下呈現線性性),模型學習就是在給定的訓練資料條件下對模型進行極大似然估計(經驗風險最小化)或正則化的極大似然估計(結構風險最小化)

Relevant Link: 

http://blog.csdn.net/cyh_24/article/details/50359055

 

4. 從鳶尾花例子看回歸和分類問題的共性和區別

鳶尾花資料集是一個很經典的資料集,每個樣本包含4個維度的特徵:的花瓣和萼片長度和寬度。樣本量150個,label標籤有Setosa,Versicolour、Virginica這3種

0x1: 前2維特徵+4維PCA降維到3維的視覺化資料集展示

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA

if __name__ == '__main__':
    # import some data to play with
    iris = datasets.load_iris()
    X = iris.data[:, :2]  # we only take the first two features.
    y = iris.target

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

    plt.figure(2, figsize=(8, 6))
    plt.clf()

    # Plot the training points
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1,
                edgecolor='k')
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')

    plt.xlim(x_min, x_max)
    plt.ylim(y_min, y_max)
    plt.xticks(())
    plt.yticks(())

    # To getter a better understanding of interaction of the dimensions
    # plot the first three PCA dimensions
    fig = plt.figure(1, figsize=(8, 6))
    ax = Axes3D(fig, elev=-150, azim=110)
    X_reduced = PCA(n_components=3).fit_transform(iris.data)
    ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y,
               cmap=plt.cm.Set1, edgecolor='k', s=40)
    ax.set_title("First three PCA directions")
    ax.set_xlabel("1st eigenvector")
    ax.w_xaxis.set_ticklabels([])
    ax.set_ylabel("2nd eigenvector")
    ax.w_yaxis.set_ticklabels([])
    ax.set_zlabel("3rd eigenvector")
    ax.w_zaxis.set_ticklabels([])

    plt.show()

明確了資料集長什麼樣,我麼接下來開始進行一個小實驗,說逐步說明我們什麼時候該用線性迴歸/非線性迴歸,什麼時候該用分類模型,以及迴歸與分類的關係。在開始之前,我需要明確一下我們的目標:

建立一個模型(任意模型),當我輸入鳶尾花的特徵之後,你需要告訴我這個鳶尾花屬於哪一類?

0x2: 使用1元線性迴歸模型建立一元線性迴歸模型

也許直覺上這個問題不適合用一元線性迴歸模型來做,但是我這裡執意要這麼做,並且要最大程度地發揮一元線性迴歸模型的威力使其幫助我們儘可能地好的去靠近這個目標

1. 選擇和待預測值Y相關性最強的一個特徵

我們只能選擇一個特徵,那肯定要選擇一個能達到最好擬合預測能力的特徵,使用可決係數R2的來幫我們評估

Feature_1 - Variance score: 0.58
Feature_2 - Variance score: 0.26
Feature_3 - Variance score: 0.90
Feature_4 - Variance score: 0.92

從可決係數的比較上來看,第4個特徵和待擬合值的相關性最好,所以我們之後的實驗都選擇特徵4

2. 建立一元線性迴歸模型

用X軸表示特徵4,用Y軸表示label,通過plot視覺化出來

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

if __name__ == '__main__':
    # import some data to play with
    iris = datasets.load_iris()

    # Use only one feature
    diabetes_X = iris.data[:, 3:4]  # we only take the two features.
    diabetes_y = iris.target

    # Split the data into training/testing sets
    split_len = int(len(diabetes_X) * 0.8)
    diabetes_X_train = diabetes_X[:split_len]
    diabetes_X_test = diabetes_X[split_len:]
    print "diabetes_X_train"
    print diabetes_X_train

    # Split the targets into training/testing sets
    diabetes_y_train = diabetes_y[:split_len]
    diabetes_y_test = diabetes_y[split_len:]
    print "diabetes_y_train"
    print diabetes_y_train

    # Create linear regression object
    regr = linear_model.LinearRegression()

    # Train the model using the training sets
    regr.fit(diabetes_X_train, diabetes_y_train)

    # Make predictions using the testing set
    diabetes_y_pred = regr.predict(diabetes_X_train)
    print "diabetes_y_pred"
    print diabetes_y_pred

    # 對線性迴歸模型的預測值進行離散取樣歸一化
    '''
    diabetes_y_pred_normal = list()
    for pred in diabetes_y_pred:
        if pred <= 0.5:
            diabetes_y_pred_normal.append(0.)
        elif pred <= 1.5:
            diabetes_y_pred_normal.append(1.)
        else:
            diabetes_y_pred_normal.append(2.)
    diabetes_y_pred = np.array(diabetes_y_pred_normal)
    print "diabetes_y_pred"
    print diabetes_y_pred
    '''

    # The coefficients
    print('Coefficients: ', regr.coef_)
    # The mean squared error
    # Explained variance score: 1 is perfect prediction
    # 可決係數R2越接近1,說明特徵和擬合值的相關性越大
    print('Variance score: %.2f' % r2_score(diabetes_y_train, diabetes_y_pred))
    # 預測的準確度
    print "Prediction accurate: %2f" % np.mean(diabetes_y_pred == diabetes_y_train)

    # Plot outputs
    plt.scatter(diabetes_X_train, diabetes_y_train, color='black')
    plt.scatter(diabetes_X_train, diabetes_y_pred, color='blue', linewidth=3)

    plt.xticks(())
    plt.yticks(())

    plt.show()

黑色的點代表樣本實際值,藍色的點代表模型擬合值

3. 我們要預測的是[0, 1, 2]這3種離散的label型別,你給我一個連續性的線性迴歸模型怎麼用?

得到的這個模型我們會發現無法進行預測,因為線性迴歸模型得到的值是連續值

為了解決這個問題,我們前面說過,我們可以對線性迴歸模型的連續預測值進行離散化取樣,取樣點的分介面(對一維來說就是分界線)可以大致假定一個0.5和1.5,即取【0,1,2】的中位數,進行了離散取樣歸一化之後的結果如下

兩幅圖分別是離散化前後的點視覺化圖,圖中的兩個箭頭就是分界線,注意x(Y = 1.5)(Y值為1.5的x點)那個分界線,在分界線的兩邊都存在誤分類(即誤報)

對這種情況。我們也許可以建立一個損失函式的策略,即根據均方誤差損失函式去求得最佳分類線X,這個例子很簡單,從直觀上就可以看出嗎,第二個分界線不管怎麼左右調整,損失函式都不可能降到0,因為在它的分類維度上,點集Y=1和點集Y=2是存在重合的,換句話說,點集Y=1和點集Y=2在當前特徵維度上是線性不可分的,不管用多麼高階的損失函式評價和迴歸策略都是一樣的,資料本身和維度的限制限制了最終的效果

0x3: 使用多元線性迴歸模型建立多元線性迴歸模型 

既然一元迴歸模型維度太少了,我們就把維度提高,根據SVM核函式的思想,在低緯度不可分的資料集在高維度就有更大的可能是線性可分的,1維的分界線到了高維度變成了超分類面

為了便於理解,我們來看一個4維PCA後的3維點集圖

可以看到,應該相對容易地我們用2個垂直於"2nd eigenvector" x "1st eigenvector"平面作為分類面,可以較好地把3類資料集給切分開來

所以同樣的,我們還是用同樣的思路

1. 這次同時用上鳶尾花的全部4個特徵(當然其實這裡是否要同時用到4個特徵,也是值得展開的一個話題,嚴格地說這裡應該進行特徵選擇工程,但我們暫時忽略)
2. 離散取樣標準還是x(Y = 0.5)、x(Y = 1.5),取樣本Y實際值的中位數對應的X點作為超分介面,只是這時候X不在是一個線,而是一個4維超平面

訓練集得到的模型對訓練集本身的離散化預測結果如下

Variance score: 0.98
Prediction accurate: 0.991667

這次的整體可決係數和準確度都得到的大幅度提高,對測試集的泛化能力也不錯,達到了80%

0x4: 使用非線性迴歸模型對資料集進行擬合

我們試著用非線性迴歸模型來幫助我們更好地擬合樣本點

0x5: 使用Logistic regression對資料集進行分類

邏輯斯蒂迴歸模型是在迴歸模型的基礎上進行離散化取樣得到分類結果,屬於迴歸分類模型

#!/usr/bin/python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
Y = iris.target

h = .02  # step size in the mesh

logreg = linear_model.LogisticRegression(C=1e5)

# we create an instance of Neighbours Classifier and fit the data.
logreg.fit(X, Y)

# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max].
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

# 預測的準確度
X_pre = logreg.predict(X)
print X_pre
print "Prediction accurate: %2f" % np.mean(X_pre == Y)


# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4, 3))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())

plt.show()

每次判斷時,多項式邏輯斯蒂迴歸模型基於最大似然估計原理,根據樣本在所有條件概率中最大的對應的那個類作為最終判斷結果(softmax)

可以看到,用邏輯斯蒂迴歸模型對鳶尾花的2個特徵進行分類,得到了80%的準確度

0x6: 使用SVM直接尋找超分類面對資料集進行分類

SVM不進行迴歸訓練,而是直接尋找最優超分類面

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets


def make_meshgrid(x, y, h=.02):
    """Create a mesh of points to plot in

    Parameters
    ----------
    x: data to base x-axis meshgrid on
    y: data to base y-axis meshgrid on
    h: stepsize for meshgrid, optional

    Returns
    -------
    xx, yy : ndarray
    """
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    return xx, yy


def plot_contours(ax, clf, xx, yy, **params):
    """Plot the decision boundaries for a classifier.

    Parameters
    ----------
    ax: matplotlib axes object
    clf: a classifier
    xx: meshgrid ndarray
    yy: meshgrid ndarray
    params: dictionary of params to pass to contourf, optional
    """
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **params)
    return out


# import some data to play with
iris = datasets.load_iris()
# Take the first two features. We could avoid this by using a two-dim dataset
X = iris.data[:, :2]
y = iris.target

# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
C = 1.0  # SVM regularization parameter
models = (svm.SVC(kernel='linear', C=C),
          svm.LinearSVC(C=C),
          svm.SVC(kernel='rbf', gamma=0.7, C=C),
          svm.SVC(kernel='poly', degree=3, C=C))
models = (clf.fit(X, y) for clf in models)

# title for the plots
titles = ('SVC with linear kernel',
          'LinearSVC (linear kernel)',
          'SVC with RBF kernel',
          'SVC with polynomial (degree 3) kernel')

# Set-up 2x2 grid for plotting.
fig, sub = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.4, hspace=0.4)

X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)

for clf, title, ax in zip(models, titles, sub.flatten()):
    plot_contours(ax, clf, xx, yy,
                  cmap=plt.cm.coolwarm, alpha=0.8)
    ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xlabel('Sepal length')
    ax.set_ylabel('Sepal width')
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title(title)

plt.show()

Relevant Link:

https://en.wikipedia.org/wiki/Iris_flower_data_set
http://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html
http://scikit-learn.org/stable/auto_examples/index.html
http://blog.csdn.net/golden1314521/article/details/46564227
http://scikit-learn.org/stable/auto_examples/semi_supervised/plot_label_propagation_versus_svm_iris.html#sphx-glr-auto-examples-semi-supervised-plot-label-propagation-versus-svm-iris-py
http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html 

Copyright (c) 2017 LittleHann All rights reserved

相關文章