第十三節多項式迴歸之維度爆炸和過擬合html
接下來咱們進入下一個問題,叫多項式迴歸,它其實一點都不復雜。假如對於非線性的數據點,咱們如何用現有你已經知道的知識來擬合?算法
舉個例子,人的年齡跟去醫院的次數是一條線性的這麼一個規律嗎?應該不是,由於年輕的時候很長一段時間不怎麼去醫院,隨着年齡增大,可能慢慢重視身體了,或者身體有一些小問題了,去醫院的頻率愈來愈高,相似線性增加的關係。網絡
但生活中的狀況它並非一個非線性的關係。隨着時間的增加,有可能會造成一個拋物線的形式往上走,對於這樣的數據點,它在拋物線的左右有一點震盪。假如用線性迴歸來擬合,只能作出這麼一個線性的湊湊合合的結果來,而不可能獲得一個真正這事物自己的規律,那怎麼辦呢?算法不許變,你有沒有什麼好辦法?app
好比X軸是年齡,Y軸是次數,由於原來數據集是否是就一個X是age?,我建模出來是Y=W*age+b,算法不去變的搶礦下,你怎麼樣可以讓它去擬合這種非線性的數據?咱們對數據作一些手腳,咱們偷樑換柱一下,我原來拿到的是一列age,我把age平方一下,把平方完了的結果線性迴歸的算法裏。此時它的建模實際上仍是y=w1*x1+b,雖然它形式上仍是線性的,可是此時的X1是什麼?age的平方,實質上就變成了W*age^2+b。假如這個座標軸不是age是X1的話,它是否是仍然是一條直線?可是你把它映射到age這個空間裏面去,它其實是不是就變成了一條曲線了? 這就是一種升維的方式。增長了一個維度,人爲構造出來的一個維度。它令你這個模型能擬合非線性的數據了。機器學習
其實非線性這個東西特別的討厭,各類各樣的算法,在如何處理非線性數據集上想盡了本身的辦法,火爆到如今的深度神經網絡,就是經過非線性的激活函數,把這個非線性能力賦予給了模型,讓它能擬合一些非線性數據,既然多項式迴歸這麼好,幹嗎還要發明深度神經網絡呢? 爲何不統統的都是這種多項式的方式來作,由於它會遇到另外一個機器學習這個世界裏面特別讓人討厭的,而且又避不開的問題,叫作維度爆炸(Curse of Dimensionality)。Curse什麼意思?詛咒,說明維度數量給你帶來的這種揮之不去的纏繞在你身邊的煩惱。函數
咱們回到多項式迴歸上面來。上面的例子其實是一種偷樑換柱,把X變成X平方。好比有一個X1,1個特徵,如今須要弄出兩個特徵來,一個是X1,一個是原來的X1的平方,你給它改個名叫X2。假如原來有兩個特徵,X1,X2,性能
如今須要增長出三個特徵來,組合特徵即X1^2,X2^2,X1*X2。即:學習
這就是二階多項式升維。因此經過多項式迴歸,能夠將現有的特徵進行一些組合。假如你原來就有X1,X2,X3,你須要多加幾項,能夠看看有多種組合方式,X1X2,X2X3,X1X3,X1^2,X2^2,X3^2 ,這是幾種?加了六個。假設說二次方不夠用,我把它升級到三次方,X1*X2*X3,X1^2 * X2,X1^2 * X3,多了去了,三個維度尚且如此,一般有幾百個維度,又要怎麼升?因此說多項式迴歸是一個看起來很美好的故事。可是實際上隨着數量的增多,階數的升高,它是爆炸式的增加的。因此說雖然升維是一個最簡單的,處理非線性數據集的問題,可是怎麼升纔能有操做性呢?一般是經過某種方法來評估哪些特徵對最後的影響最大。保留好比前十個影響最大的特徵,讓他們彼此組合去升一些維度,而不是用所有的特徵互相隨機組合這樣升維,但即便這樣效果也不必定好,因此說升維只是一個最簡單的處理非線性問題的方式。url
再舉一個升維的例子, 假如你如今桌子上有紅豆和綠豆,紅豆攢了一個圈,在裏邊攢成一個圓形,綠豆都圍在紅豆的外邊,這會畫一條線,把紅豆綠豆分開,直接劃線是沒法分開的,可是若是你用力拍了一下桌子,紅豆和綠豆都被你拍起來了,由於它們的重量不一樣,紅豆飛得高一點,綠豆飛得低一點,再飛起來的這一瞬間,時間定格了,你差一張紙進去,在三維空間中它是否是就可分了?spa
因此每每在低維空間中線性不可分的數據集在高維空間中必定是可分的,可是取決於你怎麼給它升到一個最好的高維空間裏面是很麻煩的。假如利用多項式迴歸的話,它是可分,可是升維的代價太大了,會有維度爆炸的問題,因此只可以選擇一些各類各樣的間接的方式,好比剛纔說的選擇最重要的數據的維度,給它們進行特徵的組合進行升維。但怎麼知道哪些維度重要,哪些維度不重要?咱們在從此會講一系列決策樹的算法,自己可以輸出這個維度對於最終結果的影響是大仍是小,它能把全部維度的重要性排一個順序,會讓你優先選擇那些真真正正更大程度上影響最終結果的那些維度,把它們進行組合進行升維來達到解決非線性數據不可分的問題。
多項式迴歸自己不多使用,雖然sklearn那裏面也封裝了polinomial多項式迴歸,可是在這兒我們講它只是提出升維的概念,以及接下來我要講的更重要的一個過擬合的概念。
關於多項式迴歸,下面有一張圖,藍色的點是你採集到的數據,若是沒有這些曲線的話,直接讓你作一個線性迴歸,你這條線也許會是圖中紅色畫的直線。
可是若是對它進行升維的話,咱們看着不一樣顏色的線,三階升維,至關於假如原來只有一個X,增長維度X^2和X^3,等於新創造了兩個維度出來,會賦予它綠色線的能力,這是三階升維能作到的最好的一條線。
四階升維,比三階升維已經更好一些了。若是你能達到五階的升維,那麼實際上你看,基本上是否是已經接近這條藍線是什麼?叫ground truth,是生成這些數據點用的真實的參數,它就愈來愈接近於真實的參數。其實它的背後也是泰勒展開,它的展開就是把一個東西展成一個X,X^2 ,X^3 。。。,因此任何一個函數甭管多複雜,它也能夠展開爲X的一直累下去次方的多項式,展開的越多越像原函數。也就是說不管你這個點有多複雜,只要我升維,只要我多項式的階數升得足夠高,我必定會完美的擬合原來的數據,這個是多項式升維。
因此多項式迴歸有這麼幾個問題,一是維度爆炸的問題。你經過多項式升維的方式處理的數據,是否是剛纔只有一個X還好說,你X一旦多了,必定是行不通的。直接就溢出了,可能你獲得一個荒唐的計算時間。另一個就是過擬合問題。這個是在機器學習裏面又一個很是討厭,也沒有徹底解決,一直會跟到最後的一個問題,目前只能將就的減輕它的影響 。
好比對於房價來看,若是你不對它進行任何升維,直接畫一條直線的話,其實對於房價曲線的感受沒有找到。若是你對它升維了一次,會發現雖然沒有擬合的很是好,可是大概是這個趨勢,若是再升維,升維升過了,或者說一些不相關的維度被弄進來了以後,你會發現它爲了完美地在訓練集上表現到最好,去刻意的討好訓練題上的數據了,反倒把真實的規律給搞掉了。 這個就至關於模型想多了。
再好比說有這麼一個訓練集,三個特徵,一個是今天的溼度,一個是今天的溫度,一個是今天咱們家關沒關窗戶,來判斷今天下雨不下雨,按理說下雨不下雨,跟大家家關窗戶沒關窗有關係嗎?咱們都知道是不要緊的,可是你丟給計算機的話,計算機認爲它是否是也是有可能有關係的?那麼計算機作了一個什麼事兒,雖然這一分類問題,它仍是要追求損失函數最低,越低越好,哪怕損失函數只是一點點的改變,也會朝着這個方向而去。假如關沒關窗的權重設爲零的話,此時損失函數是0.03,但當把關沒關窗戶的影響設爲0.5的時候,損失函數從0.03減爲了0.029999999。但你去觀察訓練集的話,就採集的數據來講,可能僅僅是由於偶然關窗戶的比沒關窗戶的下雨的天數多了一天,因此也會給開關窗戶配一個權重。 假如不幸多了20天,更厲害了,算法會認爲這個窗戶影響更大一點了。由於算法是朝着損失函數最小的目標去的,因此把開沒開窗戶這個特徵配完權重以後,即便損失函數就減低了這麼一點點,傻乎乎的計算機你告訴他,結果就是要把損失函數給我減到最低,因此梯度降低就開始梯度了,最後梯度了半天,發現關窗戶的權重被設計大了,這種狀況就叫作過擬合。由於算法過於的去追求損失函數必定要最低,而把模型搞複雜了,原本無關的一些東西也被它斷定爲有關係了。 也許模型就會搞出來更復雜的例子,當大家家關了窗戶且你又沒吃飯的時候,發現下雨的次數多了一點,是否是就會給關窗戶一個比較大的+W,給吃飯一個比較大的-W,假如你維度更多,它是否是就想的愈來愈多了,最後把一些亂七八糟的沒有用的這些東西全都給學出W了,假如又加了十個維度,吃沒吃飯,穿了黃衣服,穿了綠衣服,而後今天開沒開車,加了一堆無關的東西進來,最後模型在看的時候發現你今天沒關窗戶,又開了車,又穿了黃衣服的時候真下雨了。那麼實際上它是無關的,但因爲你的維度特多,他會把這些東西都配上權重,並且頗有可能配的權重還很多。它發現當這些東西組合起來以後會很大程度的影響,最後下不下雨,它會把權重配的很大。
可以理解過擬合的本質怎麼來的嗎?從多項式的角度你能夠考慮它升維升過高了,不從多項式的角度,即便你沒作任何升維,你收集上來的這些數據,有一些跟最後的結果是無關的,這些無關就會產生過擬合。
那麼咱們怎麼樣避免這種錯誤,緣由在於算法嗎,確定不是,你就讓人家作梯度降低,把損失函數降到最低點了,怎麼辦?說明咱們的這個東西有點太絕對了,我光讓它考慮損失函數,你能不能在儘可能保持損失函數小的同時,讓模型簡單一點,固然也別爲了簡單給我弄成瞎蒙瞎猜了,要作到儘可能讓損失函數小的同時讓模型再給簡單一點。這個是咱們想要的東西。
因而咱們有了解決過擬合的一個通用方法。L1,L2正則。下一節,咱們會講解正則的概念。