1 儿童体表面积预测
(本节介绍如何利用线性回归模型进行预测分析)
下表所示为某医院医师测得的10名4岁儿童的身高()、体重(
)与体表面积(
)数据,下面试用线性回归方法确定以身高、体重为自变量,以体表面积为因变量的回归方程:
身高/cm | 体重/kg | 体表面积/m^2 |
---|---|---|
88 | 11 | 5.382 |
87 | 11 | 5.299 |
88 | 12 | 5.358 |
89 | 12 | 5.292 |
87 | 13 | 5.602 |
89 | 13 | 6.014 |
88 | 14 | 5.830 |
90 | 14 | 6.102 |
90 | 15 | 6.075 |
91 | 16 | 6.414 |
- 导入数据
首先导入 Numpy
库:
import numpy as np
利用 Python 中的数组创造一个 Numpy
对象:
# 分别输入第1到第10名儿童的两个特征:
x_train = np.array([[88,11],
[87,11],
[88,12],
[89,12],
[87,13],
[89,13],
[88,14],
[90,14],
[90,15]])
# 对应输入儿童的体表面积
y_train=np.array([5.382,5.299,5.358,5.292,5.602,6.014,5.830,6.102,6.075])
# 输入测试集
x_test=np.array([[89,11],
[91,16]])
y_test=np.array([5.547,6.414])
- 构建模型
导入 sklearn
中的 linear_model
模块,创建一个学习器对象,载入训练集,该对象学习训练集的数据训练模型,调用 predict
方法对测试集进行预测。
from sklearn import linear_model
reg=linear_model.LinearRegression() # 创建学习器对象
reg.fit(x_train,y_train) # 训练模型
reg.predict(x_test) # 对测试集进行预测
创建学习器对象学习训练集,训练模型进行预测,这是 sklearn
库中回归/分类常用的一种模型使用方法。
由于是线性回归,可以利用 reg.coef_
和 reg.intercept_
属性,其中coef_
表示 ,
,
intercept_
代表,则:
reg.predict(x_text)
等价于:
weight=reg.coef_.reshape(-1,1)
reg.intercept_+x_text.dot(weight) # 利用向量点乘获得加权和
- 结果分析
由前面获得的系数可知,体表面积与身高、体重的回归方程为: 为更加直观地分析结果,使用下面的代码导入 可视化 ,且 加入中文 支持:
import matplotlib.pyplot as plt
import matplotlib as mpl
# 中文支持
mpl.rcParams['font.sans-serif']=[u'SimHei'] # 其他的字体有:Fangsong/Heiti/KaiTi
mpl.rcParams['axes.unicode_minus']=False
# 下面进行可视化
y=reg.predict(x_train)
x=np.linspace(5.2,6.4,100)
plt.plot(y,y_train,'ro',x,x,'b--')
plt.xlabel("预测的因变量")
plt.ylabel("实际的因变量")
plt.legend(("预测值x,实际值y","全部吻合的曲线"))
plt.show()

