2.1 sklearn构建回归项目
- 本次学习回归采用度量模型的性能的指标为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 i − y i ^ ) 2 MSE(y,\hat{y})=\frac{1}{n_{samples}}\sum_{i=0}^{n_{samples}-1}(y_i-\hat{y_i})^2 MSE(y,y^)=nsamples1i=0∑nsamples−1(yi−yi^)2
- 回归分析通常用于预测分析,研究因变量(目标)和自变量(特征)之间的关系。线型回归假设目标值与特征之间线性相关,即
y
^
=
f
(
w
)
=
ω
T
x
\hat{y}=f(w)=\omega^Tx
y^=f(w)=ωTx,其中X为因变量,Y为自变量。
- 最小二乘估计
因为需要衡量真实值与预测值之间的误差,本次学习使用二范数的平方和L(w)
来描述这种差距, L ( ω ) = ∑ i = 1 N ∣ ∣ ω T x i − y i ∣ ∣ 2 2 = ∑ i = 1 N ( ω T x i − y i ) 2 = ( ω T X T − Y T ) ( ω T X T − Y T ) T = ω T X T X ω − 2 ω T X T Y + Y Y T L(\omega)=\sum_{i=1}^N||\omega^Tx_i-y_i||_2^2=\sum_{i=1}^N(\omega^Tx_i-y_i)^2=(\omega^TX^T-Y^T)(\omega^TX^T-Y^T)^T=\\ \omega^TX^TX\omega-2\omega^TX^TY+YY^T L(ω)=i=1∑N∣∣ωTxi−yi∣∣22=i=1∑N(ωTxi−yi)2=(ωTXT−YT)(ωTXT−YT)T=ωTXTXω−2ωTXTY+YYT寻找L(w)
最小时对应的参数w,数学表达式为: ( ^ ω ) = a r g m i n L ( ω ) \hat(\omega)=argminL(\omega) (^ω)=argminL(ω),数学上即为对L(w)
对w求偏导,则 ( ^ ω ) = ( X T X ) − 1 X T Y \hat(\omega)=(X^TX)^{-1}X^TY (^ω)=(XTX)−1XTY
- 最小二乘估计
- sklearn线性回归实例
引用自:DW学习资料
from sklearn import linear_model # 引入线性回归方法
lin_reg = linear_model.LinearRegression() # 创建线性回归的类
lin_reg.fit(X,y) # 输入特征X和因变量y进行训练
print("模型系数:",lin_reg.coef_) # 输出模型的系数
print("模型得分:",lin_reg.score(X,y)) # 输出模型的决定系数R^2
- 线性模型的推广
当数据存在非线性关系时,线性回归模型预测性能将及其低下,因此将模型换成多项式函数: y i = ω 0 + ω 1 x i + ω 2 x i 2 + . . . + ω d x i d + ϵ y_i=\omega_0+\omega_1x_i+\omega_2x_i^2+...+\omega_dx_i^d+\epsilon yi=ω0+ω1xi+ω2xi2+...+ωdxid+ϵ函数中d
不能取太大,否则预测函数两边的置信区间明显增大,稳定性降低。
如图:引用自DW学习笔记
- 广义可加模型(GAM)
GAM模型的优点与不足:
- 优点:简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。
- 缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项𝑥(𝑖)×𝑥(𝑗)的形式进行建模;但是GAM模型本质上还是一个可加模型,如果我们能摆脱可加性模型形式,可能还会提升模型预测精度,详情请看后面的算法。
思考:GAM模型在对原来变量x用非线性函数代替,是否即相当于变量通过非线性函数回归预测一次,再相加预测特征,这样优点部分就是控制其他变量不变推断单个变量
实例:
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))
- 回归树
建立回归树的过程大致可以分为以下两步:- 将自变量的特征空间(即𝑥(1),𝑥(2),𝑥(3),…,𝑥(𝑝))的可能取值构成的集合分割成J个互不重叠的区域𝑅1,𝑅2,…,𝑅𝑗。
- 对落入区域𝑅𝑗的每个观测值作相同的预测,预测值等于𝑅𝑗上训练集的因变量的简单算术平均。
- 具体来说,就是:
- a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得下式最小的(j,s) : m i n j , s [ m i n c 1 ∑ x i ∈ R 1 ( j , s ) + m i n c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] min_{j,s}[min_{c_1}\sum_{x_i\in R_{1(j,s)}}+min_{c_2}\sum_{x_i\in R_{2(j,s)}}(y_i-c_2)^2] minj,s[minc1∑xi∈R1(j,s)+minc2∑xi∈R2(j,s)(yi−c2)2] - b. 按照(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 R_1(j,s)={\lbrace x|x^j\le s \rbrace}和R_2(j,s)={\lbrace x|x^j>s \rbrace},\hat{c}_m=\frac{1}{N_m}\ \ \ \sum_{x\in R_{m(j,s)}}y_i R1(j,s)={x∣xj≤s}和R2(j,s)={x∣xj>s},c^m=Nm1 ∑x∈Rm(j,s)yi
- c. 继续调用步骤a,b直到满足停止条件,就是每个区域的样本数小于等于5。
- d. 将特征空间划分为J个不同的区域,生成回归树: f ( x ) = ∑ m = 1 J c ^ m I ( x ∈ R m ) f(x)=\sum_{m=1}^J\hat{c}_mI(x\in R_m) f(x)=∑m=1Jc^mI(x∈Rm)
- a. 选择最优切分特征j以及该特征上的最优点s:
实例代码
from sklearn.tree import DecisionTreeRegressor
reg_tree = DecisionTreeRegressor(criterion = "mse",min_samples_leaf = 5)
reg_tree.fit(X,y)
reg_tree.score(X,y)
- 支持向量机回归(SVR)
引用自DW学习资料:
在线性回归的理论中,每个样本点都要计算平方损失,但是SVR却是不一样的。SVR认为:落在𝑓(𝑥)的𝜖邻域空间中的样本点不需要计算损失,这些都是预测正确的,其余的落在𝜖邻域空间以外的样本才需要计算损失,因此:
代码实例:
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)
- 优化基础模型
偏差度量的是单个模型的学习能力,算法的期望预测与真实结果的偏离程度;
方差度量的是同一个模型在不同数据集上的稳定性,不同数据集采用同一类模型参数的差异。- 训练误差修正:
先构造一个特征较多的模型使其过拟合,此时训练误差很小而测试误差很大,那这时我们加入关于特征个数的惩罚。因此,当我们的训练误差随着特征个数的增加而减少时,惩罚项因为特征数量的增加而增大,抑制了训练误差随着特征个数的增加而无休止地减小。数学表达式: C p = 1 N ( R S S + 2 d σ ^ 2 ) C_p=\frac{1}{N}(RSS+2d\hat{\sigma}^2) Cp=N1(RSS+2dσ^2),其中d为模型特征个数, σ ^ 2 \hat{\sigma}^2 σ^2为模型预测误差的方差的估计值
其中采用了常用信息准则AIC和BIC - 交叉验证
K折交叉验证:我们把训练样本分成K等分,然后用K-1个样本集当做训练集,剩下的一份样本集为验证集去估计由K-1个样本集得到的模型的精度,这个过程重复K次取平均值得到测试误差的一个估计 C V ( K ) = 1 K ∑ i = 1 K M S E i CV_{(K)}=\frac{1}{K}\sum_{i=1}^KMSE_i CV(K)=K1∑i=1KMSEi
从P个特征中选择m个特征,使得对应的模型的测试误差的估计最小,方法有:- 最优子集选择
- 向前逐步选择
- 压缩估计(正则化)
+ 岭回归(L2正则化)
+ Lasso回归(L1正则化) - 降维
- 训练误差修正:
- 调参
- 参数与超参数:
我们很自然的问题就是岭回归中的参数𝜆和参数w之间有什么不一样?事实上,参数w是我们通过设定某一个具体的𝜆后使用类似于最小二乘法、梯度下降法等方式优化出来的,我们总是设定了𝜆是多少后才优化出来的参数w。因此,类似于参数w一样,使用最小二乘法或者梯度下降法等最优化算法优化出来的数我们称为参数,类似于𝜆一样,我们无法使用最小二乘法或者梯度下降法等最优化算法优化出来的数我们称为超参数。
模型参数是模型内部的配置变量,其值可以根据数据进行估计。
- 进行预测时需要参数。
- 参数定义了可使用的模型。
- 参数是从数据估计或获悉的。
- 参数通常不由编程者手动设置。
- 参数通常被保存为学习模型的一部分。
- 参数是机器学习算法的关键,它们通常由过去的训练数据中总结得出 。
- 模型超参数是模型外部的配置,其值无法从数据中估计。
- 超参数通常用于帮助估计模型参数。
- 超参数通常由人工指定。
- 超参数通常可以使用启发式设置。
- 超参数经常被调整为给定的预测建模问题。
- 网格搜索GridSearchCV():
网格搜索:https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html?highlight=gridsearchcv#sklearn.model_selection.GridSearchCV
网格搜索结合管道:https://scikit-learn.org/stable/auto_examples/compose/plot_compare_reduction.html?highlight=gridsearchcv
网格搜索的思想非常简单,比如你有2个超参数需要去选择,那你就把所有的超参数选择列出来分别做排列组合。举个例子:𝜆=0.01,0.1,1.0和𝛼=0.01,0.1,1.0,你可以做一个排列组合,即:{[0.01,0.01],[0.01,0.1],[0.01,1],[0.1,0.01],[0.1,0.1],[0.1,1.0],[1,0.01],[1,0.1],[1,1]} ,然后针对每组超参数分别建立一个模型,然后选择测试误差最小的那组超参数。换句话说,我们需要从超参数空间中寻找最优的超参数,很像一个网格中找到一个最优的节点,因此叫网格搜索。- 随机搜索 RandomizedSearchCV() :
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html?highlight=randomizedsearchcv#sklearn.model_selection.RandomizedSearchCV
网格搜索相当于暴力地从参数空间中每个都尝试一遍,然后选择最优的那组参数,这样的方法显然是不够高效的,因为随着参数类别个数的增加,需要尝试的次数呈指数级增长。有没有一种更加高效的调优方式呢?那就是使用随机搜索的方式,这种方式不仅仅高校,而且实验证明,随机搜索法结果比稀疏化网格法稍好(有时候也会极差,需要权衡)。参数的随机搜索中的每个参数都是从可能的参数值的分布中采样的。与网格搜索相比,这有两个主要优点:
可以独立于参数数量和可能的值来选择计算成本。
添加不影响性能的参数不会降低效率。引用自DW学习资料