sklearn:線性回歸基礎(chǔ)實(shí)現(xiàn)(含讀取文本文件的三種方式)

當(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ù)。

源數(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è)元素。

圖1 讀取數(shù)據(jù)

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

圖2 分割數(shù)據(jù)

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)行追加賦值。

圖3 賦值

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

圖4 整形

完成啦。

讀取方式二

numpy庫(kù)中的loadtxt函數(shù)是不錯(cuò)的選擇哦。

圖5 numpy的loadtxt方式讀取數(shù)據(jù)

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

圖6 賦值
圖7 整形

讀取方式三

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

圖8 讀取數(shù)據(jù)
圖9 賦值和變形

以上就是三種讀取txt文件的方式啦。


下面就讓我們先利用散點(diǎn)圖看看這些數(shù)據(jù)的分布情況吧。

圖10 查看數(shù)據(jù)分布

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

圖11 模型擬合和模型結(jié)果

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

圖12 模型擬合效果可視化

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容