记录一下使用Python进行的单变量回归分析的操作流程。另外推荐一个sklearn机器学习的哔哩哔哩视频(文末阅读原文,进行观看)。
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文件中:
代码语言:javascript复制> data(women)
> write.csv(women,"women.csv",row.names = F)
「数据预览:」
2. statsmodels的矩阵的形式
代码语言:javascript复制❝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的形式
代码语言:javascript复制❝statsmodels也可以使用类似R语言,公式的方法进行建模。 ❞
import statsmodels.formula.api as smf
smf.ols("weight ~ height",data=dat).fit().summary()
结果:
可以看出,formula和前者的结果完全一致。
4. sklearn的形式
代码语言:javascript复制❝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语言作为对比
代码语言:javascript复制> 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是这样做的:」
代码语言:javascript复制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主推荐的,她是个妹子,还把课讲得这么好,不推荐良心很痛的……
「快来关注我吧,看我是如何在进军机器学习的路上:」
- 信心满满离开家,
- 备受打击咬着牙,
- 以为坚持能入门,
- 成功劝退脸被打。