多元线性回归算法预测房价——Excel、jupyter+sklearn

一、多元线性回归

1. 定义

在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

2. 数据清洗

多元线性回归属于监督机器学习算法,通过已知数据训练得到模型或决策函数。应用此算法时,不能盲目地套用算法,必须对数据的有效性、正确性、假设合理性进行验证,如果发现数据本身不正确,就需要纠正。

数据清洗

  • 缺失值处理
    异常值处理

2.1 缺失值处理

删除法

删除观测样本
删除变量
使用完整原始数据进行分析
改变权重

插补法

抽样填补
均值差补
回归模型
热平台差补
冷平台差补
拉格朗日插值法
随机森林插值

替换法

缺失值所在变量为数值型:用该变量在其他所有对象的取值的均值/特定值来替换变量的缺失值
缺失值所在变量为非数值型:用该变量其他全部有效观测值的中位数或众数进行替换

参考: http://blog.csdn.net/qq_31584157/article/details/52562830

2.2 异常值(离群点)处理

异常值定义:测定值中与平均值的偏差超过三倍标准差的值
异常值大概包括离群值、重复值、数据不一致。

1.判断异常值方法汇总

简单统计量分析:描述性统计,判断变量的取值是否超出合理的范围
3O原则:正态分布假设下,P(|x-u|>3o)<=0.003,属于极个别的小概率事件
箱型图分析:1.5倍四分位间距的值
图像法汇总:绘制直方图、绘制点图、绘制箱形图、绘制qq图、绘制单变量散点图
局部异常因子检测:基于密度识别异常值的算法,只对数值型数据有效
通过聚类检测异常值

2.异常值处理方法(数据光滑)
分析异常值出现的原因,再判断是否取舍,如果数据正确,可直接在数据上进行挖掘建模

删除法:直接把相应的记录删除
把异常值视为缺失值:利用缺失值处理的方法进行处理
平均值修正:可用前后两个观测值的平均值修正该异常值
不处理:直接在具有异常值的数据集上进行挖掘建模

3. 特征共线性问题

  1. 定义

多重共线性(Multicollinearity)是指线性回归模型中的自变量之间由于存在高度相关关系而使模型的权重参数估计失真或难以估计准确的一种特性,多重是指一个自变量可能与多个其他自变量之间存在相关关系。

多重共线性是使用线性回归算法时经常要面对的一个问题。在其他算法中,例如决策树或者朴素贝叶斯,前者的建模过程时逐渐递进,每次都只有一个变量参与,这种机制含有抗多重共线性干扰的功能;后者假设变量之间是相互独立的。但对于回归算法来说,都要同时考虑多个预测因子,因此多重共线性通常不可避免。

  1. 检测方法

二、用Excel做房价预测线性回归

1. 配置Excel

用Excel做线性回归前的具体配置准备步骤,请参照上次博客《用Excel+Anoconda-jupyter做线性回归》中的1.1。

2. 完善数据集

2.1 剔除错误数据

数据集中部分数据存在错误,在对数据进行分析之前,需要剔除错误数据。

此处剔除卧室数和洗浴间数都为0的数据。

选中一组bedroombathroom都为0的数据:

请添加图片描述

筛选不正常数据:

请添加图片描述

选中序号为蓝色及前面一组序号为黑色的所有行,删除:

请添加图片描述

此时是不是看不到其他正常数据了?这时候我们点一下上面的筛选,就能显示删除不正常的数据后的全部的数据了。

请添加图片描述

当做其他线性回归时,或者其他需要筛选步骤的,都可用此方法查找数据。

2.2 处理非数据数值

