集成学习(上)Task02:掌握基本的回归模型
鉴于自己的专业,此次我的学习总结仍然偏重于应用,只对几种常用回归模型、其使用情景和效果做梳理。对于线性回归模型我会在后一篇文章稍微加一些理论推导部分,因为这部分应用的较多。
1 度量模型的性能指标
模型的性能指标是用来评价所用回归模型优劣的定量表达,当然分类模型有时也可以运用这些指标。常用的性能指标有如下四种:
- MSE均方误差:
MSE ( y , y ^ ) = 1 m ∑ i = 1 m ( y i − y ^ i ) 2 \text{MSE}(y, \hat{y}) = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2 MSE(y,y^)=m1i=1∑m(yi−y^i)2 - MAE平均绝对误差:
MAE ( y , y ^ ) = 1 m ∑ i = 1 m ∣ y i − y ^ i ∣ \text{MAE}(y, \hat{y}) = \frac{1}{m} \sum_{i=1}^{m} \left| y_i - \hat{y}_i \right| MAE(y,y^)=m1i=1∑m∣yi−y^i∣ -
R
2
R^2
R2决定系数:
R 2 ( y , y ^ ) = 1 − ∑ i = 1 m ( y i − y ^ i ) 2 ∑ i = 1 m ( y i − y ˉ ) 2 R^2(y, \hat{y}) = 1 - \frac{\sum_{i=1}^{m} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{m} (y_i - \bar{y})^2} R2(y,y^)=1−∑i=1m(yi−yˉ)2∑i=1m(yi−y^i)2 - 解释方差得分:
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\{ y - \hat{y}\}}{Var\{y\}} explained_variance(y,y^)=1−Var{y}Var{y−y^}
其中, m m m为样本的数量。
2 具体可选择的回归模型
2.1 线性回归模型
- 假设:目标值与特征之间线性相关,即满足一个多元一次方程。
- 目标:通过构建损失函数,来求解损失函数最小时的参数 ω ⃗ \vec\omega ω( ω ⃗ \vec\omega ω = ( ω 0 , ω 1 , . . . ω p ) T (\omega_{0}, \omega_{1}, ... \omega_{p})^{T} (ω0,ω1,...ωp)T)。
- 具体形式: y ^ = f ( ω ) = ω T x \hat{y}=f(\omega) =\omega^Tx y^=f(ω)=ωTx
2.2 线性回归推广——多项式回归
- 假设:目标与特征值之间存在非线性关系。
- 具体形式: y i ^ = ω 0 + ω 1 x i + ω 2 x i 2 + . . . + ω d x i d + ϵ \hat{y_i} = \omega_0 + \omega_1x_i + \omega_2x_i^2 + ...+\omega_dx_i^d + \epsilon yi^=ω0+ω1xi+ω2xi2+...+ωdxid+ϵ
- 注意:阶数d不能取过大,一般不大于3或者4,因为d越大,多项式曲线就会越光滑,在X的边界处有异常的波动。
2.3 线性回归推广——广义可加模型(GAM)
- 假设:每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。
- 具体形式: y i ^ = ω 0 + ∑ j = 1 p f j ( x i j ) + ϵ i \hat{y_i} = \omega_0 + \sum\limits_{j=1}^{p}f_{j}(x_{ij}) + \epsilon_i yi^=ω0+j=1∑pfj(xij)+ϵi
- 优点:简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。
- 缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项 x ( i ) × x ( j ) x^{(i)} \times x^{(j)} x(i)×x(j)的形式进行建模。
2.4 回归树模型
2.4.1 方法
步骤1:将自变量的特征空间(即 x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . , x ( p ) x^{(1)},x^{(2)},x^{(3)},...,x^{(p)} x(1),x(2),x(3),...,x(p))的可能取值构成的集合分割成 J J J个互不重叠的区域 R 1 , R 2 , . . . , R j R_1,R_2,...,R_j R1,R2,...,Rj。
步骤2:对落入区域
R
j
R_j
Rj的每个观测值作相同的预测,预测值等于
R
j
R_j
Rj上训练集的因变量的简单算术平均。
具体来说,就是:
- 选择最优切分特征
j
j
j以及该特征上的最优点
s
s
s:
遍历特征 j j j以及固定 j j j后遍历切分点 s s s,选择使得下式最小的 ( j , s ) (j,s) (j,s) m i n j , s [ m i n c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] min_{j,s}[min_{c_1}\sum\limits_{x_i\in R_1(j,s)}(y_i-c_1)^2 + min_{c_2}\sum\limits_{x_i\in R_2(j,s)}(y_i-c_2)^2 ] minj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2] - 按照 ( j , s ) (j,s) (j,s)分裂特征空间: R 1 ( j , s ) = { x ∣ x j ≤ s } 和 R 2 ( j , s ) = { x ∣ x j > s } , c ^ m = 1 N m ∑ x ∈ R m ( j , s ) y i , m = 1 , 2 R_1(j,s) = \{x|x^{j} \le s \}和R_2(j,s) = \{x|x^{j} > s \},\hat{c}_m = \frac{1}{N_m}\sum\limits_{x \in R_m(j,s)}y_i,\;m=1,2 R1(j,s)={x∣xj≤s}和R2(j,s)={x∣xj>s},c^m=Nm1x∈Rm(j,s)∑yi,m=1,2
- 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5;
- 将特征空间划分为 J J J个不同的区域,生成回归树: f ( x ) = ∑ m = 1 J c ^ m I ( x ∈ R m ) f(x) = \sum\limits_{m=1}^{J}\hat{c}_mI(x \in R_m) f(x)=m=1∑Jc^mI(x∈Rm)
2.4.2 与线性回归模型的比较
- 如果特征变量与因变量的关系能很好的用线性关系来表达,那么线性回归通常有着不错的预测效果,拟合效果则优于不能揭示线性结构的回归树。
- 反之,如果特征变量与因变量的关系呈现高度复杂的非线性,那么树方法比传统方法更优。
2.4.3 回归树模型的优缺点
-
优点:
(1)树模型的解释性强,在解释性方面可能比线性回归还要方便。
(2)树模型更接近人的决策方式。
(3)树模型可以用图来表示,非专业人士也可以轻松解读。
(4)树模型可以直接做定性的特征而不需要像线性回归一样哑元化。
(5)树模型能很好处理缺失值和异常值,对异常值不敏感,但是这个对线性模型来说却是致命的。 -
缺点:
(1)树模型的预测准确性一般无法达到其他回归模型的水平,但是改进的方法很多。
3 用例子来比较以上四种模型的回归效果
上代码
# 0 准备数据
from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
# 1 线性回归
from sklearn import linear_model # 引入线性回归方法
lin_reg = linear_model.LinearRegression() # 创建线性回归的类
lin_reg.fit(X,y) # 输入特征X和因变量y进行训练
print("模型得分:",lin_reg.score(X,y)) # 输出模型的决定系数R^2
结果:
模型得分: 0.7406426641094095
# 2 多项式回归模型
from sklearn.preprocessing import PolynomialFeatures
X_arr = np.arange(6).reshape(3, 2)
print("原始X为:\n",X_arr)
poly = PolynomialFeatures(2)
print("2次转化X:\n",poly.fit_transform(X_arr))
poly = PolynomialFeatures(interaction_only=True)
print("2次转化X:\n",poly.fit_transform(X_arr))
结果:
# 3 GAM模型
from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()
结果:
# 4 回归树
from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()
结果:
0.9376307599929274
从得分来看,对波士顿房价数据,回归树模型的表现更好。