机器学习 | 使用statsmodels和sklearn进行回归分析

记录一下使用Python进行的单变量回归分析的操作流程。另外推荐一个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. 怎么能少得了哔哩哔哩?

「推荐书籍」,之前写了一篇西瓜书的读后感:如何学习GWAS以及安利西瓜书,没有给出书名,差评!这里贴出书名,据说网上有电子版的,但是对于买书当作防身的我,纸质书还是更有安全感。

上面这两本书,我是在哔哩哔哩上面,看到这个up主推荐的,她是个妹子,还把课讲得这么好,不推荐良心很痛的……

「快来关注我吧,看我是如何在进军机器学习的路上:」

  • 信心满满离开家,
  • 备受打击咬着牙,
  • 以为坚持能入门,
  • 成功劝退脸被打。

「阅读原文,观看良心up主sklearn教程」


本文分享自微信公众号 - 育种数据分析之放飞自我(R-breeding)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部