文章目录
- 前言
- 多项式回归模型
- 概念解释:
- sklearn实现多项式回归模型:
- 广义线性可加(GAM)模型
- 概念解释:
- pygam实现广义线性可加模型:
- GAM模型的优点与不足:
- 回归树模型
- 概念解释:
- 算法流程:
- sklearn实现回归树模型:
- 回归树与线性模型的比较:
- 支持向量回归(SVR)模型
- 概念解释:
- 算法流程:
- sklearn实现支持向量回归模型:
- KKT和对偶理论的补充知识:
前言
本文主要总结了解决非线性回归问题的机器学习方法,其中包括多项式线性模型、广义线性(GAM)模型、回归树模型、支持向量回归(SVR)模型,每个模型的方法都有其特点。
多项式线性模型和GAM模型侧重于经验风险误差最小化,容易过拟合;回归树模型和SVR模型侧重于结构风险最小化,对异常值数据更不敏感,回归树模型可通过剪枝和压缩的方式去降低过拟合的风险,SVR模型具有较好的区间内鲁棒能力。
多项式回归模型
概念解释:
- 为了体现因变量和特征的非线性关系,一个很自然而然的想法就是将标准的线性回归模型:
换成一个多项式函数: - 对于多项式的阶数d不能取过大,一般不大于3或者4,因为d越大,多项式曲线就会越光滑,在X的边界处有异常的波动。
sklearn实现多项式回归模型:
sklearn.preprocessing.PolynomialFeatures(): 创建多项式回归模型。
- 参数:
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)
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))
广义线性可加(GAM)模型
概念解释:
- 广义可加模型GAM实际上是线性模型推广至非线性模型的一个框架,在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。GAM模型不仅仅可以用在线性回归的推广,还可以将线性分类模型进行推广。具体的推广形式是:
标准的线性回归模型:
GAM模型框架:
pygam实现广义线性可加模型:
pygam.LinearGAM():创建广义线性可加模型。
- 参数:
terms:表达式指定要建模的术语,可选。
max_iter:允许求解器收敛的最大迭代次数。
tol:停止标准的容忍误差。
from pygam import LinearGAM
model = LinearGAM()
gam = model.fit(x, y)
print(model.summary())
print(gam.accuracy(X, y))
GAM模型的优点与不足:
- 优点:简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。
- 缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项的形式进行建模;但是GAM模型本质上还是一个可加模型,如果我们能摆脱可加性模型形式,可能还会提升模型预测精度,详情请看后面的算法。
回归树模型
概念解释:
- 依据分层和分割的方式将特征空间划分为一系列简单的区域。
- 用所属区域中训练集的平均数或者众数对其进行预测。
- 决策树由结点(node)和有向边(directed edge)组成,结点有两种类型:内部结点(internal node)和叶结点(leaf node),内部结点(红框)表示一个特征或属性,叶结点(蓝框)表示一个类别或者某个值。
算法流程:
- 1.将自变量的特征空间(即)的可能取值构成的集合分割成J个互不重叠的区域。
- 2.对落入区域的每个观测值作相同的预测,预测值等于上训练集的因变量的简单算术平均:
a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得下式最小的(j,s)
b. 按照(j,s)分裂特征空间:
c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于阈值个数。
d. 将特征空间划分为j个不同的区域,生成回归树:
sklearn实现回归树模型:
sklearn.tree.DecisionTreeRegressor(): 创建回归树模型。
- 参数说明:
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)
回归树与线性模型的比较:
线性模型的模型形式与树模型的模型形式有着本质的区别,具体而言,线性回归对模型形式做了如下假定:,而回归树则是。那问题来了,哪种模型更优呢?
- 这个要视具体情况而言,如果特征变量与因变量的关系能很好的用线性关系来表达,那么线性回归通常有着不错的预测效果,拟合效果则优于不能揭示线性结构的回归树。反之,如果特征变量与因变量的关系呈现高度复杂的非线性,那么树方法比传统方法更优。
树模型的优缺点:
- 树模型的解释性强,在解释性方面可能比线性回归还要方便。
- 树模型更接近人的决策方式。
- 树模型可以用图来表示,非专业人士也可以轻松解读。
- 树模型可以直接做定性的特征而不需要像线性回归一样哑元化。
- 树模型能很好处理缺失值和异常值,对异常值不敏感,但是这个对线性模型来说却是致命的。
- 树模型的预测准确性一般无法达到其他回归模型的水平,但是改进的方法很多。
支持向量回归(SVR)模型
概念解释:
- 支持向量回归(SVR)是采用一个以f(x) =wTx+b为中心,宽度为2ε的间隔带,来拟合训练样本。
- 落在带子上的样本不计算损失(类比线性回归在线上的点预测误差为0),不在带子上的则以偏离带子的距离作为损失(类比线性回归的均方误差) ,然后以最小化损失的方式迫使间隔带从样本最密集的地方(中心地带)穿过,进而达到拟合训练样本的目的。
算法流程:
引入拉格朗日函数:
再令对求偏导等于0,得: 。
上述过程中需满足KKT条件,即要求:
SVR的解形如:
sklearn实现支持向量回归模型:
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)
KKT和对偶理论的补充知识:
- 约束优化问题§:
我们假设为满足以上条件的局部最优解,,我们的目的就是要找到与,满足不等式和等式约束的x集合成为可行域,记作S。 - KKT条件(最优解的一阶必要条件):
举个例子,我们考虑:(为我们的最优解)
我们可以看到:可以由与线性表出,因此有:,其中,即:
我们把没有起作用的约束也放到式子里面去,目的也就是为了书写方便,即要求:
由于点位于方程与上,因此: - 因此,KKT条件就是:假设为最优化问题§的局部最优解,且
- 对偶理论:
为什么要引入对偶问题呢?是因为原问题与对偶问题就像是一个问题两个角度去看,如利润最大与成本最低等。有时侯原问题上难以解决,但是在对偶问题上就会变得很简单。再者,任何一个原问题在变成对偶问题后都会变成一个凸优化的问题,这点我们后面会有介绍。下面我们来引入对偶问题:
首先,我们的原问题§是:
引入拉格朗日函数:
拉格朗日对偶函数:
因此:拉格朗日对偶函数是原问题最优解的函数值的下界,即每个不同的与确定的都是的下界,但是我们希望下界越大越好,因为越大就更能接近真实的。因此: 拉格朗日对偶问题(D)转化为:
我们可以观察到,对偶问题是关于和的线性函数,因此对偶问题是一个凸优化问题,凸优化问题在最优化理论较为简单。
弱对偶定理:对偶问题(D)的最优解一定小于原问题最优解,这点在刚刚的讨论得到了充分的证明,一定成立。
强对偶定理:对偶问题(D)的最优解在一定的条件下等于原问题最优解,条件非常多样化且不是唯一的,也就是说这是个开放性的问题,在这里我给出一个最简单的条件,即:与为凸函数,为线性函数,X是凸集,满足KKT条件,那么。