多元线性回归算法预测房价

文章目录

      • 一.多元线性回归
        • 1.常见数据预处理
          • 1.1数据挖掘中使用数据的原则
          • 1.2常见的数据预处理方法
        • 2.数据清洗
          • 2.1缺失值处理的方法
          • 2.2噪声数据处理
            • 2.2.1分箱的方法:有4种:等深分箱法、等宽分箱法、最小熵法和用户自定义区间法。
            • 2.2.2数据平滑方法
        • 3.数据集成
        • 4.数据变换
          • 数据变换策略主要包括以下几种:
        • 5.数据归约
        • 6.特征共线性
          • 6.1产生原因
          • 6.2判别多重共线性
          • 6.3影响
          • 6.4处理原则
          • 6.5处理方法
        • 7.参数估计
            • 7.1普通最小二乘估计
            • 7.2最大似然估计
            • 7.3矩估计
      • 二.用EXcel做房价预测线性回归
        • 1.剔除数据
        • 2.非数值数据处理
        • 3.使用Excel实现回归
      • 三.用Sklearn库做房价预测线性回归
      • 四.总结
      • 五.参考链接:

一.多元线性回归

1.常见数据预处理

原始数据存在的几个问题:不一致;重复;含噪声;维度高。

1.1数据挖掘中使用数据的原则
  • 尽可能赋予属性名和属性值明确的含义;
  • 去除惟一属性;
  • 去除重复性;
  • 合理选择关联字段。
1.2常见的数据预处理方法
  • 数据清洗:数据清洗的目的不只是要消除错误、冗余和数据噪音,还要能将按不同的、不兼容的规则所得的各种数据集一致起来。
  • 数据集成:将多个数据源中的数据合并,并存放到一个一致的数据存储(如数据仓库)中。这些数据源可能包括多个数据库、数据立方体或一般文件。
  • 数据变换:找到数据的特征表示,用维度变换来减少有效变量的数目或找到数据的不变式,包括规格化、规约、切换和投影等操作。
  • 数据规约:是在对发现任务和数据本身内容理解的基础上,寻找依赖于发现目标的表达数据的有用特征,以缩减数据模型,从而在尽可能保持数据原貌的前提下最大限度的精简数据量,主要有两个途径:属性选择和数据抽样,分别针对数据库中的属性和记录。
2.数据清洗
2.1缺失值处理的方法

删除法(根据数据处理的不同角度,删除法可分为以下4种):

  • (1)删除观测样本
  • (2)删除变量:当某个变量缺失值较多且对研究目标影响不大时,可以将整个变量整体删除
  • (3)使用完整原始数据分析:当数据存在较多缺失而其原始数据完整时,可以使用原始数据替代现有数据进行分析;
  • (4)改变权重:当删除缺失数据会改变数据结构时,通过对完整数据按照不同的权重进行加工,可以降低删除数据带来的偏差。

插补法(在条件允许的情况下,找到缺失值的替代值进行插补,尽可能还原真实数据是更好的方法。常见的方法有均值插补、回归插补、二阶插补、热平台、冷平台等单一变量插补。):

  • (1)均值法是通过计算缺失值所在变量所有非缺失观测值的均值,使用均值来代替缺失值的插补方法。
  • (2)均值法不能利用相关变量信息,因此会存在一定偏差,而回归模型是将需要插补变量作为因变量,其他相关变量作为自变量,通过建立回归模型预测出因变量的值对缺失变量进行插补。
  • (3)热平台插补是指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。
  • (4)在实际操作中,尤其当变量数量很多时,通常很难找到与需要插补样本完全相同的样本,此时可以按照某些变量将数据分层,在层中对缺失值使用均值插补,即采取冷平台插补法。
2.2噪声数据处理

噪声是一个测量变量中的随机错误和偏差,包括错误值或偏离期望的孤立点值。

  • 噪声检查中比较常见的方法:

    • (1)通过寻找数据集中与其他观测值及均值差距最大的点作为异常
    • (2)聚类方法检测,将类似的取值组织成“群”或“簇”,落在“簇”集合之外的值被视为离群点。
  • 在进行噪声检查后,通常采用分箱、聚类、回归、计算机检查和人工检查结合等方法“光滑”数据,去掉数据中的噪声。

    分箱:分箱方法是一种简单常用的预处理方法,通过考察相邻数据来确定最终值。所谓“分箱”,实际上就是按照属性值划分的子区间,如果一个属性值处于某个子区间范围内,就称把该属性值放进这个子区间所代表的“箱子”内。把待处理的数据(某列属性值)按照一定的规则放进一些箱子中,考察每一个箱子中的数据,采用某种方法分别对各个箱子中的数据进行处理。在采用分箱技术时,需要确定的两个主要问题就是:如何分箱以及如何对每个箱子中的数据进行平滑处理。

