當(dāng)我們?cè)谛W(xué)學(xué)習(xí)直線的時(shí)候,我們已經(jīng)知道y = ax + b (a<>0)就是表達(dá)直線的方程式。在sklearn中的linear_model里的LinearRegresstion,就是我們本次需要需要調(diào)用的主角——線性回歸模型。
涉及底層數(shù)學(xué)的我就不在這進(jìn)行闡述,只簡(jiǎn)單說(shuō),模型利用最小二乘法,讓所有已知點(diǎn)到這條直線的距離的平方和最小,這條直線就是我們利用這個(gè)模型可以拿到的結(jié)果。它最大程度上擬合了我們的已知點(diǎn),也能讓我們對(duì)未知點(diǎn)進(jìn)行基礎(chǔ)預(yù)測(cè)。
首先,我們需要讀入數(shù)據(jù),我這邊是一個(gè)txt文檔,內(nèi)含兩列數(shù)據(jù)。

回憶一下,我們讀取文本文檔的三種常規(guī)方式,分別是python自帶函數(shù)讀取、numpy函數(shù)讀取、pandas函數(shù)讀取。我們需要認(rèn)識(shí)到,后續(xù)在sklearn模型中擬合的x和y變量,必須是一列數(shù)據(jù)的形式,用shape的方式來(lái)說(shuō),就是[-1,1],意思是隨便多少行,但必須是一列哦。
讀取方式一
python自帶函數(shù)讀取,我們就會(huì)想到readlines,可以一次性把所有內(nèi)容讀取出來(lái),且一行記錄就是列表的一個(gè)元素。

我們發(fā)現(xiàn)數(shù)據(jù)存在一個(gè)列表中,其中tab鍵和回車(chē)鍵被具象成了\t和\n。我們需要依據(jù)這兩個(gè)符號(hào),對(duì)數(shù)據(jù)進(jìn)行切割。

re模塊的split函數(shù)進(jìn)行分割非常好用,我們先寫(xiě)入分割模式,遇到\t或者\(yùn)n的時(shí)候,就對(duì)數(shù)據(jù)進(jìn)行分割。需要注意的是,re.split無(wú)法對(duì)整個(gè)列表進(jìn)行一次性分割,這是python自帶庫(kù)函數(shù)的通常表現(xiàn)。所以我們需要利用循環(huán),對(duì)列表內(nèi)的元素進(jìn)行逐個(gè)分割。
接下來(lái),就是賦值啦。我們利用列表的屬性,進(jìn)行追加賦值。

但我們發(fā)現(xiàn)得到的是一行數(shù)據(jù),可是在模型中我們需要使用的是一列數(shù)據(jù),所以需要進(jìn)行數(shù)據(jù)整形。利用numpy中的reshape函數(shù)是一個(gè)不錯(cuò)的選擇。不過(guò)首先是利用array函數(shù)將列表變成numpy數(shù)組。

完成啦。
讀取方式二
numpy庫(kù)中的loadtxt函數(shù)是不錯(cuò)的選擇哦。

通過(guò)切片的方式取到x和y。


讀取方式三
針對(duì)我們的txt呈現(xiàn)出來(lái)的內(nèi)容,pandas庫(kù)里read_table,利用tab鍵進(jìn)行分列,是比較合適的選擇。


以上就是三種讀取txt文件的方式啦。
下面就讓我們先利用散點(diǎn)圖看看這些數(shù)據(jù)的分布情況吧。

是很明顯的線性回歸的數(shù)據(jù)點(diǎn)分布哦。下面就需要調(diào)用sklearn里的線性回歸包啦。

y = ax + b就是我們本次產(chǎn)出的模型解釋啦。另外R^2是模型的解釋度,意思是有78%的數(shù)據(jù)可以用我們的這個(gè)線性回歸模型可以解釋。這里我們只有一個(gè)自變量,不需要涉及調(diào)整R方,后續(xù)可以安排。

我們把我們的預(yù)測(cè)模型的擬合線和實(shí)際數(shù)據(jù)點(diǎn)一起展示。這里再?gòu)?qiáng)調(diào)一下最小二乘法:黑色實(shí)際點(diǎn)到紅色擬合線的距離平方和最小的時(shí)候,得到這條紅色線。