本次 DataWhale 第二十三期组队学习,其开源内容的链接为:[https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning]
2 使用 sklearn 构建完整的机器学习项目流程
一般来说,一个完整的机器学习项目分为以下步骤:
- 明确项目任务:回归/分类
- 收集数据集并选择合适的特征。
- 选择度量模型性能的指标。
- 选择具体的模型并进行训练以优化模型。
- 评估模型的性能并调参。
2.1 使用 sklearn 构建完整的回归项目
以 Boston 房价数据集为例
Step1 收集数据并选择合适的特征(已经确认回归问题)
import pandas as pd
import numpy as np
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
boston_data.head()
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | Price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00632 | 18.0 | 2.31 | 0.0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 |
1 | 0.02731 | 0.0 | 7.07 | 0.0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 |
2 | 0.02729 | 0.0 | 7.07 | 0.0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2.0 | 242.0 | 17.8 | 392.83 | 4.03 | 34.7 |
3 | 0.03237 | 0.0 | 2.18 | 0.0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 |
4 | 0.06905 | 0.0 | 2.18 | 0.0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3.0 | 222.0 | 18.7 | 396.90 | 5.33 | 36.2 |
各个特征的相关解释:
- 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:房价
Step2 选择度量模型性能的指标
回归中常用的指标有:MSE均方误差、MAE平均绝对误差、
R
2
R^2
R2可决系数、解释方差得分等
- MSE均方误差: MSE ( y , y ^ ) = 1 n samples ∑ i = 0 n samples − 1 ( y i − y ^ i ) 2 . \text{MSE}(y, \hat{y}) = \frac{1}{n_\text{samples}} \sum_{i=0}^{n_\text{samples} - 1} (y_i - \hat{y}_i)^2. MSE(y,y^)=nsamples1∑i=0nsamples−1(yi−y^i)2.
- MAE平均绝对误差: MAE ( y , y ^ ) = 1 n samples ∑ i = 0 n samples − 1 ∣ y i − y ^ i ∣ \text{MAE}(y, \hat{y}) = \frac{1}{n_{\text{samples}}} \sum_{i=0}^{n_{\text{samples}}-1} \left| y_i - \hat{y}_i \right| MAE(y,y^)=nsamples1∑i=0nsamples−1∣yi−y^i∣
- R 2 R^2 R2决定系数: R 2 ( y , y ^ ) = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2(y, \hat{y}) = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} R2(y,y^)=1−∑i=1n(yi−yˉ)2∑i=1n(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^}
-注:一般认为 y ^ \hat{y} y^ 为预测值, y y y 为观测值
可参考官方文档:https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics
以及中文文档:https://www.scikitlearn.com.cn/0.21.3/32/
以下给出部分实例
# 均方误差--越小越好
from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)
0.375
# 平均绝对误差--越小越好,相比 MSE 对高的差异惩罚更少
from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred)
0.5
虽然 MSE 偏向更高的误差,但是仍然比 MAE 常用,因为用RMSE(MSE)来定义损失函数是平滑可微的,且更容易进行数学运算。
# 可决系数-- 最佳得分是 1.0,同时可能为负数。
from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)
0.9486081370449679
# 解释方差得分 -- 最好的得分是1.0,值越低越差
from sklearn.metrics import explained_variance_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
explained_variance_score(y_true, y_pred)
0.9571734475374732
Step3 选择具体的模型并进行训练
-
线性回归模型
先以一元线性回归为例体会一下利用普通最小二乘法(OLS)来估计回归方程的参数。- (a)统计学书本解释
用一元拟合 n n n 个样本观测点 ( x i , y i ) ( i = 1 , 2 , . . . , n ) (x_i, y_i)(i = 1, 2, ..., n) (xi,yi)(i=1,2,...,n), 就是要求回归直线 y ^ = β ^ 0 + β ^ 1 x i \hat{y} = \hat{β}_0 + \hat{β}_1x_i y^=β^0+β^1xi 与这个 n n n 个样本点最近。
图片来自于《应用回归分析》(何晓群编著)
我们使用残差平方和: ∑ e 1 2 = ∑ ( y i − β ^ 0 − β ^ 1 x i ) 2 \sum e^2_1 = \sum(y_i - \hat{β}_0 - \hat{β}_1x_i)^2 ∑e12=∑(yi−β^0−β^1xi)2 来刻样本观测点到回归直线的距离长短。由于 Q Q Q 是关于 β ^ 0 , β ^ 1 \hat{β}_0, \hat{β}_1 β^0,β^1 的非负二次函数,因而其最小值总是存在的, β ^ 0 , β ^ 1 \hat{β}_0, \hat{β}_1 β^0,β^1 应满足下列方程组:
整理方程后的:
{ n β 0 ^ + ( ∑ i = 1 n x i ) β 1 ^ = ∑ y i ( ∑ i = 1 n x i ) β 0 ^ + ( ∑ i = 1 n x i 2 ) β 1 ^ = ∑ i = 1 n x i y i \begin{cases} n\hat{\beta_0} + (\sum^n_{i=1} x_i)\hat{\beta_1} = \sum y_i \\ (\sum^n_{i=1} x_i)\hat{\beta_0} + (\sum^n_{i=1} x_i^2)\hat{\beta_1} = \sum^n_{i=1} x_iy_i \end{cases} {nβ0^+(∑i=1nxi)β1^=∑yi(∑i=1nxi)β0^+(∑i=1nxi2)β1^=∑i=1nxiyi
通过解方程组可以得:
{ β 0 ^ = y ˉ + β 1 ^ x ˉ β 1 ^ = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 \begin{cases} \hat{\beta_0} = \bar{y} + \hat{\beta_1}\bar{x} \\ \hat{\beta_1} = \frac {\sum^n_{i=1}\,(x_i - \bar{x})(y_i - \bar{y})} {\sum^n_{i=1}\,(x_i - \bar{x})^2} \end{cases} {β0^=yˉ+β1^xˉβ1^=∑i=1n(xi−xˉ)2∑i=1n(xi−xˉ)(yi−yˉ)其中
x ˉ = 1 n ∑ i = 1 n x i , y ˉ = 1 n ∑ i = 1 n y i \bar{x} = \frac{1}{n}\sum^n_{i=1}x_i,\quad \bar{y} = \frac{1}{n}\sum^n_{i=1}y_i xˉ=n1i=1∑nxi,yˉ=n1i=1∑nyi - (a)统计学书本解释
-
线性回归模型
- (b)矩阵角度
在此之前需要补充两个知识点:线性映射求导: d ( A x ) d ( x ) = A \frac{d(Ax)}{d(x)} = A d(x)d(Ax)=A 和 二次型求导: d ( x T A x ) d ( x ) = 2 x T A \frac{d(x^TAx)}{d(x)} = 2x^TA d(x)d(xTAx)=2xTA
假设:数据集 D = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } D = \{(x_1,y_1),...,(x_N,y_N) \} D={(x1,y1),...,(xN,yN)}, x i ∈ R p , y i ∈ R , i = 1 , 2 , . . . , N x_i \in R^p,y_i \in R,i = 1,2,...,N xi∈Rp,yi∈R,i=1,2,...,N, X = ( x 1 , x 2 , . . . , x N ) T , Y = ( y 1 , y 2 , . . . , y N ) T X = (x_1,x_2,...,x_N)^T,Y=(y_1,y_2,...,y_N)^T X=(x1,x2,...,xN)T,Y=(y1,y2,...,yN)T
假设X和Y之间存在线性关系,模型的具体形式为 y ^ = f ( w ) = w T x \hat{y}=f(w) =w^Tx y^=f(w)=wTx
我们需要衡量真实值 y i y_i yi与线性回归模型的预测值 w T x i w^Tx_i wTxi之间的差距,在这里我们和使用二范数的平方和L(w)来描述这种差距,即:
L ( w ) = ∑ i = 1 N ∣ ∣ w T x i − y i ∣ ∣ 2 2 = ∑ i = 1 N ( w T x i − y i ) 2 = ( w T X T − Y T ) ( w T X T − Y T ) T = w T X T X w − 2 w T X T Y + Y Y T 因 此 , 我 们 需 要 找 到 使 得 L ( w ) 最 小 时 对 应 的 参 数 w , 即 : w ^ = a r g m i n L ( w ) 为 了 达 到 求 解 最 小 化 L ( w ) 问 题 , 我 们 应 用 高 等 数 学 的 知 识 , 使 用 求 导 来 解 决 这 个 问 题 : ∂ L ( w ) ∂ w = 2 X T X w − 2 X T Y = 0 , 因 此 : w ^ = ( X T X ) − 1 X T Y L(w) = \sum\limits_{i=1}^{N}||w^Tx_i-y_i||_2^2=\sum\limits_{i=1}^{N}(w^Tx_i-y_i)^2 = (w^TX^T-Y^T)(w^TX^T-Y^T)^T = w^TX^TXw - 2w^TX^TY+YY^T\\ 因此,我们需要找到使得L(w)最小时对应的参数w,即:\\ \hat{w} = argmin\;L(w)\\ 为了达到求解最小化L(w)问题,我们应用高等数学的知识,使用求导来解决这个问题: \\ \frac{\partial L(w)}{\partial w} = 2X^TXw-2X^TY = 0,因此: \\ \hat{w} = (X^TX)^{-1}X^TY L(w)=i=1∑N∣∣wTxi−yi∣∣22=i=1∑N(wTxi−yi)2=(wTXT−YT)(wTXT−YT)T=wTXTXw−2wTXTY+YYT因此,我们需要找到使得L(w)最小时对应的参数w,即:w^=argminL(w)为了达到求解最小化L(w)问题,我们应用高等数学的知识,使用求导来解决这个问题:∂w∂L(w)=2XTXw−2XTY=0,因此:w^=(XTX)−1XTY - © 几何解释
在线性代数中,我们知道两个向量a和b相互垂直可以得出: < a , b > = a . b = a T b = 0 <a,b> = a.b = a^Tb = 0 <a,b>=a.b=aTb=0,而平面X的法向量为Y-Xw,与平面X互相垂直,因此: X T ( Y − X w ) = 0 X^T(Y-Xw) = 0 XT(Y−Xw)=0,即: w = ( X T X ) − 1 X T Y w = (X^TX)^{-1}X^TY w=(XTX)−1XTY
*注: x x x代表下面的平面, x w xw xw代表这个平面的组合,仍是这个平面,因此 y − x w y-xw y−xw是垂直于 x x x - © 概率视角:
假设噪声 ϵ ∽ N ( 0 , σ 2 ) , y = f ( w ) + ϵ = w T x + ϵ \epsilon \backsim N(0,\sigma^2),y=f(w)+\epsilon=w^Tx+\epsilon ϵ∽N(0,σ2),y=f(w)+ϵ=wTx+ϵ,因此: y ∣ x i , w N ( w T x , σ 2 ) y|x_i,w ~ N(w^Tx,\sigma^2) y∣xi,w N(wTx,σ2)
我们使用极大似然估计MLE对参数w进行估计:
L ( w ) = l o g P ( Y ∣ X ; w ) = l o g ∏ i = 1 N P ( y i ∣ x i ; w ) = ∑ i = 1 N l o g P ( y i ∣ x i ; w ) = ∑ i = 1 N l o g ( 1 2 π σ e x p ( − ( y i − w T x i ) 2 2 σ 2 ) ) = ∑ i = 1 N [ l o g ( 1 2 π σ ) − 1 2 σ 2 ( y i − w T x i ) 2 ] a r g m a x w L ( w ) = a r g m i n w [ l ( w ) = ∑ i = 1 N ( y i − w T x i ) 2 ] 因 此 : 线 性 回 归 的 最 小 二 乘 估 计 < = = > 噪 声 ϵ ∽ N ( 0 , σ 2 ) 的 极 大 似 然 估 计 L(w) = log\;P(Y|X;w) = log\;\prod_{i=1}^N P(y_i|x_i;w) = \sum\limits_{i=1}^{N} log\; P(y_i|x_i;w)\\ = \sum\limits_{i=1}^{N}log(\frac{1}{\sqrt{2\pi \sigma}}exp(-\frac{(y_i-w^Tx_i)^2}{2\sigma^2})) = \sum\limits_{i=1}^{N}[log(\frac{1}{\sqrt{2\pi}\sigma})-\frac{1}{2\sigma^2}(y_i-w^Tx_i)^2] \\ argmax_w L(w) = argmin_w[l(w) = \sum\limits_{i = 1}^{N}(y_i-w^Tx_i)^2]\\ 因此:线性回归的最小二乘估计<==>噪声\epsilon\backsim N(0,\sigma^2)的极大似然估计 L(w)=logP(Y∣X;w)=logi=1∏NP(yi∣xi;w)=i=1∑NlogP(yi∣xi;w)=i=1∑Nlog(2πσ1exp(−2σ2(yi−wTxi)2))=i=1∑N[log(2πσ1)−2σ21(yi−wTxi)2]argmaxwL(w)=argminw[l(w)=i=1∑N(yi−wTxi)2]因此:线性回归的最小二乘估计<==>噪声ϵ∽N(0,σ2)的极大似然估计
- (b)矩阵角度
sklearn的线性回归实例:
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression
from sklearn import linear_model
lin_reg = linear_model.LinearRegression()
lin_reg.fit(X, y)
print("模型系数:",lin_reg.coef_)
print("模型得分(R^2):",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]
模型得分(R^2): 0.7406426641094095
- 线性回归的推广
(a)多项式回归
在线性回归中,因变量与特征之间是线性关系,影响模型的预测性能。而将标准的线性回归模型:
$ y_i = w_0 + w_1x_i + \epsilon_i $ 替换成为多项式函数:$ y_i = w_0 + w_1x_i + w_2x_i^2 + …+w_dx_i^d + \epsilon $ ,则可以体现因变量和特征的非线性关系。
同时,多形式的阶数一般不大于3或4,教程中有两个带置信区间的图,我先感性理解一下吧!
(b) 广义可加模型(GAM):
广义可加模型GAM实际上是线性模型推广至非线性模型的一个框架,在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。GAM模型不仅仅可以用在线性回归的推广,还可以将线性分类模型进行推广。具体的推广形式是:
标准的线性回归模型:
y
i
=
w
0
+
w
1
x
i
1
+
.
.
.
+
w
p
x
i
p
+
ϵ
i
y_i = w_0 + w_1x_{i1} +...+w_px_{ip} + \epsilon_i
yi=w0+w1xi1+...+wpxip+ϵi
GAM模型框架:
y
i
=
w
0
+
∑
j
=
1
p
f
j
(
x
i
j
)
+
ϵ
i
y_i = w_0 + \sum\limits_{j=1}^{p}f_{j}(x_{ij}) + \epsilon_i
yi=w0+j=1∑pfj(xij)+ϵi
GAM模型的优点与不足:
- 优点:简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;
由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。
- 缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项
x
(
i
)
×
x
(
j
)
x^{(i)} \times x^{(j)}
x(i)×x(j)的形式进行建模;
但是GAM模型本质上还是一个可加模型,如果我们能摆脱可加性模型形式,可能还会提升模型预测精度,详情请看后面的算法。
(a) 多项式回归实例介绍:
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html?highlight=poly#sklearn.preprocessing.PolynomialFeatures
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’,输出数组的顺序。
from sklearn.preprocessing import PolynomialFeatures
X_arr = np.arange(6).reshape(3, 2)
print("原始X为:\n",X_arr)
原始X为:
[[0 1]
[2 3]
[4 5]]
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.]]
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.]]
polynomial释义为“多项式”,以上例子中构造二次多项式,即为[1, a, b, a^2, ab, b^2];但是 interaction_only=True 表示只有交叉项,其结果为[1, a, b, ab]
(b) GAM模型实例介绍:
安装pygam:pip install pygam
https://github.com/dswah/pyGAM/blob/master/doc/source/notebooks/quick_start.ipynb
from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()
LinearGAM
=============================================== ==========================================================
Distribution: NormalDist Effective DoF: 103.2423
Link Function: IdentityLink Log Likelihood: -1589.7653
Number of Samples: 506 AIC: 3388.0152
AICc: 3442.7649
GCV: 13.7683
Scale: 8.8269
Pseudo R-Squared: 0.9168
==========================================================================================================
Feature Function Lambda Rank EDoF P > x Sig. Code
================================= ==================== ============ ============ ============ ============
s(0) [0.6] 20 11.3 2.20e-11 ***
s(1) [0.6] 20 12.6 8.15e-02 .
s(2) [0.6] 20 13.6 2.59e-03 **
s(3) [0.6] 20 3.5 2.76e-01
s(4) [0.6] 20 11.3 1.11e-16 ***
s(5) [0.6] 20 10.2 1.11e-16 ***
s(6) [0.6] 20 10.4 8.22e-01
s(7) [0.6] 20 8.6 4.44e-16 ***
s(8) [0.6] 20 3.5 5.96e-03 **
s(9) [0.6] 20 3.4 1.33e-09 ***
s(10) [0.6] 20 1.8 3.26e-03 **
s(11) [0.6] 20 6.5 6.25e-02 .
s(12) [0.6] 20 6.6 1.11e-16 ***
intercept 1 0.0 2.23e-13 ***
==========================================================================================================
Significance codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
WARNING: Fitting splines and a linear function to a feature introduces a model identifiability problem
which can cause p-values to appear significant when they are not.
WARNING: p-values calculated in this manner behave correctly for un-penalized models or models with
known smoothing parameters, but when smoothing parameters have been estimated, the p-values
are typically lower than they should be, meaning that the tests reject the null too readily.
<ipython-input-12-bb049c74476f>:3: UserWarning: KNOWN BUG: p-values computed in this summary are likely much smaller than they should be.
Please do not make inferences based on these values!
Collaborate on a solution, and stay up to date at:
github.com/dswah/pyGAM/issues/163
gam.summary()
官方文档不容易打开,百度多数结果是 pygame,另在时间看看 pygam 包的参数、方法等。
sklearn使用回归树的实例:
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html?highlight=tree#sklearn.tree.DecisionTreeRegressor
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。
from sklearn.tree import DecisionTreeRegressor
reg_tree = DecisionTreeRegressor(criterion = "mse", min_samples_leaf = 5)
reg_tree.fit(X,y)
reg_tree.score(X, y) # 这里输出的也是R^2,参考:https://blog.csdn.net/bingbangx/article/details/107127254
0.9376307599929274
树模型的优缺点(摘自开源文档):
- 树模型的解释性强,在解释性方面可能比线性回归还要方便。
- 树模型更接近人的决策方式。
- 树模型可以用图来表示,非专业人士也可以轻松解读。
- 树模型可以直接做定性的特征而不需要像线性回归一样哑元化。
- 树模型能很好处理缺失值和异常值,对异常值不敏感,但是这个对线性模型来说却是致命的。
- 树模型的预测准确性一般无法达到其他回归模型的水平,但是改进的方法很多。
支持向量回归(SVR)
开源教程中的解释很轻巧,但碍于文章篇幅就不复制、粘贴了。按照教程的思路,在理解 SVR 之前,需要一些最优化的基础,主要是对偶问题和KKT条件,对偶问题是建立在共轭函数基础上的,其最优值是原问题最优值的下确估计。对偶性也分为强对偶性和弱对偶性,几乎所有凸优化问题都满足强对偶性。对于凸优化问题,KKT条件是原问题和对偶问题最优解一致的充分必要条件。有关KKT条件的具体表述这里就省略了。
此处可以简化 SVR 的形式,假设空间中有点集
C
,
D
C,D
C,D,希望能够找到一个超平面
a
T
x
=
b
a^Tx = b
aTx=b对他们进行区分,则有
p
∈
C
,
q
∈
D
p \in C, q \in D
p∈C,q∈D 有
a
T
p
>
b
,
a
T
q
<
b
a^Tp > b, a^Tq < b
aTp>b,aTq<b,也就是说存在一个整数
t
t
t 使得
a
T
p
−
b
≥
t
,
a
T
q
−
b
≤
t
a^Tp-b \geq t, a^Tq-b\leq t
aTp−b≥t,aTq−b≤t
这个正数
t
t
t 一定程度上描述了两个集合分来的程度,显然它越大越好,故可以转化为优化问题。
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)
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html?highlight=svr#sklearn.svm.SVR
- 参数:
kernel:核函数,{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}, 默认=’rbf’。(后面会详细介绍)
degree:多项式核函数的阶数。默认 = 3。
C:正则化参数,默认=1.0。(后面会详细介绍)
epsilon:SVR模型允许的不计算误差的邻域大小。默认0.1。
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline # 使用管道,把预处理和模型形成一个流程
reg_svr = make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))
reg_svr.fit(X, y)
reg_svr.score(X,y) # 查阅文档得知,这里仍然返回拟合优度R^2
0.7024525421955277
内容主要来源于开源教程和网络,本是初学者,可能有错误。