当前位置: 代码迷 >> 综合 >> 回归模型--由浅入深
  详细解决方案

回归模型--由浅入深

热度:45   发布时间:2023-12-04 05:14:13.0

5.1回归思想的起源

“回归”是由英国著名生物学家兼统计学家高尔顿(Francis Galton,1822~1911.生物学家达尔文的表弟)在研究人类遗传问题时提出来的。为了研究父代与子代身高的关系,高尔顿搜集了1078对父亲及其儿子的身高数据。他发现这些数据的散点图大致呈直线状态,也就是说,总的趋势是父亲的身高增加时,儿子的身高也倾向于增加。但是,高尔登对试验数据进行了深入的分析,发现了一个很有趣的现象—回归效应。因为当父亲高于平均身高时,他们的儿子身高比他更高的概率要小于比他更矮的概率;父亲矮于平均身高时,他们的儿子身高比他更矮的概率要小于比他更高的概率。它反映了一个规律,即这两种身高父亲的儿子的身高,有向他们父辈的平均身高回归的趋势。对于这个一般结论的解释是:大自然具有一种约束力,使人类身高的分布相对稳定而不产生两极分化,这就是所谓的回归效应。

1855年, 高尔顿发表《遗传的身高向平均数方向的回归》一文,他和他的学生卡尔?皮尔逊Karl·Pearson通过观察1078对夫妇的身高数据,以每对夫妇的平均身高作为自变量,取他们的一个成年儿子的身高作为因变量,分析儿子身高与父母身高之间的关系,发现父母的身高可以预测子女的身高,两者近乎一条直线。当父母越高或越矮时,子女的身高会比一般儿童高或矮,他将儿子与父母身高的这种现象拟合出一种线形关系,分析出儿子的身高y与父亲的身高x大致可归结为一下关系: 

y=33.73+0.516*x (单位为英寸) 

根据换算公式1英寸=0.0254米, 1米=39.37英寸。单位换算成米后:

Y= 0.8567+0.516*X  (单位为米)

假如父母辈的平均身高为1.75米,则预测子女的身高为1.7597米。

这种趋势及回归方程表明父母身高每增加一个单位时,其成年儿子的身高平均增加0.516个单位。这就是回归一词最初在遗传学上的含义。

有趣的是,通过观察,高尔顿还注意到,尽管这是一种拟合较好的线形关系,但仍然存在例外现象:矮个父母所生的儿子比其父要高,身材较高的父母所生子女的身高却回降到多数人的平均身高。换句话说,当父母身高走向极端,子女的身高不会像父母身高那样极端化,其身高要比父母们的身高更接近平均身高,即有“回归”到平均数去的趋势,这就是统计学上最初出现“回归”时的涵义,高尔顿把这一现象叫做“向平均数方向的回归” (regression toward mediocrity)。即回归的本意是寻求每个自变量的不确定取值的均值。虽然这是一种特殊情况,与线形关系拟合的一般规则无关,但“线形回归”的术语却因此沿用下来,作为根据一种变量(父母身高)预测另一种变量(子女身高)或多种变量关系的描述方法。

回归的现代意义:

它要比其原始意义广泛的多。具体地说,回归分析的内容包括:

?   确定响应变量与预报变量间的回归模型,即变量间相关关系的数学表达式(通常称为经验公式);

?   根据样本估计并检验回归模型及未知参数;

?   从众多的预报变量中,判断哪些变量对响应变量的影响是显著的,哪些是不显著的;

?   根据预报变量的已知值或给定值来估计或预测响应变量的平均值并给出预测精度或根据响应变量的给定值来估计预报变量的值,即所谓的预报与控制问题。

通过上述讲解大家知道了回归的由来和现代意义之后,是否会疑惑到底什么是回归?它有哪些类型?各个类型之间又有什么区别呢?

除了统计模型和其他的一些算法,回归是机器学习成功运行的重要构成要素。回归的核心是寻找变量之间的关系,而机器学习需要根据这种关系来预测结果。

