多元线性回归练习-预测房价

目的:

找到数据集中关于特征的描述。使用数据集中的其他变量来构建最佳模型以预测平均房价。

数据集说明:

数据集总共包含506个案例。

每种情况下,数据集都有14个属性:

特征说明
MedianHomePrice房价中位数
CRIM人均城镇犯罪率
ZN25,000平方英尺以上土地的住宅用地比例
INDIUS每个城镇非零售业务英亩的比例。
CHAS查尔斯河虚拟变量(如果束缚河,则为1;否则为0)
NOX-氧化氮浓度(百万分之一)
RM每个住宅的平均房间数
AGE1940年之前建造的自有住房的比例
DIS到五个波士顿就业中心的加权距离
RAD径向公路的可达性指数
TAX每10,000美元的全值财产税率
PTRATIO各镇师生比例
B1000(Bk-0.63)^ 2,其中Bk是按城镇划分的黑人比例
LSTAT人口状况降低百分比
MEDV自有住房的中位价格(以$ 1000为单位)

设定库和数据。

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
from patsy import dmatrices
import matplotlib.pyplot as plt
%matplotlib inline

np.random.seed(42)

#加载内置数据集,了解即可
boston_data = load_boston()
df = pd.DataFrame()
df['MedianHomePrice'] = boston_data.target
df2 = pd.DataFrame(boston_data.data)
df2.columns = boston_data.feature_names
df = df.join(df2)
df.head()
MedianHomePriceCRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
024.00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.98
121.60.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.14
234.70.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.03
333.40.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.94
436.20.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.33
1.获取数据集中每个特征的汇总

使用 corr 方法计算各变量间的相关性,判断是否存在多重线性。

#绘制热力图
import seaborn as sns
plt.subplots(figsize=(10,10))#调节图像大小
sns.heatmap(df.corr(), annot = True, vmax = 1, square = True, cmap='RdPu')

在这里插入图片描述

2.拆分数据集

创建一个 training 数据集与一个 test 数据集,其中20%的数据在 test 数据集中。将结果存储在 X_train, X_test, y_train, y_test 中。

X = df.drop('MedianHomePrice' , axis=1, inplace=False)
y = df['MedianHomePrice']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42 )
3.标准化

使用 [StandardScaler]来缩放数据集中的所有 x 变量。将结果存储在 X_scaled_train 中。

#把y_train的索引改为从0开始,因为原索引与下面的training_data索引不一致,合并会出错
y_train = pd.Series(y_train.values)
#使用 StandardScaler 来缩放数据集中的所有 x 变量,将结果存储在 X_scaled_train 中。 
X_scaled_train = StandardScaler()

#创建一个 pandas 数据帧并存储缩放的 x 变量以及 y_train。命名为 training_data 。
training_data = X_scaled_train.fit_transform(X_train)
training_data = pd.DataFrame(training_data, columns = X_train.columns)

training_data['MedianHomePrice'] = y_train
training_data.head()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATMedianHomePrice
01.287702-0.5003201.033237-0.2780890.489252-1.4280691.028015-0.8021731.7068911.5784340.845343-0.0743371.75350512.0
1-0.336384-0.500320-0.413160-0.278089-0.157233-0.680087-0.4311990.324349-0.624360-0.5846481.2047410.430184-0.56147419.9
2-0.4032531.013271-0.715218-0.278089-1.008723-0.402063-1.6185991.330697-0.974048-0.602724-0.6371760.065297-0.65159519.4
30.388230-0.5003201.033237-0.2780890.489252-0.3004500.591681-0.8392401.7068911.5784340.845343-3.8681931.52538713.4
4-0.325282-0.500320-0.413160-0.278089-0.157233-0.8310940.033747-0.005494-0.624360-0.5846481.2047410.379119-0.16578718.2
4.模型1:所有特征

对训练集training_data进行线性拟合,查看p值判断显著性