2.2.1分箱的方法:有4种:等深分箱法、等宽分箱法、最小熵法和用户自定义区间法。
  • 等深分箱法(统一权重):将数据集按记录行数分箱,每箱具有相同的记录数,每箱记录数称为箱子的深度。这是最简单的一种分箱方法。
设定权重(箱子深度)为4,分箱后
箱1:800 1000 1200 1500
箱2:1500 1800 2000 2300 
箱3:2500 2800 3000 3500
箱4:4000 4500 4800 5000  12345
  • 等宽分箱法(统一区间):使数据集在整个属性值的区间上平均分布,即每个箱的区间范围是一个常量,称为箱子宽度。
设定区间范围(箱子宽度)为1000元人民币,分箱后
箱1:800 1000 1200 1500 1500 1800
箱2:2000 2300 2500 2800 3000
箱3:3500 4000 4500
箱4:4800 5000 12345
  • 用户自定义区间:用户可以根据需要自定义区间,当用户明确希望观察某些区间范围内的数据分布时,使用这种方法可以方便地帮助用户达到目的。
如将客户收入划分为1000元以下、1000~2000、2000~3000、3000~4000和4000元以上几组,分箱后
箱1:800 
箱2:1000 1200 1500 1500 1800 2000 
箱3:2300 2500 2800 3000  
箱4:3500 4000 
箱5:4500 4800 5000 
2.2.2数据平滑方法
  • 按平均值平滑 :对同一箱值中的数据求平均值,用平均值替代该箱子中的所有数据。
  • 按边界值平滑:用距离较小的边界值替代箱中每一数据。
  • 按中值平滑:取箱子的中值,用来替代箱子中的所有数据。
3.数据集成

数据集成中的两个主要问题是:

(1)如何对多个数据集进行匹配,当一个数据库的属性与另一个数据库的属性匹配时,必须注意数据的结构;

(2)数据冗余。两个数据集有两个命名不同但实际数据相同的属性,那么其中一个属性就是冗余的。

4.数据变换
数据变换策略主要包括以下几种:
  • 光滑:去掉噪声;
  • 属性构造:由给定的属性构造出新属性并添加到数据集中。例如,通过“销售额”和“成本”构造出“利润”,只需要对相应属性数据进行简单变换即可
  • 聚集:对数据进行汇总。比如通过日销售数据,计算月和年的销售数据;
  • 规范化:把数据单按比例缩放,比如数据标准化处理;
  • 离散化:将定量数据向定性数据转化。比如一系列连续数据,可用标签进行替换(0,1);
5.数据归约

数据归约通常用维归约、数值归约方法实现。维归约指通过减少属性的方式压缩数据量,通过移除不相关的属性,可以提高模型效率。常见的维归约方法有:分类树、随机森林通过对分类效果的影响大小筛选属性;小波变换、主成分分析通过把原数据变换或投影到较小的空间来降低维数。

6.特征共线性

多重共线性是指自变量之间存在一定程度的线性相关,会给变量对模型的贡献性带来影响。即若有两个变量存在共线性,在相互作用计算后,其一的变量的影响会相对减弱,而另一个变量的作用却会相对增强。

6.1产生原因

(1)没有足够多的样本数据
(2)选取的样本之间本身就客观存在共线性关系
(3)其他因素导致:数据采集所采用的方法,模型的设定,一个过度决定的模型

多数研究者认为特征共线性本质上由于样本数据不足引起

6.2判别多重共线性

(1)系数估计值符号不对
(2)删除某一不太重要的特征,结果发生显著变化
(3)方差膨胀因子(vif)检验

6.3影响

(1)难以区分每个解释变量对结果的影响 / 难以区分每个解释变量的单独影响;

(2)回归模型缺乏稳定性(稳定性指从同一个总体中抽取不同的样本估计模型,得到的估计值不会完全相

​ 同,但也不会有很大的差别,当模型存在多重共线性时,样本数据有了微小的数据变换,都可能导致系

​ 数估计值发生显著变化,甚至出现符号错误)

(3) 回归模型缺乏稳定性。样本的微小扰动都可能带来参数很大的变化;

(4) 变量的显著性检验失去意义;

(5) 影响模型的泛化误差。

6.4处理原则