图中,x轴上的数值是预测值,y轴上的数值是实际值,显然若预测值等于实际值,原点将出现在虚线上。也就是说,圆点离虚线越近,说明这个点的预测效果越理想。由图可以看出,大部分圆点都在虚线附近,说明训练结果较为理想。
为了对训练效果进行定量分析,下面利用
sklearn
中的 score()
函数对结果进行打分:
reg.score(x_train,y_train)
reg.score(x_test,y_test)
- 若需要对模型预测准确度进行分析,需对未进入训练集的数据组成测试集进行评判。
- 测试集的打分一般小于训练集的打分。这里数据量较小,因此不具有代表性。
在该方法中国,使用了 残差的评分 概念,公式为 其中,
是第
个样本的预测值,
是样本的平均值,
是第
个样本的实际值。
该公式的数学意义是,希望预测值与实际值越接近越好,也就是越小越好,然而这和样本方差有关,若除以样本的方差
,就可以 统一量纲,以便在不同样本上生成的模型进行比较。
2 影响房价的预测及因素分析
(本节介绍如何利用线性回归模型依据回归系数量化分析特征的影响力)
假设你有一个美国华盛顿地区的朋友向你寻求帮助,要你帮忙挑选房子。你的朋友综合考虑了许多因素,并试图对这些因素进行打分,找出房价影响最大的因素。
波士顿房价数据集来源于 kaggle 比赛数据,包括一些房屋及其所在的区域的信息。建立这些信息与房价的回归方程,并根据训练得到的方程系数找到对房价影响最大的那些特征。
- 导入数据
由于该数据集十分经典,已被 sklearn
库收录,因此这里采用其中的 datasets
模块导入数据。并查看数据的相关信息:
from sklearn import datasets
boston=datasets.load_boston() #载入数据
print(boston.data) #数据特征
print(boston.target) #类标结果
print(u'总行数: ', len(boston.data), len(boston.target)) #数据总行数
print(u'特征数: ', len(boston.data[0])) #每行数据集维数
print(u'数据大小: ', boston.data.shape) #数据大小
print(type(boston.data),type(boston.target)) #数据集类型
这里,boston
是 datasets
的对象 ,其中的 data
属性为特征空间,target
属性为结果
- 数据处理
由于各个特征的取值范围不一样,需要将样本数据进行归一化处理(也称为 无量纲化 ),这样才能通过观察回归系数解释特征和结果的相关性:
from sklearn import preprocessing
min_max_scaler=preprocessing.MinMaxScaler()
boston.data=min_max_scaler.fit_transform(boston.data)
建立训练集与测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=0)
- 观察数据
观察数据的最佳方法之一就是将其可视化。其中一种可视化方法就是 散点图。对于多个特征的数据集可视化,我们采用绘制 散点图矩阵 来进行,其中斜对角线上为每个特征的直方图。
# 创建散点图矩阵
import mglearn
import pandas as pd
import matplotlib.pyplot as plt
df=pd.DataFrame(boston.data,columns=boston.feature_names)
grr=pd.plotting.scatter_matrix(df,c=boston['target'],figsize=(15,15),marker='0',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)
plt.show()

由图我们可以发现,变量之间存在一定的相关关系,因此采用线性回归模型未必能够获得很好的预测结果。不过我们这里主要讨论变量的回归系数解释特征和结果的相关性强弱关系,仍具有一定的可行性。
- 构建模型
创建一个学习器并对样本进行学习:
from sklearn import linear_model
reg=linear_model.LinearRegression() # 创建学习器对象
reg.fit(x_train,y_train) # 训练模型
reg.predict(x_test) # 对测试集进行预测
- 结果分析
预测结果的可视化分析:
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# 中文支持
mpl.rcParams['font.sans-serif']=[u'SimHei']
mpl.rcParams['axes.unicode_minus']=False
# 下面进行可视化
y=reg.predict(x_train)
x=np.linspace(5.2,6.4,100)
plt.plot(y,y_train,'ro',x,x,'b--')
plt.xlabel("预测的因变量")
plt.ylabel("实际的因变量")
plt.legend(("预测值x,实际值y","全部吻合的曲线"))
plt.show()

由图可以看出,大部分圆点都在虚线附近,说明训练结果较为理想。同时我们可以发现,模型存在一些异常点,这些应该进行剔除(这里暂不进行这一步,大家可以自行思考)。
利用 sklearn
中的 score()
函数对结果进行打分:
In[29]: reg.score(x_train, y_train)
Out[29]: 0.7697699488741149
In[29]: reg.score(x_test, y_test)
Out[30]: 0.6354638433202122
为了量化每个特征的影响力,打印每个特征的回归系数:
In[31]: np.set_printoptions(suppress=True,precision=4) #设置打印格式
...: print(reg.coef_)
Out[31]: [-10.4749 4.4017 -0.1574 2.3934 -7.5765 19.6702 -0.6831 -15.7801
5.5219 -5.9198 -9.2641 3.3489 -18.088 ]
系数的绝对值大小,可以说明他们对房价影响大小。且系数为正是正相关,系数为负是负相关。
3 练习题
- 剔除波士顿房价数据集的异常点并重新建模
-
提高波士顿房价数据集线性回归的 预测准确度
提示:特征工程(如:主成分分析、因子分析等) -
利用线性回归进行糖尿病预测
提示:diabetes = datasets.load_diabetes()
diabetes
数据集是一个糖尿病的数据集,主要包括442行数据,10个属性值,分别是:Age(年龄)、性别(Sex)、Body mass index(体质指数)、Average Blood Pressure(平均血压)、S1~S6一年后疾病级数指标。Target为一年后患疾病的定量指标。
网友评论