显然,任何称职的机器学习工程师都应重视回归,但回归也有很多种。线性回归和逻辑回归通常是人们最先学习的算法,然而还有许多回归类型。每种类型都有各自的重要性,并且有最适合应用的情境。那么,该用哪一种呢?

下文将用通俗易懂的方式介绍最常用的回归类型,遇到具体任务时你便知晓该使用哪一种。

首先大家常常听见线性回归这一术语,那么什么是线性回归?是否又存在非线性回归呢?当然存在。那二者的区别与联系又是什么呢?

线性与非线性并不是说因变量与自变量间是直线或曲线关系,而是说因变量是否能用自变量的线性组合来表示。如果经过变量转换,两个变量可以用线性来表达关系,那么可以用线性回归来分析该问题。但经过变量变化后,两个变量关系仍然不能用线性形式来表达,则就会用到非线性回归分析方法。下文将一一分析二者的特点。

1.线性回归

线性回归是试图在一堆数据中训练得到自变量x和因变量y中一组线性关系,如

例如把人脚底板长度作为自变量,身高作为因变量,那么在这两种数据之间就可以做一个简单线性回归,可以得到脚底板长度和身高的关系式。

线性回归在图形上常表现为

2. 线性回归的目标函数

要想求得这组线性关系,即求得相应的回归系数的值。那么先讲解一下线性回归的目标函数。

假设一堆数据中因变量为y,自变量为

对其进行线性回归,求得结果会如下所示:


其中w0是x0=1的系数,表示为全局偏移量,在平面直线中的具体意义为截距,也作为自变量的一个维度,其中w就是我们需要求得的。那么怎么去求得这个w呢?假设一共有m个样本,对于第i个数据,有

对于一个样本来说,

为一个样本存在的误差。显然求得需要的w的方法,就是找出使误差最小的w,然而使用这个误差的简单累加将使得正差值和负差值抵消,所以我们采用均方误差,那么对于全部的m个样本来说,总误差为

均方误差是回归任务中最常用的性能度量,有非常好的几何意义,它对应了常用的欧几里得距离或简称“欧氏距离”。

显然我们需要这个总误差的值为最小,所以取目标函数为

求这个目标函数最小值时的w,就是我们需要的w了。

3.非线性回归

如果回归模型的因变量是自变量的一次以上函数形式,回归规律在图形上表现为形态各异的各种曲线,如下图所示,称为非线性回归,这类模型称为非线性回归模型。在许多实际问题中,回归函数往往是较复杂的非线性函数。非线性函数的求解一般分为将非线性可变换成线性和不能变换成线性两大类。

非线性回归举例

例1:血中药物浓度和时间曲线呈非线性关系。

这个是根据专业背景知识而判断。药物不可能马上见效,也许在血液中逐步或者突然见效。

例2:身高和体重,在青少年中,是呈直线关系,因为,青少年在不断成长,但是,对于整个人的生命周期,确是曲线关系 因为,成年人的身高一般是确定的。

像这样的例子根本用直线回归拟合不了,也称为非本质线性模型。对于这种实际情况,可以使用非线性回归的分段模型。最终目的是使残差平方和最小。也就是在图形中跟大多数散点接近。


5.2 单变量线性回归——波士顿房价预测4                                 
5.2.1波士顿房价预测问题及建模