线性回归中经常会遇到非数值型数据,即分类型数据,比如性别、所属省份、专业类型等等
分类型数据无法量化,一般会采用哑数据进行处理
如某个数据分为A、B、C三类,即可采用两个哑数据a,b
类型为A时,a=1,b=0
类型为B时,a=0,b=1
类型为C时,a=0,b=0
不使用a,b,c三个哑数据,是因为如果哑数据个数与分类数相同时,恒有a+b+c=1,会存在多重共线性问题
所以在N分类时,一般使用N-1个哑数据

  1. 在我们的数据集中neighborhood和style栏是非数值数据,在neighborhood一栏中将A,B,C以二进制编码表示为10,01,00,也就是十进制的2,1,0。
  2. 在style一栏中同理可得ranch,victorian,lodge为2,1,0。
    方法:点击菜单栏的开始,找到查找和选择,点击选择替换,根据上述替换数据。

在替换的时候一定要勾选区分大小写:

在这里插入图片描述

3. Excel做线性回归

  1. 数据选择:

①Excel中——数据——数据分析

在这里插入图片描述

② 选择回归

在这里插入图片描述

在这里插入图片描述

  1. 得到结果:

在这里插入图片描述

通过P-value一栏可以得到房屋面积和价格的相关性最强。

根据表中数据得到回归方程:
y= -0.45723 x1 -28426 x2 +345.9623 x3 +4509.576 x4 -2915.15 x5 +2128.176 x6
r²=0.723794

三、用jupyter+sklearn做线性回归练习

1. 打开jupyter步骤

点开Windows

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.写入代码

2.1 不做数据处理

①代码(以下代码可分步进行):

#引入包
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn import datasets
from sklearn.linear_model import LinearRegression

df = pd.read_csv('D:\\**\\house_prices.csv')#读取文件,此处为自己的文件的路径
df.info()#显示列名和数据类型类型
df.head(6)#显示前n行,n默认为5

#取出自变量
data_x=df[['area','bedrooms','bathrooms']]# x
data_y=df['price']# y

# 进行多元线性回归
model=LinearRegression()
l_model=model.fit(data_x,data_y)
print('参数权重')
print(model.coef_)
print('模型截距')
print(model.intercept_)

②显示结果:
在这里插入图片描述

2.2 进行数据处理

①代码(同样按间隔,可分步进行):

#引入包
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn import datasets
from sklearn.linear_model import LinearRegression


df = pd.read_csv('D:\\**\\house_prices.csv')#读取文件,此处为自己的文件的路径
df.info()#显示列名和数据类型类型
df.head(6)#显示前n行,n默认为5


# 异常值处理
# ================ 异常值检验函数:iqr & z分数 两种方法 =========================
def outlier_test(data, column, method=None, z=2):
    """ 以某列为依据,使用 上下截断点法 检测异常值(索引) """
    """ 
    full_data: 完整数据
    column: full_data 中的指定行,格式 'x' 带引号
    return 可选; outlier: 异常值数据框 
    upper: 上截断点;  lower: 下截断点
    method:检验异常值的方法(可选, 默认的 None 为上下截断点法),
            选 Z 方法时,Z 默认为 2
    """
    # ================== 上下截断点法检验异常值 ==============================
    if method == None:
        print(f'以 {
      
      column} 列为依据,使用 上下截断点法(iqr) 检测异常值...')
        print('=' * 70)
        # 四分位点;这里调用函数会存在异常
        column_iqr = np.quantile(data[column], 0.75) - np.quantile(data[column], 0.25)
        # 1,3 分位数
        (q1, q3) = np.quantile(data[column], 0.25), np.quantile(data[column], 0.75)
        # 计算上下截断点
        upper, lower = (q3 + 1.5 * column_iqr), (q1 - 1.5 * column_iqr)
        # 检测异常值
        outlier = data[(data[column] <= lower) | (data[column] >= upper)]
        print(f'第一分位数: {
      
      q1}, 第三分位数:{
      
      q3}, 四分位极差:{
      
      column_iqr}')
        print(f"上截断点:{
      
      upper}, 下截断点:{
      
      lower}")
        return outlier, upper, lower
    # ===================== Z 分数检验异常值 ==========================
    if method == 'z':
        """ 以某列为依据,传入数据与希望分段的 z 分数点,返回异常值索引与所在数据框 """
        """ 
        params
        data: 完整数据
        column: 指定的检测列
        z: Z分位数, 默认为2,根据 z分数-正态曲线表,可知取左右两端的 2%,
           根据您 z 分数的正负设置。也可以任意更改,知道任意顶端百分比的数据集合
        """
        print(f'以 {
      
      column} 列为依据,使用 Z 分数法,z 分位数取 {
      
      z} 来检测异常值...')
        print('=' * 70)
        # 计算两个 Z 分数的数值点
        mean, std = np.mean(data[column]), np.std(data[column])
        upper, lower = (mean + z * std), (mean - z * std)
        print(f"取 {
      
      z} 个 Z分数:大于 {
      
      upper} 或小于 {
      
      lower} 的即可被视为异常值。")
        print('=' * 70)
        # 检测异常值
        outlier = data[(data[column] <= lower) | (data[column] >= upper)]
        return outlier, upper, lower