#用所有的缩放特征来拟合线性模型,以预测此响应(平均房价)。不要忘记添加一个截距。
training_data['intercept'] = 1
X_train1= training_data.drop('MedianHomePrice' , axis=1, inplace=False)
lm = sm.OLS(training_data['MedianHomePrice'], X_train1)
result = lm.fit()
result.summary()
OLS Regression Results
Dep. Variable:MedianHomePrice R-squared: 0.751
Model:OLS Adj. R-squared: 0.743
Method:Least Squares F-statistic: 90.43
Date:Sun, 10 May 2020 Prob (F-statistic):6.21e-109
Time:20:22:27 Log-Likelihood: -1194.3
No. Observations: 404 AIC: 2417.
Df Residuals: 390 BIC: 2473.
Df Model: 13
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
CRIM -1.0021 0.308 -3.250 0.001 -1.608 -0.396
ZN 0.6963 0.370 1.882 0.061 -0.031 1.423
INDUS 0.2781 0.464 0.599 0.549 -0.634 1.190
CHAS 0.7187 0.247 2.914 0.004 0.234 1.204
NOX -2.0223 0.498 -4.061 0.000 -3.001 -1.043
RM 3.1452 0.329 9.567 0.000 2.499 3.792
AGE -0.1760 0.407 -0.432 0.666 -0.977 0.625
DIS -3.0819 0.481 -6.408 0.000 -4.027 -2.136
RAD 2.2514 0.652 3.454 0.001 0.970 3.533
TAX -1.7670 0.704 -2.508 0.013 -3.152 -0.382
PTRATIO -2.0378 0.321 -6.357 0.000 -2.668 -1.408
B 1.1296 0.271 4.166 0.000 0.596 1.663
LSTAT -3.6117 0.395 -9.133 0.000 -4.389 -2.834
intercept 22.7965 0.236 96.774 0.000 22.333 23.260
Omnibus:133.052 Durbin-Watson: 2.114
Prob(Omnibus): 0.000 Jarque-Bera (JB): 579.817
Skew: 1.379 Prob(JB): 1.24e-126
Kurtosis: 8.181 Cond. No. 9.74


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
5.判断解释变量间是否存在相关性:

计算训练集中的vif

