线性回归-BOSTON房价预测为例

1. 本质,求权值 

 y = \sum XiWi  已知Xi 如何求取Wi

2. 变量之间的关系

        a. 函数关系 

                y = f(x)  y是x的函数

        b 相关关系 (correlation)变量之间存在着不确定的关系

3.简单线性回归(一元线性回归)

        回归是类似于相关分析的统计技术

                对于x和y这样的连续变量,可以用相关系数r 表示

、             更直观的就是回归方程: x就是实际取值 y(predicted value)

        

        前提:x y 线性相关      \hat{y} = bx + a  \hat{y}表示变量y的预测值 b表示未标准化的回归系数或者斜率 a表示截距

例子:    

调查对象受教育水平(年)月收入(千)
161
281.5
3111
4122
5124
6132.5
7145
8166
91610
10218
标准差(s)4.253.12
相关系数相关系数(0.83)

 

                \hat{y} = bx + a 最小二乘法求系数 

    

经典的回归案例:Boston房价回归预测

波士顿房屋的数据于1978年开始统计,共506个数据点,涵盖了波士顿不同郊区房屋的14种特征信息。在这里,选取房屋价格(MEDV)、每个房屋的房间数量(RM)两个变量进行回归,其中房屋价格为目标变量,每个房屋的房间数量为特征变量。将数据导入进来,并进行初步分析。

1)数据预处理

导入数据并做相关转换。

import matplotlib.pyplot as plt  # import matplotlib library

import numpy as np      #导入numpy库

import pandas as pd     #导入pandas库

from sklearn.datasets import load_boston  #从sklearn数据集库导入boston数据

boston=load_boston()    #从读取的房价数据存储在boston变量中

print(boston.keys())    #打印boston包含元素

print(boston.feature_names)   #打印boston变量名

在波士顿房屋价格数据集中,data即为特征变量,target为目标变量,选取data中的RM、target中的MEDV变量进行单变量线性回归。

# data特征变量的前五行数据

bos = pd.DataFrame(boston.data)  #将data转换为DataFrame格式以方便展示

print (bos[5].head())   #data的第6列数据为RM

# 把target打印出来

bos_target = pd.DataFrame(boston.target)    #将target转换为DataFrame格式以方便展示

print(bos_target.head())

绘制房屋价格(MEDV)、每个房屋的房间数量(RM)的散点图。

# 绘制房屋价格(MEDV)、每个房屋的房间数量(RM)的散点图

X = bos.iloc[:,5:6]  #选取data中的RM变量

y = bos_target       #设定target为y

plt.scatter(X, y)    #绘制散点图

plt.xlabel(u'MEDV')  #x轴标签

plt.ylabel(u'RM')    #y轴标签

plt.title(u'The relation of RM and PRICE') #标题

plt.show()

通过散点图可以看出,房屋价格(MEDV)、每个房屋的房间数量(RM)存在着一定的线性变化趋势,即每个房屋的房间数量越多,房屋价格越高。

下面就可以用单变量线性回归算法进一步进行拟合与预测。

2)数据集划分:

数据集的划分可以采用Scikit-learn库中的model-selection程序包来实现。

# 数据集划分

from sklearn.model_selection import train_test_split  #导入数据划分包

# 把X、y转化为数组形式,以便于计算

X = np.array(X.values)  

y = np.array(y.values)

# 以25%的数据构建测试样本,剩余作为训练样本

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25)

X_train.shape,X_test.shape,y_train.shape,y_test.shape

3)训练模型

from sklearn.linear_model import LinearRegression  #使用LinearRegression库

lr=LinearRegression()   #设定回归算法

lr.fit(X_train,y_train) #使用训练数据进行参数求解

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

输出的是LinearRegreesion()中的相关参数的设置。

  1. fit_intercept:表示是否队训练数据进行中心化,若为false,则表示输入的数据已经进行了中心化处理,下面的过程里将不需要在进行中心化处理。
  2. normalize:默认为False,表示是否对数据进行标准化处理。
  3. copy_X:默认为True,表示是否对X复制。如果选择False,则直接对原数据进行覆盖,即经过中心化、标准化后,是否把新数据覆盖到原数据上。
  4. n_jobs:默认为1,表示计算时设置的任务个数。如果选择-1,则代表使用所有的CPU。

print ('求解截距项为:',lr.intercept_)  #打印截距的值

print ('求解系数为:',lr.coef_)         #打印权重向量的值

4)模型预测

基于对参数的求解结果,对测试集进行预测。

y_hat = lr.predict(X_test) #对测试集的预测

y_hat[0:9]  #打印前10个预测值

5)模型评估

对拟合与预测结果进行效果评价,以判断求解结果是否良好。#y_test与y_hat的可视化

plt.figure(figsize=(10,6))  #设置图片尺寸

t = np.arange(len(X_test))  #创建t变量

plt.plot(t, y_test, 'r', linewidth=2, label='y_test') #绘制y_test曲线

plt.plot(t, y_hat, 'g', linewidth=2, label='y_hat')   #绘制y_hat曲线

plt.legend() #设置图例

plt.xlabel('test data')

plt.ylabel('price')

plt.show()

图形显示,测试集中房屋价格(MEDV)的预测值基本较好地拟合了真实值y_test的变化趋势。

plt.figure(figsize=(10,6))   #绘制图片尺寸

plt.plot(y_test,y_hat,'o')   #绘制散点

plt.plot([-10,60],[-10,60], color="red", linestyle="--", linewidth=1.5)

plt.axis([-10,60,-10,60])

plt.xlabel('ground truth')   #设置X轴坐标轴标签

plt.ylabel('predicted')      #设置y轴坐标轴标签

plt.grid()  #绘制网格线

from sklearn import metrics

from sklearn.metrics import r2_score

# 拟合优度R2的输出方法一

print ("r2:",lr.score(X_test, y_test))  #基于Linear-Regression()的回归算法得分函数,来对预测集的拟合优度进行评价

# 拟合优度R2的输出方法二

print ("r2_score:",r2_score(y_test, y_hat)) #使用metrics的r2_score来对预测集的拟合优度进行评价

# 用scikit-learn计算MAE

print ("MAE:", metrics.mean_absolute_error(y_test, y_hat)) #计算平均绝对误差

# 用scikit-learn计算MSE

print ("MSE:", metrics.mean_squared_error(y_test, y_hat))  #计算均方误差

# # 用scikit-learn计算RMSE

print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat))) #计算均方根误差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值