您当前的位置: 首页 >  Python

Python 实战多元线性回归模型,附带原理+代码

CSDN 程序人生 发布时间:2020-08-08 10:00:00 ,浏览量:3

作者 | 萝卜

来源 | 早起Python( ID:zaoqi-python )

「多元线性回归模型」非常常见,是大多数人入门机器学习的第一个案例,尽管如此,里面还是有许多值得学习和注意的地方。其中多元共线性这个问题将贯穿所有的机器学习模型,所以本文会「将原理知识穿插于代码段中」,争取以不一样的视角来叙述和讲解「如何更好的构建和优化多元线性回归模型」。主要将分为两个部分:

  • 详细原理

  • Python 实战

Python 实战

Python 多元线性回归的模型的实战案例有非常多,这里虽然选用的经典的房价预测,但贵在的流程简洁完整,其中用到的精度优化方法效果拔群,能提供比较好的参考价值。

数据探索

本文的数据集是经过清洗的美国某地区的房价数据集。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('house_prices.csv')
df.info();df.head()

参数说明:

  • neighborhood/area: 所属街区和面积

  • bedrooms/bathrooms: 卧室和浴室

  • style: 房屋样式

多元线性回归建模

现在我们直接构建多元线性回归模型:

from statsmodels.formula.api import ols
                      # 小写的 ols 函数才会自带截距项,OLS 则不会
         # 固定格式:因变量 ~ 自变量(+ 号连接)
lm = ols('price ~ area + bedrooms + bathrooms', data=df).fit()
lm.summary()

红框为我们关注的结果值,其中截距项 Intercept 的 P 值没有意义,可以不用管它。

模型优化

从上图可以看到,模型的精度较低,因为还有类别变量 neighborhood 和 style 没有完全利用。这里我们先查看一下类别变量的类别分布情况:

# 类别变量,又称为名义变量,nominal variables
nominal_vars = ['neighborhood', 'style']

for each in nominal_vars:
    print(each, ':')
    print(df[each].agg(['value_counts']).T)  # Pandas 骚操作
    # 直接 .value_counts().T 无法实现下面的效果
     ## 必须得 agg,而且里面的中括号 [] 也不能少
    print('='*35)
虚拟变量的设置

因为类别变量无法直接放入模型,这里需要转换一下,而多元线性回归模型中类别变量的转换最常用的方法之一便是将其转化成虚拟变量。原理其实非常简单,将无法直接用于建模的名义变量转换成可放入模型的虚拟变量的核心就短短八个字:「四散拆开,非此即彼」。下面用一个只有 4 行的微型数据集辅以说明。

从上表中,不难发现:

  • 该名义变量有 n 类,就能拆分出 n 个虚拟变量。

  • 巧妙的使用 0 和 1 来达到「用虚拟变量列代替原名义变量所在类别」。

接下来要做的就是将生成的虚拟变量们放入多元线性回归模型,但要注意的是:「转化后的虚拟变量们需要舍弃一个」,才能得到满秩矩阵。具体原因和有关线性代数的解释可以查看笔者打包好的论文,我们可以理解为,当该名义变量可划分为 n 类时,只需要 n-1 个虚拟变量就已足够获知所有信息了。该丢弃哪个,可根据实际情况来决定。

因此为原数据集的某名义变量添加虚拟变量的步骤为:

  • 抽出希望转换的名义变量(一个或多个)

  • pandas 的 get_dummies 函数

  • 与原数据集横向拼接

注意虚拟变量设置成功后,需要与原来的数据集拼接,这样才能将其一起放进模型。

再次建模后,发现模型精度大大提升,但潜在的多元共线性问题也随之显现出来。

在解释模型中虚拟变量的系数之前,我们先消除模型中多元共线性的影响,因为在排除共线性后,模型中的各个自变量的系数又会改变,最终的多元线性回归模型的等式又会不一样。多重线性回归模型的主要假设之一是我们的预测变量(自变量)彼此不相关。我们希望预测变量(自变量)与反应变量(因变量)相关,而不是彼此之间具有相关性。方差膨胀因子 ( Variance Inflation Factor,以下简称 VIF ),是「指解释变量之间存在多重共线性时的方差与不存在多重共线性时的方差之比」。

上图公式可以看出在方差膨胀因子的检测中:

  • 每个自变量都会有一个膨胀因子值  ,最后根据值的大小来选择是否删减。

  • 既然   表示相关性,是谁跟谁的相关性呢? 是自变量中的某一变量与除它外剩余的自变量进行多元线性回归,取回归结果,即模型精度来作为这个变量与剩余自变量的相关性。听起来可能有点绕,这里举一下实例:用 “面积、卧室数量和浴室数量” 作为自变量来预测房价,在进行自变量的方差膨胀因子的检测时,面积、卧室数和浴室数轮流做单独的因变量,剩下的两个变量作为自变量,来看看这三个自变量中哪个变量对其余两个变量的解释性高。

  •    越大,如已经到了 0.9,那分母就很小,  值就等于 10,即表示这个自变量已经同时解释了另外的某个或多个自变量,存在多元共线性,可以考虑删除一些自变量。

VIF 越大,显示共线性越严重。经验判断方法表明:当 0< VIF
关注
打赏
1688896170
查看更多评论

CSDN 程序人生

暂无认证

  • 3浏览

    0关注

    1989博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0939s