1.收集数据集并选择合适的特征
使用我们比较熟悉的Boston房价数据集进行回归练习:
各个特征的相关解释:
CRIM:各城镇的人均犯罪率
ZN:规划地段超过25,000平方英尺的住宅用地比例
INDUS:城镇非零售商业用地比例
CHAS:是否在查尔斯河边(=1是)
NOX:一氧化氮浓度(/千万分之一)
RM:每个住宅的平均房间数
AGE:1940年以前建造的自住房屋的比例
DIS:到波士顿五个就业中心的加权距离
RAD:放射状公路的可达性指数
TAX:全部价值的房产税率(每1万美元)
PTRATIO:按城镇分配的学生与教师比例
B:1000(Bk - 0.63)^2其中Bk是每个城镇的黑人比例
LSTAT:较低地位人口
Price:房价
2.选择度量模型性能的指标:
(1)MSE均方绝对误差
M S E = ( y , y ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 ( y − y ^ ) 2 MSE=\left ( y,\hat{y} \right ) =\frac{1}{_{n_{samples} } } {\textstyle \sum_{i=0}^{n_{samples-1} }} {(y-\hat{y})}^{2 } MSE=(y,y^)=nsamples1∑i=0nsamples−1(y−y^)2
(2)MAE平均绝对误差
M A E = ( y , y ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 ∣ y − y ^ ∣ MAE=\left ( y,\hat{y} \right ) =\frac{1}{_{n_{samples} } } {\textstyle \sum_{i=0}^{n_{samples-1} }} {\left | y-\hat{y} \right | } MAE=(y,y^)=nsamples1∑i=0nsamples−1∣y−y^∣
(3) R 2 决 定 系 数 R^{2}决定系数 R2决定系数
R 2 ( y , y ^ ) = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ i ) 2 R^{2} (y,\hat{y} )=1-\frac{ {\textstyle \sum_{i=1}^{n}} (y_{i} -{\hat{y} _{i}})^{2} }{ {\textstyle \sum_{i=1}^{n}} (y_{i} -{{\bar{y} } _{i}})^{2} } R2(y,y^)=1−∑i=1n(yi−yˉi)2∑i=1n(yi−y^i)2
(4)解释方差得分
e
x
p
l
a
i
n
e
d
_
v
a
r
i
a
n
c
e
(
y
,
y
^
)
=
1
−
V
a
r
{
y
−
y
^
}
V
a
r
{
y
}
explained\_variance(y,\hat{y} )=1-\frac{Var\left \{y-\hat{y} \right \} }{Var\left \{ y \right \} }
explained_variance(y,y^)=1−Var{y}Var{y−y^}
在这个案例中,我们使用MSE均方误差为模型的性能度量指标。
3.选择具体模型并进行训练
(1)线性回归模型
线性回归假设输出变量是若干输入变量的线性组合,并根据这一关系求解线性组合中的最优系数。
假定一个实例可以用列向量
x
=
(
x
1
;
x
2
;
⋯
,
x
n
)
x=(x_1;x_2;⋯,x_n)
x=(x1;x2;⋯,xn) 表示,每个
x
i
x_i
xi 代表了实例在第
i
i
i 个属性上的取值,线性回归的作用就是习得一组参数
w
i
,
i
=
0
,
1
,
⋯
,
n
w_i,i=0,1,⋯,n
wi,i=0,1,⋯,n,使预测输出可以表示为以这组参数为权重的实例属性的线性组合。如果引入常量
x
0
=
1
x_0=1
x0=1,线性回归试图学习的模型就是
f
(
x
)
=
W
T
X
=
∑
i
=
0
n
w
i
⋅
x
i
f\left ( x \right ) =W^{T} X= {\textstyle \sum_{i=0}^{n}} w_{i} \cdot x_{i}
f(x)=WTX=∑i=0nwi⋅xi
在训练集上确定系数
w
i
w_i
wi 时,预测输出
f
(
x
)
f(x)
f(x) 和真实输出
y
y
y 之间的误差是关注的核心指标。在线性回归中,这一误差是以均方误差来定义的。当线性回归的模型为二维平面上的直线时,均方误差就是预测输出和真实输出之间的欧几里得距离,也就是两点间向量的
L
2
L^2
L2 范数。而以使均方误差取得最小值为目标的模型求解方法就是最小二乘法,其表达式可以写成
W
∗
=
a
r
g
m
i
n
W
∑
k
=
1
(
W
T
X
k
−
y
k
)
2
=
a
r
g
m
i
n
W
∑
k
=
1
∥
W
T
X
k
−
y
k
∥
2
W^{*} =\underset{W}{argmin} \sum_{k=1}^{} \left ( W^{T} X_{k} -y_{k} \right )^{ 2} =\underset{W}{argmin} \sum_{k=1}^{} \left \| W^{T} X_{k} -y_{k} \right \| ^{ 2}
W∗=Wargmink=1∑(WTXk−yk)2=Wargmink=1∑∥∥WTXk−yk∥∥2
式中每个
x
k
x_k
xk 代表训练集中的一个样本。在单变量线性回归任务中,最小二乘法的作用就是找到一条直线,使所有样本到直线的欧式距离之和最小。
回归结果可以完美匹配理想样本点的分布,但训练中使用的真实样本点是理想样本点和噪声叠加的结果,因而与回归模型之间产生了偏差,而每个样本点上噪声的取值就等于
y
k
−
f
(
x
k
)
y_k−f(x_k)
yk−f(xk)。
假定影响样本点的噪声满足参数为
(
0
,
σ
2
)
(0,σ^2)
(0,σ2) 的正态分布,这意味着噪声等于 0 的概率密度最大,幅度(无论正负)越大的噪声出现的概率越小。在这种情形下,对参数
W
W
W 的推导就可以用最大似然的方式进行,即在已知样本数据及其分布的条件下,找到使样本数据以最大概率出现的假设。
单个样本
x
k
x_k
xk 出现的概率实际上就是噪声等于
y
k
−
f
(
x
k
)
y_k−f(x_k)
yk−f(xk) 的概率,而相互独立的所有样本同时出现的概率则是每个样本出现概率的乘积,其表达式可以写成
p
{
X
1
,
X
2
,
…
X
k
,
…
∣
W
}
=
∏
k
1
2
π
σ
e
x
p
[
−
1
2
σ
2
(
y
k
−
W
T
X
k
)
2
]
p\left \{ X_{1},X_{2},\dots X_{k},\dots |W\right \} =\prod_{k}^{} \frac{1}{\sqrt{2\pi\sigma } }exp\left [-\frac{1}{2\sigma^{ 2} } \left (y_{k}-W^{T }X_{k} \right )^{2 } \right ]
p{X1,X2,…Xk,…∣W}=k∏2πσ1exp[−2σ21(yk−WTXk)2]
而最大似然估计的任务就是让以上表达式的取值最大化。出于计算简便的考虑,上面的乘积式可以通过取对数的方式转化成求和式,且取对数的操作并不会影响其单调性。经过一番运算后,上式的最大化就可以等效为
∑
k
(
W
T
X
k
−
y
k
)
2
\sum_{k}^{} \left ( W^{T} X_{k} -y_{k} \right )^{ 2}
∑k(WTXk−yk)2 的最小化.
在误差函数服从正态分布的情况下,从几何意义出发的最小二乘法与从概率意义出发的最大似然估计是等价的。
下面,我们使用sklearn的线性回归实例来演示:
(2)线性回归的推广
(a)多项式回归
多项式回归(polynomial regression)将自变量
x
x
x 和因变量
y
y
y 之间的关系定义为
x
x
x 的
n
n
n 阶多项式,从而使
x
x
x 和
y
y
y 之间呈现出非线性的关系。在只有一个自变量的情况下,多项式回归的表达式可以写成
y
=
β
0
+
β
1
x
+
β
2
x
2
+
⋯
+
β
n
x
n
y = \beta _{0} +\beta _{1} x+\beta _{2} x^{2} +\dots +\beta _{n} x^{n}
y=β0+β1x+β2x2+⋯+βnxn
多项式回归实例介绍
sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True,
order=‘C’):
参数:
degree:特征转换的阶数。
interaction_onlyboolean:是否只包含交互项,默认False。
include_bias:是否包含截距项,默认True。
order:str in {‘C’, ‘F’}, default ‘C’,输出数组的顺序。
(b)广义可加模型
广义可加模型(generalized additive model)将标准线性回归中的每个自变量以及可能存在的自变量之间的交互项都替换成一个非线性的平滑函数,各个非线性函数之间则保持相加的关系,其数学表达式可以写成
y
i
=
β
0
+
f
1
(
x
i
1
)
+
f
2
(
x
i
2
)
+
⋯
+
f
p
(
x
i
p
)
y_{i} =\beta_{ 0} +f_{1} \left (x_{i1 } \right ) +f_{2} \left (x_{i2 } \right )+\dots +f_{p} \left (x_{ip } \right )
yi=β0+f1(xi1)+f2(xi2)+⋯+fp(xip)
广义可加模型实例:
(3)回归树
回归树(regression tree)是用来完成回归任务的树模型。和全局的线性回归相比,树模型是局部化的模型,可以实现非线性的拟合。在从整体到局部的过渡中,回归树的操作采用的都是“分段函数”的思路,但两者的区别在于回归树对特征空间执行的是递归式划分(recursive partitioning)。递归的划分不要求一步到位,而是步步为营地对前一次划分的子区域继续做出细化,直到满足预先设定的要求为止。
回归树的表达能力强在对于特征之间相互作用(interaction)的刻画。回归树采用“由果推因”的方式。它并不直接构造从自变量到因变量明确的数量关系,而是通过对因变量进行分组来确定自变量的影响方式。
分组的依据有两个:一个是作为输出的因变量的相似性,另一个是作为输入的单个自变量的相异性。因变量的相似性决定了被划分到同一组的数据在输出上的差别较小,自变量的相异性则决定了被划分到不同组的数据在某一个输入属性上的差别较大。对划分好的数据集继续迭代执行这个过程,就可以完成对特征空间的递归式划分。
由于回归树采用树状结构来建模,因此从树结构的角度看,对数据集的递归式划分就是对树模型的不断分枝,每个分枝点都是让因变量产生最大差异的那个自变量。在这个过程中,每个节点内样本的同质性会不断增强,当样本完全同质化或者数目过少时,回归树的构造就完成了。
回归树和分类树的区别在于将信息增益的指标替换成了方差,算法会选择分类后两个类别方差之和最小,也就是和原始方差相比下降最大的那个属性进行划分,这种划分方式被称为方差下降(variance reduction)。
sklearn使用回归树的实例:
sklearn.tree.DecisionTreeRegressor(*, criterion=‘mse’, splitter=‘best’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None,
random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None,
presort=‘deprecated’, ccp_alpha=0.0)
参数:(列举几个重要的,常用的,详情请看上面的官网)
criterion:{“ mse”,“ friedman_mse”,“ mae”},默认=“ mse”。衡量分割标准的函数 。
splitter:{“best”, “random”}, default=”best”。分割方式。
max_depth:树的最大深度。
min_samples_split:拆分内部节点所需的最少样本数,默认是2。
min_samples_leaf:在叶节点处需要的最小样本数。默认是1。
min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。默认是0。
(4)支持向量机回归
在线性回归的理论中,每个样本点都要计算平方损失,但是SVR却是不一样的。SVR认为:落在
f
(
x
)
f(x)
f(x)的
ε
\varepsilon
ε 邻域空间中的样本点不需要计算损失,这些都是预测正确的,其余的落在 邻域空间以外
ε
\varepsilon
ε的样本才需要计算损失。
sklearn中使用SVR实例:
sklearn.svm.SVR(*, kernel=‘rbf’, degree=3, gamma=‘scale’, coef0=0.0, tol=0.001, C=1.0,
epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1)
参数:
kernel:核函数,{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}, 默认=’rbf’。
degree:多项式核函数的阶数。默认 = 3。
C:正则化参数,默认=1.0。
epsilon:SVR模型允许的不计算误差的邻域大小。默认0.1。
感谢Datawhale对开源学习的贡献,参考链接
https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning