Python数据科学:线性回归
02 多元线性回归
多元线性回归是在简单线性回归的基础上,增加更多的自变量。
二元线性回归是最简单的多元线性回归。
其中一元回归拟合的是一条回归线,那么二元回归拟合的便是一个回归平面。
在多元线性回归中,要求自变量与因变量之间要有线性关系,且自变量之间的相关系数要尽可能的低。
回归方程中与因变量线性相关的自变量越多,回归的解释力度就越强。
若方程中非线性相关的自变量越多,那么模型解释力度就越弱。
可以使用调整后的R?(与观测个数及模型自变量个数有关)来评价回归的优劣程度,即评价模型的解释力度。
下面还是以书中的案例,实现一个多元线性回归。
分析客户年龄、年收入、小区房屋均价、当地人均收入与信用卡月均支出的关系。
# 使用多元线性回归建立模型
lm_m = ols('avg_exp ~ Age + Income + dist_home_val + dist_avg_income', data=exp).fit()
print(lm_m.summary())
多元线性回归模型信息如下。
输出R为0.542,调整R?为0.513。
方程显著性(回归系数不全为0)的检验P值为1.82e-10,接近于0,说明回归方程是有意义的。
客户年龄、小区房屋均价的回归系数都不显著。
年收入、当地人均收入的回归系数显著。
多元线性回归可以根据向前法、向后法、逐步法来对自变量进行筛选。
向前法就是不断加入变量去构建回归方程,向后法则是不断去除变量去构建回归方程,逐步法是两者的结合,又加入又删除的。
三种方法都是基于AIC准则(最小信息准则),其中AIC值越小说明模型效果越好,越简洁。
使用AIC准则能够避免变量的增加成为残差平方和减小的主要原因情况的发生,防止模型复杂度的增加。
本次采用向前回归法,不断加入变量,得到加入后变量的AIC值,最后找到解释力度最大的变量。
# 向前回归法
def forward_select(data, response):
"""data是包含自变量及因变量的数据,response是因变量"""
# 获取自变量列表
remaining = set(data.columns)
remaining.remove(response)
selected = []
# 定义数据类型(正无穷)
current_score, best_new_score = float('inf'), float('inf')
# 自变量列表含有自变量时
while remaining:
aic_with_candidates = []
# 对自变量列表进行循环
for candidates in remaining:
# 构建表达式,自变量会不断增加
formula = "{} ~ {}".format(response, ' + '.join(selected + [candidates]))
# 生成自变量的AIC解释力度
aic = ols(formula=formula, data=data).fit().aic
# 得到自变量的AIC解释力度列表
aic_with_candidates.append((aic, candidates))
# 对解释力度列表从大到小排序
aic_with_candidates.sort(reverse=True)
# 得到解释力度最大值(AIC值最小)及自变量
best_new_score, best_candidate = aic_with_candidates.pop()
# 1.正无穷大大于解释力度最大值 2.上一期实验的AIC值需大于下一期的AIC实验值,即添加变量越多,AIC值应该越小,模型效果越好
if current_score > best_new_score:
# 移除影响最大的自变量
remaining.remove(best_candidate)
# 添加影响较大的自变量
selected.append(best_candidate)
# 赋值本次实验的AIC值
current_score = best_new_score
print('aic is {},continue!'.format(current_score))
else:
print('forward selection over!')
break
# 采用影响较大的自变量列表,对数据做线性回归
formula = "{} ~ {}".format(response, ' + '.join(selected))
print('final formula is {}'.format(formula))
model = ols(formula=formula, data=data).fit()
return model
# 采用向前回归法筛选变量,利用筛选的变量构建回归模型
data_for_select = exp[['avg_exp', 'Income', 'Age', 'dist_home_val', 'dist_avg_income']]
lm_m = forward_select(data=data_for_select, response='avg_exp')
print(lm_m.rsquared)
输出结果。
发现客户年龄(Age)被筛除了,最终得到线性回归模型。
/ 03 / 总结
这里只是构建了一下线性回归模型而已,只能说凑合着用。
后面还将对模型进行诊断,使得模型更具有参考价值。
未完待续...
最新活动更多
-
2月28日火热报名中>> 【免费试用】东集技术年终福利——免费试用活动
-
即日-3.21立即报名 >> 【深圳 IEAE】2025 消费新场景创新与实践论坛
-
4日10日立即报名>> OFweek 2025(第十四届)中国机器人产业大会
-
7.30-8.1火热报名中>> 全数会2025(第六届)机器人及智能工厂展
-
即日-2025.8.1立即下载>> 《2024智能制造产业高端化、智能化、绿色化发展蓝皮书》
-
精彩回顾立即查看>> 【限时免费】安森美:Treo 平台带来出色的精密模拟
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论