#计算数据集中每个 x_variable 的 vif
def vif_calculator(df, response):
    '''
    INPUT:
    df - 包含x和y的数据集
    response - 反应变量的列名string
    OUTPUT:
    vif - a dataframe of the vifs
    '''
    df2 = df.drop(response, axis = 1, inplace=False)#删除反应变量列
    features = "+".join(df2.columns)
    y, X = dmatrices(response + ' ~' + features, df, return_type='dataframe')
    vif = pd.DataFrame()
    vif["VIF Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
    vif["features"] = X.columns
    vif = vif.round(1)
    return vif
vif = vif_calculator(training_data, 'MedianHomePrice')
vif
C:\ProgramData\Anaconda3\lib\site-packages\statsmodels\regression\linear_model.py:1685: RuntimeWarning: divide by zero encountered in double_scalars
  return 1 - self.ssr/self.centered_tss
VIF Factorfeatures
00.0Intercept
11.7CRIM
22.5ZN
33.9INDUS
41.1CHAS
54.5NOX
61.9RM
73.0AGE
84.2DIS
97.7RAD
108.9TAX
111.9PTRATIO
121.3B
132.8LSTAT
140.0intercept

结合vif、相关性和p值,判断要删除哪些变量:

vif限制在4以内。INDUS、RAD、TAX、NOX的VIF较大

TAX 和 RAD 之间具有强相关性,INDUS 和 NOX 也是如此,因此,每组相关性高的变量只要删除一个就能有效地减小另一个的 VIF。

p值限制在0.05以内。AGE和INDUS的p值较大。

根据查看 p 值和VIF的结果,如果选择保留RAD和INDUS,那么删除 AGE、 NOX 与TAX,删掉这些特征之后,用剩余的特征拟合一个新的线性模型。

6.模型2:删除 AGE、 NOX 与TAX
X_train1 = training_data.drop(['AGE','NOX','TAX','MedianHomePrice'] , axis=1, inplace=False)
lm1 = sm.OLS(training_data['MedianHomePrice'], X_train1)
result1 = lm1.fit()
result1.summary()
OLS Regression Results
Dep. Variable:MedianHomePrice R-squared: 0.733
Model:OLS Adj. R-squared: 0.727
Method:Least Squares F-statistic: 108.1
Date:Sun, 10 May 2020 Prob (F-statistic):2.77e-106
Time:21:02:41 Log-Likelihood: -1208.0
No. Observations: 404 AIC: 2438.
Df Residuals: 393 BIC: 2482.
Df Model: 10
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
CRIM -0.9116 0.317 -2.876 0.004 -1.535 -0.289
ZN 0.5622 0.363 1.548 0.123 -0.152 1.276
INDUS -0.8746 0.411 -2.128 0.034 -1.683 -0.067
CHAS 0.6896 0.252 2.738 0.006 0.194 1.185
RM 3.2406 0.330 9.818 0.000 2.592 3.889
DIS -2.1728 0.434 -5.010 0.000 -3.025 -1.320
RAD 0.4380 0.389 1.126 0.261 -0.327 1.202
PTRATIO -1.6369 0.310 -5.288 0.000 -2.246 -1.028
B 1.2106 0.279 4.345 0.000 0.663 1.758
LSTAT -3.9851 0.381 -10.470 0.000 -4.733 -3.237
intercept 22.7965 0.243 93.916 0.000 22.319 23.274
Omnibus:126.568 Durbin-Watson: 2.033
Prob(Omnibus): 0.000 Jarque-Bera (JB): 542.197
Skew: 1.310 Prob(JB): 1.83e-118
Kurtosis: 8.034 Cond. No. 4.66


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

根据p值,应删除 RAD ,保留其他变量。

7.模型3:删除 AGE、 NOX 、TAX、RAD
X_train2 = training_data.drop(['AGE','NOX','TAX','RAD', 'MedianHomePrice'] , axis=1, inplace=False)
lm2 = sm.OLS(training_data['MedianHomePrice'], X_train2)
result2 = lm2.fit()
result2.summary()
OLS Regression Results
Dep. Variable:MedianHomePrice R-squared: 0.733
Model:OLS Adj. R-squared: 0.726
Method:Least Squares F-statistic: 119.9
Date:Sun, 10 May 2020 Prob (F-statistic):4.60e-107
Time:21:02:09 Log-Likelihood: -1208.6
No. Observations: 404 AIC: 2437.
Df Residuals: 394 BIC: 2477.
Df Model: 9
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
CRIM -0.7616 0.288 -2.647 0.008 -1.327 -0.196
ZN 0.6151 0.360 1.707 0.089 -0.093 1.323
INDUS -0.7544 0.397 -1.900 0.058 -1.535 0.026
CHAS 0.7067 0.252 2.810 0.005 0.212 1.201
RM 3.3022 0.326 10.142 0.000 2.662 3.942
DIS -2.2235 0.432 -5.153 0.000 -3.072 -1.375
PTRATIO -1.5090 0.288 -5.239 0.000 -2.075 -0.943
B 1.1502 0.273 4.206 0.000 0.613 1.688
LSTAT -3.9413 0.379 -10.406 0.000 -4.686 -3.197
intercept 22.7965 0.243 93.884 0.000 22.319 23.274
Omnibus:134.948 Durbin-Watson: 2.028
Prob(Omnibus): 0.000 Jarque-Bera (JB): 619.161
Skew: 1.381 Prob(JB): 3.56e-135
Kurtosis: 8.399 Cond. No. 4.36


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

仔细检查所有的 VIF 是否小于4。与先前模型相比,Rsquared 值没有发生变化。

training_data2 = training_data.drop(['AGE','NOX','TAX','RAD'] , axis=1, inplace=False)
vif = vif_calculator(training_data2, 'MedianHomePrice')
vif
VIF Factorfeatures
00.0Intercept
11.4CRIM
22.2ZN
32.7INDUS
41.1CHAS
51.8RM
63.2DIS
71.4PTRATIO
81.3B
92.4LSTAT
100.0intercept
8.模型评估

对各个模型的测试预测值和实际测试值的匹配度进行打分

#含有全部变量的模型
lm_full = LinearRegression()
lm_full.fit(X_train, y_train)
lm_full.score(X_test, y_test)#打分
0.66848257539715972
#删除AGE、NOX、TAX
X_train_red = X_train.drop(['AGE','NOX','TAX'] , axis=1, inplace=False)
X_test_red = X_test.drop(['AGE','NOX','TAX'] , axis=1, inplace=False)

#删除 AGE、 NOX 、TAX、RAD
X_train_red2 = X_train.drop(['AGE','NOX','TAX','RAD'] , axis=1, inplace=False)
X_test_red2 = X_test.drop(['AGE','NOX','TAX','RAD'] , axis=1, inplace=False)

lm_red = LinearRegression()#删除AGE、NOX、TAX的模型
lm_red.fit(X_train_red, y_train)
print(lm_red.score(X_test_red, y_test))#打分

lm_red2 = LinearRegression()#删除 AGE、 NOX 、TAX、RAD的模型
lm_red2.fit(X_train_red2, y_train)
print(lm_red2.score(X_test_red2, y_test))#打分

0.639421781821
0.63441065636

从评分可以看出,在此测试集中,拥有所有变量的模型表现最佳。后续可以用交叉验证 (即在多个训练和测试集里重复这一操作)来确定模型效果是否有稳定性。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面我将为您介绍一个经典的机器学习案例--波士顿房价预测,使用的是线性回归模型。 首先,我们需要导入相关的库和数据集。可以通过以下代码实现: ```python import numpy as np import pandas as pd from sklearn.datasets import load_boston boston = load_boston() df = pd.DataFrame(boston.data, columns = boston.feature_names) df['Price'] = boston.target ``` 接下来,我们需要对数据集进行预处理和划分,以便于训练和测试模型。可以通过以下代码实现: ```python X = df.iloc[:, :-1].values y = df.iloc[:, -1].values from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0) from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) ``` 接着,我们可以使用线性回归模型进行训练和预测。可以通过以下代码实现: ```python from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, y_train) y_pred = regressor.predict(X_test) ``` 最后,我们可以使用评估指标来评价模型的表现。可以通过以下代码实现: ```python from sklearn.metrics import r2_score r2_score(y_test, y_pred) ``` 这里使用了平均绝对误差(MAE)、均方误差(MSE)和决定系数(R2)三个评估指标。常见的评估指标还包括均方根误差(RMSE)和平均绝对百分比误差(MAPE)等。 以上就是一个简单的线性回归案例--波斯顿房价预测的实现过程,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值