(1)多重共线性普遍存在,程度不一,轻微的多重共线性问题可不采取措施

(2)严重的多重共线性问题,一般可根据经验或通过分析回归结果发现。如影响系数符号,重要的解释变量t值很低

(3)若模型仅用于预测,只要拟合程度好,可不处理多重共线性

6.5处理方法

(1)增加样本数据量

(2)采用逐步回归结合主观分析的方法,从少到多的做特征选择

(3)从共线问题的自变量中剔除一些不重要的变量

7.参数估计
7.1普通最小二乘估计

最小二乘估计法是对过度确定系统,即其中存在比未知数更多的方程组,以**回归分析**求得近似解的标准方法。在这整个解决方案中,最小二乘法演算为每一方程式的结果中,将残差平方和的总和最小化

最重要的应用是在曲线拟合上。最小平方所涵义的最佳拟合,即残差(残差为:观测值与模型提供的拟合值之间的差距)平方总和的最小化。当问题在自变量有重大不确定性时,那么使用简易回归和最小二乘法会发生问题;在这种情况下,须另外考虑变量-误差-拟合模型所需的方法,而不是最小二乘法。

最小平方问题分为两种:线性或普通的最小二乘法,和非线性的最小二乘法,取决于在所有未知数中的残差是否为线性。线性的最小平方问题发生在统计回归分析中;它有一个封闭形式的解决方案。非线性的问题通常经由迭代细致化来解决;在每次迭代中,系统由线性近似,因此在这两种情况下核心演算是相同的。

最小二乘法所得出的多项式,即以拟合曲线的函数来描述自变量与预计应变量的变异数关系。

当观测值来自指数族且满足轻度条件时,最小平方估计和最大似然估计是相同的。最小二乘法也能从动差法得出。

回归分析的最初目的是估计模型的参数以便达到对数据的最佳拟合。在决定一个最佳拟合的不同标准之中,最小二乘估计法是非常优越的。这种估计可以表示为

在这里插入图片描述

7.2最大似然估计

给定一个概率分布D,假定其概率密度函数(连续分布)或概率聚集函数(离散分布)为f**D,以及一个分布参数θ,我们可以从这个分布中抽出一个具有n个值的采样X1,X2,…,Xn,通过利用f**D,我们就能计算出其概率:

在这里插入图片描述

但是,我们可能不知道θ的值,尽管我们知道这些采样数据来自于分布D。那么我们如何才能估计出θ呢?一个自然的想法是从这个分布中抽出一个具有n个值的采样X1,X2,…,Xn,然后用这些采样数据来估计θ。

一旦我们获得,我们就能从中找到一个关于θ的估计。最大似然估计会寻找关于
θ的最可能的值(即,在所有可能的θ取值中,寻找一个值使这个采样的“可能性”最大化)。这种方法正好同一些其他的估计方法不同,如θ的非偏估计,非偏估计未必会输出一个最可能的值,而是会输出一个既不高估也不低估的θ值。

要在数学上实现最大似然估计法,我们首先要定义可能性:

在这里插入图片描述

并且在θ的所有取值上,使这个函数最大化。这个使可能性最大的值即被称为θ的最大似然估计

7.3矩估计

矩估计,即矩估计法,也称“矩法估计”,就是利用样本矩来估计总体中相应的参数。首先推导涉及相关参数的总体(即所考虑的随机变量的幂的期望值)的方程。然后取出一个样本并从这个样本估计总体矩。接着使用样本矩取代(未知的)总体矩,解出感兴趣的参数。从而得到那些参数的估计。

二.用EXcel做房价预测线性回归

1.剔除数据

如图所示:

在这里插入图片描述

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

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

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个哑数据

在数据中neighborhood和style栏是非数值数据,在neighborhood一栏中将A,B,C以二进制编码表示为10,01,00,也就是十进制的2,1,0。

在style一栏中同理可得ranch,victorian,lodge为2,1,0。

点击菜单栏的开始,找到查找和选择,点击选择替换,选中需要处理的数据列,根据上述替换数据。

3.使用Excel实现回归

在这里插入图片描述

根据表中数据得到回归方程
y=-9109.9x1+345.41x2-1645.87x3+7907.17x4+4524.79x5

r²=0.622195

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

三.用Sklearn库做房价预测线性回归

代码:

#导入相关库
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split #这里是引用了交叉验证
from sklearn.linear_model import LinearRegression  #线性回归
from sklearn.linear_model import Lasso, Ridge, LinearRegression as LR
from sklearn.metrics import r2_score, explained_variance_score as EVS, mean_squared_error as MSE
from sklearn.model_selection import train_test_split, cross_val_score
from pandas.core.accessor import register_dataframe_accessor

