python中不像R中,默认的函数可以做回归分析​​lm​​​,可以做方差分析​​aov​​​,python中进行统计分析需要载入外在的包,这里经常用到的是​​statsmodels​​​和​​sklearn​​​包,​​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)

数据预览:

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

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进行模型拟合
  • 查看结果

结果:

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

结果可以看出,截距为-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()

结果:

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

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

4. sklearn的形式


sklearn是非常强大的包,包括很多机器学习的方法,是机器学习的入门包,这里使用其分析回归分析。


from sklearn.linear_model import LinearRegression

mod = LinearRegression()

re = mod.fit(X1,y) # 注意,这里X在前面,y在后面。
re.coef_
re.intercept_

结果:

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

结果可以看出,回归系数和截距和之前的分析完全一致。

一个坑:

​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)

结果:

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

可以看出,截距为-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. 怎么能少得了哔哩哔哩?

推荐书籍,之前写了一篇西瓜书的读后感:

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

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

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

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


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


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