人类生活的现实社会经常遇到分类与预测的问题,目标变量可能受多个因素影响,根据相关系数可以判断影响因子的重要性。 正如一个病人得某种病是多种因素影响造成的。 房价的高低也是受多个因素影响的,如房子所处的城市是一线还是二线,房子周边交通方便程度如通不通地铁,房子周边学校和医院等,这些都影响了房子的价格。 医学领域根据自变量以及某个阈值判断病因归属。 生物领域根据父辈的基因经过回归分析判断对子辈的影响等。下文给大家通过案例讲讲回归分析,回归分析在经济、社会学、医学、生物学等领域得到了广泛的应用,这种技术最早可以追溯到达尔文(Charles Darwin)时期。 达尔文的表弟Francis Galton致力于研究父代豌豆种子尺寸对子代豌豆尺寸的影响,采用了回归分析。 回归分析对人体健康研究,病因分析也可以重要。19世纪高斯系统地提出最小二乘估计,从而使回归分析得到蓬勃发展。 目前回归分析的研究范围可以分为如下几个部分组成: 线性回归: 一元线性回归、多元线性回归和多个因变量与多个自变量的回归。 回归诊断: 通过数据推断回归模型基本假设的合理性、基本假设不成立时对数据的修正、回归方程拟合效果的判断以及回归函数形式的选择。回归变量的选择:根据什么标准选择自变量和逐步回归分析方法。参数估计方法:偏最小二乘回归、主成分回归和岭回归。非线性回归:一元非线性回归、分段回归和多元非线性回归。定性变量的回归:因变量含有定性变量和自变量含有定性变量。 现实中常用的回归分析是线性回归、逻辑回归、多项式回归和岭回归。本节以线性回归案例讲解,以波士顿房价数据集为线性回归案例数据,进行模型训练 。

波士顿房价数据说明: 此数据源于美国某经济学杂志上,分析研究波士顿房价( Boston HousePrice)的数据集。数据集中的每一行数据都是对波士顿周边或城镇房价的情况描述,下面对数据集变量说明下,方便大家理解数据集变量代表的意义。CRIM: 城镇人均犯罪率 ZN:住宅用地所占比例 INDUS:城镇中非住宅用地所占比例 CHAS:虚拟变量,用于回归分析 NOX:环保指数 RM:每栋住宅的房间数 AGE:1940 年以前建成的自住单位的比例 DIS:距离5 个波士顿的就业中心的加权距离 RAD: 距离高速公路的便利指数 TAX: 每一万美元的不动产税率 PTRATIO: 城镇中的教师学生比例 B: 城镇中的黑人比例 LSTAT: 地区中有多少房东属于低收入人群 MEDV: 自住房屋房价中位数(也就是均价)。

模型搭建如下步骤:

首先对数据分析,处理特殊异常值,然后才是模型和评估,并应用模型进行预测。

1.首先导入数据集,对数据进行分析,代码如下所示:

import pandas as pd

import numpy as np

import seaborn as sns

from sklearn import datasets

from sklearn.linear_model import LinearRegression

from matplotlib import pyplot as plt

from matplotlib.font_manager import FontProperties

from sklearn.decomposition import PCA

from mpl_toolkits.mplot3d import Axes3D

plt.rcParams['font.sans-serif'] = ['SimHei'] #设置在matplotlib上的中文字体

plt.rcParams['axes.unicode_minus'] = False #在matplotlib上正常显示中文符号

v_housing = datasets.load_boston()  # 把波士顿数据赋值给变量v_housing

print(v_housing.feature_names) #输出数据集的特征变量

程序运行后结构现实特征变量如下:

对上面程序加入如下语句分析数据集数据样本总数,与特征变量个数:

print(v_housing.data.shape)

程序运行后显示波士顿数据集506个样本,13个特征变量:

我们根据经验也可以看到,房价的高低在中国具体的房价就有太多维度了,比方说学区房、超市、菜场、高铁、机场、地铁、就业等等,而波士顿房价给出了13个特征维度变量预测房价,和中国比还是有很大差距的。国情不一样也影响房价。继续对上面数据分析,查看前五条数据,看下这13个变量数据情况:

v_bos = pd.DataFrame(v_housing.data)

print(v_bos.head())

程序运行后结果显示前5条数据如下:

2.对自变量进行特征分析,并画出散点图,分析因变量与自变量的相关性,把不相关的数据剔除。 程序如下:

y_data = v_housing.target  # 导入目标变量的房价

x_data = v_housing.data  # 导入所有特征变量

v_namedata = v_housing.feature_names  # 导入特征名

for i in range(13):   #画出13个特征变量的散点图

    plt.subplot(7, 2, i + 1)

    plt.scatter(x_data[:, i], y_data, s=20)

    plt.title(v_namedata[i])

    plt.show()