#读入数据
data=pd.read_csv('D:/house_prices.csv')
x = data[['neighborhood','area','bedrooms','bathrooms','style']]# 特征数据,自变量
y= data['price']# 标签值,因变量

#以8:2的比例分成训练集与测试集
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, random_state=1)

reg = LR().fit(x_train, y_train)  # 训练模型
yhat = reg.predict(x_test)  # 基于测试集x去预测标签
print("r² = ",r2_score(y_test,yhat))#判定系数R²

f = open("多元线性回归.txt", 'w+', encoding='utf8')
f.write("参数为:" + str(reg.coef_)+"\t\n")  # 得到各个特征的系数
f.write("截距为:" + str(reg.intercept_)+"\t\n")  # 得到截距,常数c
f.write("均方差为:" + str(MSE(y_test, yhat))+"\t\n")  # 均方差(绝对值)
f.write('平均误差相对于样本真实值平均值的比例为:'+str(np.sqrt(MSE(y_test, yhat)) /y_test.mean())+"\t\n")  # 平均误差相对于样本真实值平均值的比例
f.write("判定系数R²为:"+str(r2_score(y_test,yhat))+"\t\n")
#print("R²的均值为:",r²_score(y_test,yhat))
f.write(("可解释方差为:"+str(cross_val_score(reg, x, y, cv=5, scoring="explained_variance")) ))
f.close()

得出r²=0.6123538857467424

参数为:[-4100.19318121 345.25308485 2966.20096372 3932.51688274
4200.13783087]
截距为:-5118.2579364771955
均方差为:94832750958.33032
平均误差相对于样本真实值平均值的比例为:0.3801539086677292
判定系数R²为:0.6123538857467424
可解释方差为:[0.60892115 0.63216779 0.61917468 0.61916186 0.62563534]

模型优化:

# 设置虚拟变量
# 以名义变量 neighborhood 街区为例
nominal_data = df['neighborhood']
# 设置虚拟变量
dummies = pd.get_dummies(nominal_data)
dummies.sample() # pandas 会自动帮你命名
# 每个名义变量生成的虚拟变量中,需要各丢弃一个,这里以丢弃C为例
dummies.drop(columns=['C'], inplace=True)
dummies.sample()
AB
22510
# 将结果与原数据集拼接
results = pd.concat(objs=[df, dummies], axis='columns') # 按照列来合并
results.sample(3)
# 对名义变量 style 的处理可自行尝试
house_idneighborhoodareabedroomsbathroomsstylepriceAB
55632789B234842ranch117025501
19493481A88221ranch23105510
26592494C86300lodge22610700
import statsmodels.api as sm
from statsmodels.formula.api import ols # ols 为建立线性回归模型的统计学库
from statsmodels.stats.anova import anova_lm

# 再次建模
lm = ols('price ~ area + bedrooms + bathrooms + A + B', data=results).fit()
lm.summary()
Dep. Variable:priceR-squared:0.919
Model:OLSAdj. R-squared:0.919
Method:Least SquaresF-statistic:1.372e+04
Date:Sun, 24 Oct 2021Prob (F-statistic):0.00
Time:14:44:29Log-Likelihood:-80347.
No. Observations:6028AIC:1.607e+05
Df Residuals:6022BIC:1.607e+05
Df Model:5
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
Intercept-2.031e+056025.392-33.7030.000-2.15e+05-1.91e+05
area344.38613.62095.1360.000337.290351.482
bedrooms5609.34435136.2691.0920.275-4459.5821.57e+04
bathrooms-4900.94237146.730-0.6860.493-1.89e+049109.207
A-77.91674965.730-0.0160.987-9812.5259656.691
B5.244e+054687.543111.8670.0005.15e+055.34e+05
Omnibus:138.205Durbin-Watson:2.002
Prob(Omnibus):0.000Jarque-Bera (JB):168.990
Skew:0.306Prob(JB):2.02e-37
Kurtosis:3.545Cond. No.1.19e+04

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.19e+04. This might indicate that there are
strong multicollinearity or other numerical problems.

四.总结

基于统计分析库statsmodels实现的线性回归的r²稍大于Excel和Sklearn库实现的线性回归。模型优化后,r²大大提高。

五.参考链接:

https://blog.csdn.net/yehui_qy/article/details/53791006

https://blog.csdn.net/sunflower_sara/article/details/81320968

https://blog.csdn.net/YangMax1/article/details/120812509

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值