outlier, upper, lower = outlier_test(data=df, column='price', method='z')#获得异常数据
outlier.info(); outlier.sample(5)
df.drop(index=outlier.index, inplace=True)#丢弃异常数据


#取出自变量
data_x=df[['area','bedrooms','bathrooms']]
data_y=df['price']


# 进行多元线性回归并得出结果
model=LinearRegression()
l_model=model.fit(data_x,data_y)
print('参数权重')
print(model.coef_)
print('模型截距')
print(model.intercept_)

② 显示结果
在这里插入图片描述

四、用线性回归模型的统计学库实现

① 代码:

#引入包
import pandas as pd
import numpy as np
import seaborn as sns
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from statsmodels.formula.api import ols #相比前面新引入的包


df = pd.read_csv('D:\\**\\house_prices.csv')#读取文件,此处为自己的文件的路径
df.info()#显示列名和数据类型类型
df.head(6)#显示前n行,n默认为5


#不使用虚拟变量
lm = ols('price ~ area + bedrooms + bathrooms', data=df).fit()
lm.summary()

②结果显示

在这里插入图片描述

  1. 我们可以用以下代码来查看相关性(当出现多元共线性时):

①代码

def vif(df, col_i):
    """
    df: 整份数据
    col_i:被检测的列名
    """
    cols = list(df.columns)
    cols.remove(col_i)
    cols_noti = cols
    formula = col_i + '~' + '+'.join(cols_noti)
    r2 = ols(formula, df).fit().rsquared
    return 1. / (1. - r2)
test_data = results[['area', 'bedrooms', 'bathrooms', 'A', 'B']]
for i in test_data.columns:
    print(i, '\t', vif(df=test_data, col_i=i))

② 结果显示:
在这里插入图片描述

可见bedroom和bathroom相关程度较高。

  1. 这时我们去掉bedroom

①代码

# 去掉bedroom再次建模
lm = ols(formula='price ~ area + bathrooms', data=df).fit()
lm.summary()

②结果显示

在这里插入图片描述

小小的总结

  1. 在做多元线性回归时,虽然自变量越多并不一定得到结果的就越准确,但多个自变量的最优组合共同来预测或估计因变量,比只用某些自变量进行预测或估计更有效,更符合实际。
  2. 多元线性回归属于监督机器学习算法,通过已知数据训练得到模型或决策函数。应用此算法时,不能盲目地套用算法,必须对数据的有效性、正确性、假设合理性进行验证,如果发现数据本身不正确,就需要纠正。一定要对数据进行预处理,数据对结果有很大的影响,特别在错误数据很多的时候。

参考文献

  1. 多元线性回归算法预测房价
  2. 多元线性回归分析
  3. 数据预处理:数据探索与数据清洗(缺失值+异常值)、数据集成+数据规约+数据变换
  4. 特征共线性问题
  5. 多重共线性(统计累赘)的概念、特征及其测量方式和处理方式

Guess you like

Origin blog.csdn.net/YouthBlood9/article/details/120964132