程序运行后结果显示如下:

CRIM: 城镇人均犯罪率

ZN: 住宅用地所占比例

INDUS: 城镇中非住宅用地所占比例

CHAS: 虚拟变量,用于回归分析

NOX: 环保指数

RM: 每栋住宅的房间数

AGE: 1940 年以前建成的自住单位的比例

DIS: 距离 5 个波士顿的就业中心的加权距离

RAD: 距离高速公路的便利指数

TAX: 每一万美元的不动产税率

PTRATIO: 城镇中的教师学生比例

B: 城镇中的黑人比例

LSTAT: 地区中有多少房东属于低收入人群

经过上面散点图的分析,可以看到数据异常的变量需要特殊处理,根据散点图分析,房屋的“RM(每栋住宅的房间数)”,“LSTAT(地区中有多少房东属于低收入人群)”,“PTRATIO(城镇中的教师学生比例)”特征与房价的相关性最大,所以,将其余不相关特征剔除。

3.通过数据挖掘对影响波士顿房价的因素进行分析并搭建一个波士顿房价预测模型。 本案例我们以每栋住宅的房间数RM研究与房价的关系。程序如下:

x = v_housing.data[:, np.newaxis, 5]

y = v_housing.target

lm = LinearRegression()

lm.fit(x, y)

print('方程的确定系数R的平方:', lm.score(x, y))

print('线性回归算法w值:', lm.coef_)

print('线性回归算法b值:', lm.intercept_)

plt.scatter(x, y, color='blue')

plt.plot(x, lm.predict(x), color='green', linewidth=6)

plt.xlabel('住宅平均房间数(RM)')

plt.ylabel(u'房屋价格')

plt.title('线性回归住宅平均房间数RM与房屋价格PRICE的关系')

plt.show()

程序执行后模型相关系统如下:

图形显示如下:

通过分析可以看出住宅平均房间数与最终房价一般成正相关。 对上面程序改造,我们也可以分析其他特征变量对房价的影响。 具体大家可以根据案例改造学习。

5.2.2 梯度下降求解

1. 梯度下降法的作用

梯度下降法用来求函数的极小值,且是一种迭代算法,由于计算机效率高,在机器学习中经常使用。梯度下降法常求凸函数(如机器学习中各种代价函数)的极小值,因为凸函数只有一个极小值,使用梯度下降法求得的极小值就是最小值。与其对应的有梯度上升法,用来求函数的极大值,两种方法原理一样,只是计算的过程中正负号不同而已。
  凸函数的数学定义在前文已有介绍,并不是所有的函数都有最小值,我们需要保证是凸函数才有最小值。所以在自己构建的目标函数中,在应用任何算法之前,先确定它是凸函数。

2. 梯度下降法和梯度的介绍

梯度就是表示某一函数在该点处的方向导数沿着该方向取得最大值。这个概念比较抽象,我们拿下山做比较,一个人站在山上的某个山腰处,想要以最快的速度下山,那么该怎么最快下山呢?他只要每次沿着当前位置最陡峭最易下山的方向前进一小步,然后继续沿下一个位置最陡方向前进一小步。这样一步一步走下去,一直走到觉得我们到了山脚的位置。那么下山最陡的方向就是梯度的负方向,这种方法就是梯度下降法。

那怎么求一个函数的梯度呢?那就是这个函数在当前位置的导数。如函数f(x,y)

的梯度就是


那么对于如何使用梯度下降算法呢?就是先选择一个初始点,计算该点的梯度,然后按照梯度的方向更新自变量,直到函数的值变化很小或者达到最大迭代次数为止。拿函数

举例,若k次迭代值为

,那么

的梯度下降法的应用就是


其中alpha称为步长或者学习率,表示每次迭代更新变化的大小。直到函数值变化非常小或者达到最大迭代次数时停止,此时认为函数达到极小值点。

3.梯度下降法解决房价问题

https://www.freesion.com/article/2298804880/