sklearn快速入门教程:(二)线性回归
文章目錄
- 一、從本文起學會快速閱讀和學習
- 二、線性回歸的原理回顧及官方文檔
- 三、官方文檔的分析
- 四、舉一反三
- 五、小結
一、從本文起學會快速閱讀和學習
本來是想把關于快速閱讀的說明寫在前一節,但最后還是覺得放在這個例子里面更加妥當。
首先要明確一點:快速閱讀絕不等于讀得快!真正的快速閱讀實際上是明確閱讀的要點,把最多的精力放在最重要的地方去細讀;同時果斷地減少甚至舍棄對不重要的點的閱讀。比如有的文檔可能有2000個單詞,但實際上真正有用的部分就只有200詞。如果只給你10分鐘的時間,你去搞明白這200詞的內容實際上并不困難。但如果每個點都想看明白,估計10分鐘連這2000個詞都還沒認全時間就已經過去了。
那么與之對應的快速學習也是同樣的道理。尤其在初學的時候,一定要把精力放在主干的知識框架上,而那些細枝末節的東西有空了或者遇到了再去慢慢看。相反如果一來就想一口氣把所有的細節都弄清楚,那么很有可能掌握正確學習方法的同學已經在用sklearn做項目了,而你還在糾結線性回歸的實現。
廢話不多說,我們直接進入正題。
二、線性回歸的原理回顧及官方文檔
線性回歸的公式非常簡單:
y^(w,x)=w0+w1x1+...+wpxp\hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_p y^?(w,x)=w0?+w1?x1?+...+wp?xp?
這里 xix_ixi? 代表輸入向量的第 iii 維,wiw_iwi?則是參數的第 iii維, y^\hat{y}y^? 是輸出值。從原理上我們其實只關心兩個問題:如何根據現有的數據算出它的參數?參數求出之后我們怎么用它來預測?
官方很直接地先給出了這樣一段代碼:
>>> import numpy as np >>> from sklearn.linear_model import LinearRegression >>> X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) >>> # y = 1 * x_0 + 2 * x_1 + 3 >>> y = np.dot(X, np.array([1, 2])) + 3 >>> reg = LinearRegression().fit(X, y)>>> reg.coef_ array([1., 2.]) >>> reg.intercept_ 3.0000... >>> reg.predict(np.array([[3, 5]])) array([16.])注意,上述敘述過程其實就是我們通常的學習新模型的方式。先看看原理,再直接粘代碼。這種方式其實就是最簡單直接的方式。但如果只是這樣去復制粘貼,很顯然是不行的。因為如果沒有理解代碼的涵義,那么遇到變化時就完全不知所措,到時候又得回來老老實實看原理,很顯然這就很浪費時間。
回顧本文開頭所講,我們是要細讀那些最重要的地方,很顯然,這段代碼就是我們要去細讀的地方。
三、官方文檔的分析
這段代碼中前2行的代碼只是導入對應的Numpy庫和LinearRegression模塊,可以忽略,要用的時候照著樣子照抄即可,頂多注意一下這里把numpy取了一個別名叫np.
接下來3-5行是在生成原始數據。這里我們仔細觀察一下。首先變量X很顯然是輸入變量,而注釋中也很清楚地說明了輸出變量的值是由公式 y=1?x0+2?x1+3y = 1 * x_0 + 2 * x_1 + 3y=1?x0?+2?x1?+3 得到的。那么這里我們仔細看一下兩個變量的結構。我們將X和 y分別輸出:
Xarray([[1, 1],[1, 2],[2, 2],[2, 3]]) yarray([ 6, 8, 9, 11])這里注意到,X 是一個5×25\times 25×2 的數組(和矩陣稍有不同,但形狀完全一樣),而y是一個一維的數組。由此可見,我們要用來擬合的數據,其輸入變量必須是列向量,而輸出的這個變量則相對自由(注意,這也是sklearn相對比較坑的一點;官方的說法是為了節省內存開銷,但如果熟悉Matlab、R等相對更加專業的計算類程序的人容易覺得不適應)。那么明白了這一點,我們要輸入怎樣的數據就完全明確了。那么如果我們想換上自己的數據不外乎也就是把X 和y 按照同樣的格式輸入即可。
接下來第6行就很有意思了。首先它是直接調用LinearRegression類的方法fit(X,y),直接實例化了一個線性回歸模型,并且用上面生成的數據進行了擬合。看到這里就能夠明白了,原來只需要把數據按照格式輸入,就可以完成模型的擬合。事實上這段代碼也可以改成以下形式:
reg = LinearRegression() reg.fit(X, y)因為fit()方法返回值其實是模型本身self,所以在初始化reg之后只需要直接調用fit(),它自己對應的系數值(屬性)就被成功賦值。這種寫法個人更為推薦,因為它雖然看起來多出一行,但整個運行的機制則顯得更加清晰。
第9,11行就是系數和偏差值的展示。上面提到,注釋中已經說明了數據就是由方程y=1?x0+2?x1+3y = 1 * x_0 + 2 * x_1 + 3y=1?x0?+2?x1?+3生成的,而這時我們看到系數值分別等于 1,2而偏差值是3,和理論模型完全一致。
重點在第13行,此時它調用了LinearRegression類的predict()方法。那么顯然,這個方法就是利用擬合好的線性回歸模型來計算新輸入值對應的輸出值。這里新輸入值仍然和擬合時的格式保持一致。
那么小結一下,根據官方文檔,要擬合一個線性回歸模型并且預測出新值的話,其實只需要進行四個步驟:
- 格式化數據,輸入為n*d的數組,其中n表示數據的個數,d是維度;輸出值是一維數組。
- 初始化模型LinearReregression()
- 擬合fit(X,y)
- 預測predict(X_test)
四、舉一反三
注意,到這里還并沒有結束。一個成功的調包俠工程師,在看懂一段代碼過后一定要進一步對其進行探索,那么這里我們容易想到幾個問題:
- 很顯然上述的生成數據的方式太低效,我想用點隨機的數據行不行?或者我想用更大一點的數據行不行?
- 模型預測雖然可以做了,但想要評估一下預測結果行不行?
- 我想把結果畫出來行不行?
當然都可以。再當然,要實現這些方法就要用到其它的一些庫和方法。
比如,上述例子只給了5個點,我想試一試 X={1,2,...,100}X = \left\{1,2,...,100 \right\}X={1,2,...,100}, y=0.3?X+1y = 0.3*X+1y=0.3?X+1,那么這里就涉及到numpy的應用了。比如我們可以用這種方法:
import numpy as np X = np.reshape(np.arange(100),[-1,1]) y = 0.3*X + 1 reg.fit(X,y)這段代碼同樣可以運行。但是注意到這里我們用到了另一個方法 np.reshape(),這是為了保證X滿足fit函數的數據結構要求。如果去掉這個方法則會報錯。
另外模型評估可以直接用reg.score(X,y),或者再去查詢其它的模型評估方法。如果要畫圖則需要用到matplotlib。
當然,后面兩個問題就是在已經理解和掌握了LinearRegression()之后的擴展內容。實際上在完成了第1個問題時,我們就已經學會了如何使用這個方法了。
五、小結
本文詳細講解了sklearn中的線性回歸模型LinearRegression()的使用。相信這會你已經發現我們并沒有講太多的原理,而是直接根據模型的功能去查詢方的代碼。再通過代碼的內容詳細分析了其中的關鍵點,即數據的結構(我們也可以更直接地叫它shape)。相信看完這篇文章頂多也花不了10分鐘,但你已經掌握了LinearRegression的用法。至于更深的理論,更多花哨的用法,就在你具體的項目、研究中再去查詢就好。
其它的模型,我們也會用類似的方法加以講解。有興趣的同學也可以試試用上述的方式去看看其它的模型,說不定會有意想不到的效果。
參考內容:
[1] LinearRegression類官方說明
[2]: LinearRegression官方示例
- sklearn快速入門教程:(一)準備工作
- sklearn快速入門教程:(三)機器學習的通用模式及實現方法
- sklearn快速入門教程:(四)模型自動調參
- sklearn快速入門教程:(五)集成學習
總結
以上是生活随笔為你收集整理的sklearn快速入门教程:(二)线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn快速入门教程:(一)准备工
- 下一篇: sklearn快速入门教程:(三)机器学