02-06 普通线性回归(波斯顿房价预测)+特征选择

普通线性回归(波士顿房价预测)

导入模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties
from sklearn.linear_model import LinearRegression
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

获取数据

  housing-data.txt数据下载地址https://pan.baidu.com/s/1SvG0hFxupYA3KQO4fLsP5A

打印数据

df = pd.read_csv('housing-data.txt', sep='\s+', header=0)
df.head()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATMEDV
00.0063218.02.3100.5386.57565.24.09001296.015.3396.904.9824.0
10.027310.07.0700.4696.42178.94.96712242.017.8396.909.1421.6
20.027290.07.0700.4697.18561.14.96712242.017.8392.834.0334.7
30.032370.02.1800.4586.99845.86.06223222.018.7394.632.9433.4
40.069050.02.1800.4587.14754.26.06223222.018.7396.905.3336.2

在这里插入图片描述

特征选择

散点图矩阵

  使用sns库的pairplot()方法绘制的散点图矩阵可以查看数据集内部特征之间的关系,例如可以观察到特征间分布关系以及离群样本。

  本文只绘制了三列(RM、MEDV(标记)、LSTAT)特征和标记之间的联系,有兴趣的可以调用该方法查看其它特征之间的关系。

# 选择三列特征
cols = ['RM', 'MEDV', 'LSTAT']
# 构造三列特征之间的联系即构造散点图矩阵
sns.pairplot(df[cols], height=3)
plt.tight_layout()
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jSnsxnKD-1582629343165)(02-06%20%E6%99%AE%E9%80%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E6%96%AF%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29%2B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9_files/02-06%20%E6%99%AE%E9%80%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E6%96%AF%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29%2B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9_10_0.png)]

  上图可以看出第一行(RM)第二列(MEDV)的特征与标记存在线性关系;第二行(MEDV)第二列(MEDV)即MEDV值可能呈正态分布。

关联矩阵

  使用sns.heatmap()方法绘制的关联矩阵可以看出特征之间的相关性大小,关联矩阵是包含皮尔森积矩相关系数的正方形矩阵,用来度量特征对之间的线性依赖关系。

# 求解上述三列特征的相关系数
'''
对于一般的矩阵X,执行A=corrcoef(X)后,A中每个值的所在行a和列b,反应的是原矩阵X中相应的第a个列向量和第b个列向量的
相似程度(即相关系数)
'''
cm = np.corrcoef(df[cols].values.T)
# 控制颜色刻度即颜色深浅
sns.set(font_scale=2)
# 构造关联矩阵
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={
                 'size': 20}, yticklabels=cols, xticklabels=cols)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCxb0EG3-1582629343165)(02-06%20%E6%99%AE%E9%80%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E6%96%AF%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29%2B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9_files/02-06%20%E6%99%AE%E9%80%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E6%96%AF%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29%2B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9_14_0.png)]

  上图可以看出特征LSTAT和标记MEDV的具有最高的相关性-0.74,但是在散点图矩阵中会发现LSTAT和MEDV之间存在着明显的非线性关系;而特征RM和标记MEDV也具有较高的相关性0.70,并且从散点矩阵中会发现特征RM和标记MEDV之间存在着线性关系。因此接下来将使用RM作为线性回归模型的特征。

训练模型

X = df[['RM']].values
y = df['MEDV'].values

lr = LinearRegression()
lr.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
         normalize=False)

可视化

plt.scatter(X, y, c='r', s=30, edgecolor='white',label='训练数据')
plt.plot(X, lr.predict(X), c='g')
plt.xlabel('平均房间数目[MEDV]', fontproperties=font)
plt.ylabel('以1000美元为计价单位的房价[RM]', fontproperties=font)
plt.title('波士顿房价预测', fontproperties=font, fontsize=20)
plt.legend(prop=font)
plt.show()
print('普通线性回归斜率:{}'.format(lr.coef_[0]))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htYhmJ4s-1582629343165)(02-06%20%E6%99%AE%E9%80%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E6%96%AF%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29%2B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9_files/02-06%20%E6%99%AE%E9%80%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E6%96%AF%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29%2B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9_19_0.png)]

普通线性回归斜率:9.10210898118031

  使用RANSAC算法之后可以发现线性回归拟合的线与未用RANSAC算法拟合出来的线的斜率不同,可以说RANSAC算法降低了离群值潜在的影响,但是这并不能说明这种方法对未来新数据的预测性能是否有良性影响。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值