機器學習 | 使用statsmodels和sklearn進行迴歸分析

python中不像R中,默認的函數可以做迴歸分析lm,可以做方差分析aov,python中進行統計分析需要載入外在的包,這裏經常用到的是statsmodelssklearn包,statsmodels風格還是和R語言類似,sklearn則偏向機器學習了,是機器學習的入門包。

statsmodels包介紹:

statsmodels官方文檔:https://www.statsmodels.org/stable/
statsmodels主要是偏向傳統統計分析,比如迴歸分析,方差分析,時間序列等。

  • 迴歸模型:線性迴歸 ,通用線性迴歸,魯邦線性模型 ,線性混合效應模型等
  • 方差分析(ANOVA)
  • 時間序列分析:AR , ARMA , ARIMA , VAR等
  • 非參數方法: 核密度估計 , 核迴歸
  • 統計模型結果可視化

sklearn包介紹:
sklearn官方文檔:https://scikit-learn.org/stable/
sklearn 是一個機器學習包,包括各種機器學習的方法。

  • 分類 :SVM , K近鄰 ,隨機森林 , 邏輯迴歸等
  • 迴歸 :Lasso ,嶺迴歸 等
  • 聚類 :K-means ,譜聚類等
  • 降維 :PCA ,特徵選擇 ,矩陣分解等
  • 模型選擇 :網格搜索, 交叉驗證 ,指標矩陣
  • 預處理: 特徵提取,正態化

來自R語言用戶轉python數據分析的毒打

這毒打甚是酸爽,簡單的迴歸分析,R中一行代碼的事情,在python中差點勸退,這是學藝不精然後丟人現眼的感慨啊!用法不太一樣,習慣很難改,不過隨着python語法的熟悉,套路瞭解之後,就淡定很多,感覺python進行分析時,更偏向底層,R分析時更友好,但是python中的sklearn,通過建立一套規則,之後無論迴歸分析,還是隨機森林,還是嶺迴歸,套路都是一樣的。

sklearn機器學習的一般流程包括:

  • 數據的獲取

  • 特徵的提取

  • 特徵的選擇

  • 數據預處理

  • 模型的訓練

  • 模型的評估

  • 模型的優化

  • 模型持久化


進入正題


這裏,使用Python中的statsmodels和sklearn進行迴歸分析。

1. 數據來源:women

women是R中的一個數據集,我們把它保存到csv文件中:

> data(women)
> write.csv(women,"women.csv",row.names = F)

數據預覽:

2. statsmodels的矩陣的形式

statsmodels有兩種方法,一種是通過numpy矩陣操作的形式運算,這裏的OLS都是大寫,另一種是formula形式,ols是小寫,風格類似R。

import pandas as pd
import statsmodels.api as sm
dat = pd.read_csv("women.csv")
dat.head()
dat.describe()

x = dat['height']
X = x.values.reshape(-1,1) # 轉化爲矩陣形式
y = dat['weight']

# 增加常數項
X1 = sm.add_constant(X)
X1
re = sm.OLS(y,X1).fit() # 注意,這裏y在前面,X在後面
print(re.summary())

代碼思路:

  • 載入pandas,爲了讀取數據
  • 載入statsmodels爲了分析數據
  • 提取height一列,將其變爲矩陣的形式,作爲x變量
  • 提取weight一列,作爲y變量
  • 增加常數(截距)
  • 使用OLS進行模型擬合
  • 查看結果

結果:

結果可以看出,截距爲-87.5167,迴歸係數爲3.45,兩者都達到極顯著水平。R方爲0.991,調和R方爲0.990.

3. statsmodels的formula的形式

statsmodels也可以使用類似R語言,公式的方法進行建模。

import statsmodels.formula.api as smf
smf.ols("weight ~ height",data=dat).fit().summary()

結果:

可以看出,formula和前者的結果完全一致。

4. sklearn的形式

sklearn是非常強大的包,包括很多機器學習的方法,是機器學習的入門包,這裏使用其分析迴歸分析。

from sklearn.linear_model import LinearRegression

mod = LinearRegression()

re = mod.fit(X1,y) # 注意,這裏X在前面,y在後面。
re.coef_
re.intercept_

結果:
在這裏插入圖片描述
結果可以看出,迴歸係數和截距和之前的分析完全一致。

一個坑:
statsmodels中,進行分析時,都是y變量在前面,X變量在後面,比如:

re = sm.OLS(y,X1).fit() # 注意,這裏y在前面,X在後面
smf.ols("weight ~ height",data=dat).fit().summary()

但是sklearn中,X在前面,y在後面,比如:

re = mod.fit(X1,y) # 注意,這裏X在前面,y在後面。

5. R語言作爲對比

> mod = lm(weight ~ height ,data=women)
> summary(mod)

結果:
在這裏插入圖片描述
可以看出,截距爲-87.51667,迴歸係數爲3.45,R方爲0.991,調和R方爲0.9903,和之前的結果完全一致。

6. sklearn用於GWAS和GS的實施

sklearn中機器學習的應用,非常具有代表性,這裏總結sklearn擬合模型三部曲:

  • 第一步:實例化,建立評估模型對象
  • 第二步:通過模型接口訓練模型
  • 第三步:通過模型接口提取需要的信息

以迴歸分析爲例,sklearn是這樣做的:

from sklearn.linear_model import LinearRegression # 載入迴歸分析
mod = LinearRegression() # 第一步:實例化,我們後面就可以用mod去建模了
re = mod.fit(X1,y) # 第二步:通過接口,訓練模型
re.coef_ # 第三步:提取結果信息
re.intercept_ # # 第三步:提取結果信息

上面是迴歸分析,也可以很容易的變爲隨機森林,決策樹之類的方法,舉一反三的感覺不要太爽喔!

然後呢?GWAS和GS什麼鬼?
然後我就想到,通過這種形式去將GWAS和GS的分析放進去,像GS也包括貝葉斯啊,嶺迴歸啊(RRBLUP),參考羣,候選羣,交叉驗證之類的概念,本質上也是機器學習的一種形式,通過這種形式調用,包括後面什麼卷積神經網絡等前沿性的算法考慮在內,然後封裝成一個庫,對外提供接口API,提供參考羣數據,預測候選羣,然後跑各種各樣的模型,出一個最優模型的結果,前景不要太美好……哈哈哈……

我知道,已經有不少研究這樣做了,但是想着自己以後能把比較前沿成熟的算法放到自己工作中,感覺好像已經跨行成功進入人工智能的樣子,套用茂茂的話:“好嗨喲”……

7. 怎麼能少得了嗶哩嗶哩?

推薦書籍,之前寫了一篇西瓜書的讀後感:

上面這兩本書,我是在嗶哩嗶哩上面這個up主推薦的,她是個妹子,還把課講得這麼好,不推薦良心很痛的……

快來關注我吧,看我是如何在進軍機器學習的路上:

信心滿滿離開家,備受打擊咬着牙,以爲堅持能入門,成功勸退臉被打。

閱讀原文,觀看良心up主sklearn教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章