前言
一般来说,一个完整的机器学习项目分为以下步骤:
- 明确项目任务:回归/分类
- 收集数据集并选择合适的特征。
- 选择度量模型性能的指标。
- 选择具体的模型并进行训练以优化模型。
- 评估模型的性能并调参。
让我们通过这几个步骤了解一下基本的回归模型。
一、收集数据集并选择合适的特征
波士顿房价数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息,数据集很小,只有506个案例。
查看数据集:
v_housing = datasets.load_boston()
X = v_housing.data
y = v_housing.target
features = v_housing.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()
查看特征种类:
print(v_housing.feature_names)
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']
特征具体介绍:
变量名 | 说明 |
---|---|
CRIM | 城镇人口犯罪率 |
ZN | 超过25000平方英尺的住宅用地所占比例 |
INDUS | 城镇非零售业务地区的比例 |
CHAS | 查尔斯河虚拟变量(如果土地在河边=1;否则是0) |
NOX | 一氧化氮浓度(每1000万份) |
RM | 平均每居民房数 |
AGE | 在1940年之前建成的所有者占用单位的比例 |
DIS | 与五个波士顿就业中心的加权距离 |
RAD | 辐射状公路的可达性指数 |
TAX | 每10,000美元的全额物业税率 |
RTRATIO | 城镇师生比例 |
B | 1000(Bk-0.63)^2其中Bk是城镇黑人的比例 |
LSTAT | 人口中地位较低人群的百分数 |
MEDV | (目标变量/类别属性)以1000美元计算的自有住房的中位数 |
二、选择度量模型性能的指标
回归的性能度量指标:
- explained variance:可解释方差
- max_error:预测目标与实际目标值的最大误差
- neg_mean_absolute_error:平均绝对误差
- neg_mean_squared_error:均方差
- neg_root_mean_squared_error:均方根误差
- neg_median_absolute_error:中值绝对误差
- r2:R2决定系数(拟合优度)
- neg_mean_poission_deviance:平均泊松偏差
- neg_mean_gamma_deviance:平均伽玛偏差
- neg_median_absolute_percentage_error:平均绝对误差百分比
使用MSE(均方根误差)作为性能度量指标。
三、选择具体的模型进行训练
1.线性回归模型
在统计学中,普通最小二乘法(Ordinary Least Squares,OLS)是一种用于在线性回归模型中 估计 未知参数的线性最小二乘法。
OLS通过最小二乘法原则选择一组解释变量的线性函数的参数:最小化 给定数据集中观察到的因变量(被预测变量的值)与预测变量之间 残差的平方和。
1)一元线性回归求解过程
假设有一组数据 X = ( ( x 1 , y 1 ) , … , ( x m , y m ) ) X = {((x_{1},y_{1}),\dots,(x_{m},y_{m}))} X=((x1,y1),…,(xm,ym)),我们希望求出对应的一元线性模型来拟合这一组数据,我们使用误差平方和方法判断拟合程度,所以目标函数(损失函数)就是:
J ( β ) = ∑ i = 0 m ( y i − β i x i − β 0 ) 2 J(\beta ) = \sum_{i=0}^{m}(y_{i}-\beta_{i}x_{i}-\beta_{0})^2 J(β)=i=0∑m(yi−βixi−β0)2
求极小值,分别令:
∂
J
(
β
)
∂
β
1
=
2
∑
i
=
0
m
(
β
1
x
i
2
+
β
0
x
i
−
x
i
y
i
)
=
0
\frac{\partial J(\beta)}{\partial \beta_{1}} = 2\sum_{i=0}^{m} (\beta _{1} x_{i}^{2} + \beta _{0}x_{i}- x_{i}y_{i}) = 0
∂β1∂J(β)=2i=0∑m(β1xi2+β0xi−xiyi)=0
∂
J
(
β
)
∂
β
0
=
2
(
m
β
1
x
ˉ
+
m
β
0
−
m
y
ˉ
)
=
0
\frac{\partial J(\beta)}{\partial \beta_{0}} = 2(m\beta _{1} \bar{x} + m\beta _{0}- m\bar{y}) = 0
∂β0∂J(β)=2(mβ1xˉ+mβ0−myˉ)=0
解得
y
=
β
1
x
+
β
0
y = \beta_{1}x+\beta_{0}
y=β1x+β0的普通最小二乘解为:
{
β
1
=
∑
i
=
1
m
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
i
=
1
m
(
x
i
−
x
ˉ
)
2
β
0
=
y
ˉ
−
β
1
x
ˉ
\begin{cases} \beta _{1} = \frac{\sum_{i=1}^{m}(x_{i}-\bar{x})(y_{i}-\bar{y} ) }{\sum_{i=1}^{m}(x_{i}-\bar{x})^2} \\ \beta _{0} = \bar{y} - \beta_{1}\bar{x} \end{cases}
{β1=∑i=1m(xi−xˉ)2∑i=1m(xi−xˉ)(yi−yˉ)β0=yˉ−β1xˉ
2)多元线性回归求解过程
可以将常数项用1*
β
\beta
β的技巧用矩阵表示为:
X
β
=
y
X\beta = y
Xβ=y
其中,
X
=
[
1
x
12
…
x
1
n
1
x
22
…
x
2
n
1
…
…
…
1
x
m
2
…
x
m
n
]
,
β
=
[
β
0
β
1
…
β
n
]
,
y
=
[
y
1
…
y
m
]
X = \begin{bmatrix} 1& x_{12} & \dots & x_{1n}\\ 1& x_{22} & \dots & x_{2n}\\ 1& \dots & \dots & \dots\\ 1& x_{m2} & \dots &x_{mn} \end{bmatrix} ,\beta = \begin{bmatrix} \beta_{0}\\ \beta_{1}\\ \dots \\ \beta_{n} \end{bmatrix} ,y = \begin{bmatrix} y_{1} \\ \dots \\ y_{m} \end{bmatrix}
X=⎣⎢⎢⎡1111x12x22…xm2…………x1nx2n…xmn⎦⎥⎥⎤,β=⎣⎢⎢⎡β0β1…βn⎦⎥⎥⎤,y=⎣⎡y1…ym⎦⎤
目标函数:
J
(
β
)
=
∑
i
=
1
m
∣
y
i
−
∑
j
=
1
n
x
i
j
β
j
∣
=
∥
y
−
X
β
∥
2
J(\beta ) = \sum_{i=1}^{m}\left | y_{i}-\sum_{j=1}^{n}x_{ij}\beta _{j} \right | = \left \| y- X\beta\right \|^2
J(β)=i=1∑m∣∣∣∣∣yi−j=1∑nxijβj∣∣∣∣∣=∥y−Xβ∥2
使其最小时,显然有:
y − X β = 0 y - X\beta= 0 y−Xβ=0
即:
X
β
=
y
X
T
X
β
=
X
T
y
(
X
T
X
)
−
1
X
T
X
β
=
(
X
T
X
)
−
1
X
T
y
β
=
(
X
T
X
)
−
1
X
T
y
X\beta = y \\ X^TX\beta = X^Ty \\ (X^TX)^{-1}X^TX\beta = (X^TX)^{-1}X^Ty \\ \beta = (X^TX)^{-1}X^Ty
Xβ=yXTXβ=XTy(XTX)−1XTXβ=(XTX)−1XTyβ=(XTX)−1XTy
即多元线性回归求解使用矩阵运算即可,不需要迭代 。
扩展1 最小二乘法的几何解释
最小二乘法就是解一个无解的线性方程组,考虑这样一种情况:
{
1
∗
ω
+
b
=
2
0
∗
ω
+
b
=
2
2
∗
ω
+
b
=
3
\begin{cases} 1 * \omega + b =2 \\ 0* \omega + b =2 \\ 2*\omega+ b = 3 \end{cases}
⎩⎪⎨⎪⎧1∗ω+b=20∗ω+b=22∗ω+b=3
我们是无法求得 ω \omega ω和b的,这是一个无解的方程组,所以我们只能考虑一个最接近,最合适的解:
以上图为例,我们无法直接找到a即在平面S上找到一组解,使得由a1,a2组成的线性组合后的向量刚好等于b,所以尝试做辅助线:
即将b投影到a1,a2所在的平面S上,即投影为P,P与b之间的误差e = b - P
问题转换为求下式的最小:
e ⃗ = b ⃗ − P ⃗ = b − A x ^ \vec{e} = \vec{b} - \vec{P} = b - A\hat{x} e=b−P=b−Ax^
则
e
⃗
\vec{e}
e与平面S垂直,即
e
⃗
\vec{e}
e为平面S的法向量时,
e
⃗
\vec{e}
e的长度最短,满足:
A
T
e
⃗
=
A
T
(
b
⃗
−
P
⃗
)
=
0
A^T\vec{e} = A^T(\vec{b} - \vec{P}) = 0
ATe=AT(b−P)=0
化简,得:
A
T
A
x
^
=
A
T
b
x
^
=
(
A
T
A
)
−
1
A
T
b
A^TA\hat{x} = A^Tb \\ \hat{x} = (A^TA)^{-1}A^Tb
ATAx^=ATbx^=(ATA)−1ATb
解的形式与之前保持一致。
扩展2 最小二乘法的概率解释
假设一:对于每一个样例(x(i),y(i)),特征值x和目标值y的关系可以表示成:
(其中,ε(i) 表示线性模型与目标值的误差因素。)
y ( i ) = θ T x ( i ) + ε ( i ) y^{(i)} = \theta ^T x^{(i)} +\varepsilon ^{(i)} y(i)=θTx(i)+ε(i)
假设二: ε ( i ) \varepsilon ^{(i)} ε(i)服从正态分布:
ε ∼ N ( 0 , σ 2 ) \varepsilon\sim N(0,\sigma^2) ε∼N(0,σ2)
假设二说明误差因素是一个正态分布,这是根据中心极限定理:许多独立随机变量的和趋向于正态分布。因为影响误差的因素有很多,而这些因素都是独立且随机分布的,所以,我们可以得到假设二。
由此可得:
P ( ε ( i ) ) = 1 2 π σ exp ( − ( ε ( i ) ) 2 2 σ 2 ) P(\varepsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma } \exp (-\frac{(\varepsilon^{(i)})^2}{2\sigma^2} ) P(ε(i))=2πσ1exp(−2σ2(ε(i))2)
这也表示,当给定参数θ和x时,目标值y也服从正态分布,所以有:
P ( y ( i ) ∣ x ( i ) ; θ ) = 1 2 π σ exp ( − ( θ T x ( i ) − y ( i ) ) 2 2 σ 2 ) P(y^{(i)}|x^{(i)};\theta ) = \frac{1}{\sqrt{2\pi}\sigma}\exp (-\frac{(\theta^Tx^{(i)}-y^{(i)})^2}{2\sigma^2} ) P(y(i)∣x(i);θ)=2πσ1exp(−2σ2(θTx(i)−y(i))2)
对于误差ε(i) ,是独立同分布的随机变量。这样,我们就可以得到似然函数:
极大似然估计取log对数后,可得下式:
最大化L(
θ
\theta
θ)即最小化
y
−
θ
T
x
y-\theta^T x
y−θTx,不妨令其为0,得到:
y = θ T x y = \theta^T x y=θTx
注意初始条件中的权重变量位置是在左侧且有转置符号:
Y
=
θ
T
X
+
ϵ
Y = \theta^TX+\epsilon
Y=θTX+ϵ
所以这里的X和Y相当于多元线性回归原始解法中的
X
′
T
和
Y
′
T
X^{'T}和Y^{'T}
X′T和Y′T,所以有:
Y
′
=
Y
T
=
(
θ
T
X
)
T
=
X
T
θ
=
X
′
θ
Y^{'} = Y^T = ( \theta^TX)^T = X^T\theta = X^{'}\theta
Y′=YT=(θTX)T=XTθ=X′θ
得证,解的形式与之前保持一致。
2.线性回归实例
import pandas as pd
from sklearn import datasets
from sklearn import linear_model
#获取数据
boston = datasets.load_boston()
X = boston.data
y = boston.target
features = boston.feature_names
#利用pandas存储数据
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
#线性回归
lin_reg = linear_model.LinearRegression()
#求解
lin_reg.fit(X,y)
#打印结果
print("模型系数:",lin_reg.coef_)
print("模型得分:",lin_reg.score(X,y))
模型系数: [-1.08011358e-01 4.64204584e-02 2.05586264e-02 2.68673382e+00
-1.77666112e+01 3.80986521e+00 6.92224640e-04 -1.47556685e+00
3.06049479e-01 -1.23345939e-02 -9.52747232e-01 9.31168327e-03
-5.24758378e-01]
模型得分: 0.7406426641094094
3.线性回归的推广
1)多项式回归实例
from sklearn.preprocessing import PolynomialFeatures
X_arr = np.arange(8).reshape(4, 2)
print("原始X为:\n",X_arr)
原始X为:
[[0 1]
[2 3]
[4 5]
[6 7]]
poly = PolynomialFeatures(2)
print("2次转化X:\n",poly.fit_transform(X_arr))
2次转化X:
[[ 1. 0. 1. 0. 0. 1.]
[ 1. 2. 3. 4. 6. 9.]
[ 1. 4. 5. 16. 20. 25.]
[ 1. 6. 7. 36. 42. 49.]]
poly = PolynomialFeatures(interaction_only=True)
print("2次转化X:\n",poly.fit_transform(X_arr))
2次转化X:
[[ 1. 0. 1. 0.]
[ 1. 2. 3. 6.]
[ 1. 4. 5. 20.]
[ 1. 6. 7. 42.]]
2)广义相加模型(GAM)实例
先通过pip install pygam
安装pygam包:
from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()
3)回归树实例
from sklearn.tree import DecisionTreeRegressor
#criterion默认=mse衡量分割标准的函数
#min_samples_leaf:在叶节点处需要的最小样本数
reg_tree = DecisionTreeRegressor(min_samples_leaf = 5)
reg_tree.fit(X,y)
reg_tree.score(X,y)
0.9376307599929274
4)支持向量机(SVR)回归实例
SVM有三宝:间隔、对偶、核技巧
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
#C:正则化参数,默认=1.0
#epsilon:SVR模型允许的不计算误差的邻域大小。默认0.1
reg_svr = make_pipeline(StandardScaler(), SVR(epsilon=0.2))
reg_svr.fit(X, y)
reg_svr.score(X,y)
0.7024525421955277