【python库学习】 sklearn中的线性模型linear models模块
对sklearn库中linear models模块里的线性模型的不同类型的方法优缺点与使用注意事项,进行一个简单的学习,与学习记录。
@[TOC] sklearn中的线性模型linear models模块
注:
损失函数(Loss Function):是定义在单个样本上的,用来评价模型的预测值和真实值不一样的程度,指一个样本的误差。
代价函数(Cost Function):定义在整个训练集上的,是指所有样本误差的平均,也就是所有损失函数值的平均。
目标函数(Object Function):指最终需要优化的函数,一般来说是经验风险加结构风险(代价函数+正则化项),正则化项指惩罚项,做矫正作用。
sklearn中的线性模型(linear models)模块
线性模型同样公式如下:
可以看到模型由系数向量,输入向量与截距系数
ω
0
\omega0
ω0构成。可以看到进行了线性的相加得到输出。
1.1 Ordinary Least Squares
普通的最小二乘法,其目标函数如下:
其线性回归LinearRegression ,在库中的fit方法接受矩阵X,y输入,输出属性.coef_可以得到拟合后的权重系数。该模型的参数估计依赖于输入特征的独立性,当特征之间有线性相关时,X矩阵接近一个奇异矩阵,最小二乘法的参数估计将对观测值的随机误差高度敏感,从而产生较大的方差。比如在没有实验设计的情况下收集数据,其共线性将升高。其计算复杂度为O(n样本数*n^2特征数)。
1.1.1 Non-Negative Least Squares
此外LR支持非负系数的限制,在一些业务场景中不会有负值出现如商品的价格是没有负,提供参数positive,设为True 时开启非负限制。
1.2 Ridge regression and classification
岭回归与分类,该类模型相比前者加入了惩罚项(基本线性模型容易出现过拟合);其目标函数变为下方公式,增加了对参数的平方的限制项,其特点是限制参数过大,对信息提供较少的特征,其限制会让权重为一个很小的值,而不会置为零(置为零的模型见Lasso);其中参数
α
\alpha
α为惩罚项的力度,是一个非负常数。其值越大对权重的限制力度越大,通常取值在[0,10]之间,默认为1。该模型可以指定优化
算法,支持通过参数solver进行指定,其算法可以选择下面三种。其计算复杂度与最小二乘法一致。
使用岭回归进行分类时,如二分类,将分类标签转为【-1,1】,将分类问题视为回归任务进行。具体的API见 RidgeClassifier方法。
RidgeCV方法提供以内在对
α
\alpha
α参数进行调优的交叉验证,其默认设置等价于采用网格调优里的留一法交叉验证。如果指定cv参数为10,则采用的是10折交叉验证。
1.3 Lasso
套索回归,其目标函数如下,由目标函数可以看到其惩罚项为一阶的,因此的该目标函数可以优化得到稀疏模型,因此该模型也可以用于特征选择,
选择系数不为零的特征作为终版特征。在调参上类似岭回归也有它内在的交叉验证方法LassoCV 和 LassoLarsCV,其中LassoLarsCV是基于Ordinary Least Squares实现的,两者的区别在于,面对高纬数据特征共线性多的场景下,通常前者表现更好;在样本相比于特征数较小时,后者拟合更快。此外在进行Lass模型选择的时候,还可以采用赤池信息准则AIC或者贝叶斯信息准则BIC进行计算,对应的方法为LassoLarsIC,使用信息准则相比于前面的交叉验证方法的优势是该方法计算更代价更小,在调优时,k折交叉验证,信息准则只需要计算一次而不是k+1次。
1.3.2 Multi-task Lasso
Lasso也支持多任务训练,其主要限制是对所有的回归任务其选择的特征是一致的。多任务采用坐标下降法( coordinate descent )进行模型拟合。
1.4 Elastic-Net
弹性网络回归模型,其目标函数如下,该模型在拥有Lasso的特性同时也有岭回归的特性,较少的给出权重为0的拟合。其在许多特征与一个特征有共线性的场景下,相比于Lasso模型是在共线性的诸多特征中随机选择一个相比,该模型可能都会选上。同样的,该模型也提供一个内在的交叉验证方法 ElasticNetCV,用于参数
α
\alpha
α 与
ρ
\rho
ρ的调优。对于多任务训练,其限制与Lasso一致,提供多任务的方法 MultiTaskElasticNet与交叉验证方法 MultiTaskElasticNetCV进行调优。
1.5 Least-angle regression
最小角回归类似前向逐步回归,在每一步,去寻找与目标最相关的特征,当碰到相关性相等的多个特征时,此时朝着特征之间的等角方向进行下一步,而不是朝着同一个特征继续。该模型的优势是:
1.在样本远小于特征数时效率很高
2.其计算与前向选择速度一样快且其计算复杂度与最小二乘法一致
3.其产生完整的分段解决路径,这在交叉验证或者试图对模型进行微调中很有效
4.当两个特征与目标值相关性基本相等时,它们的权重也会以近似的速率增长;该算法的行为正如直觉所期望的那样,而且更加稳定。
5.可以很容易用于其它模型的求解,如LassoLars方法是基于LAR对模型Lasso 进行求解。
其劣势是基于残差的迭代重新拟合,对噪声很敏感。
其输出相比于前向逐步回归,添加了对完整系数路径(n_features, max_features + 1)的存储,通过属性coef_path_,可以得到,其第一列总是为0.
1.6 OrthogonalMatchingPursuit
正交匹配追踪模型在非零系数的限制下近似拟合线性模型,反过来也支持对具体的目标误差进行拟合,其两者目标函数如下:
该模型基于贪婪算法在每一步中搜寻与当前残差最相关的组合,其原理与简单的匹配追踪算法类似,区别在于每一次迭代时,残差是通过前面选择的字典在空间上的正交投影去重新计算,这里的理解上是在前向特征选择时与前面的最小角回归选择类似。
1.7 Bayesian regression
贝叶斯回归,特点是在进行参数估计的过程中包括了惩罚参数,这样无需手动去设置惩罚项参数,可以更好的适用当前数据集,其缺点是参数估计计算比较耗时。贝叶斯回归在初始化参数的方式不同提供两个回归方法,一个是BayesianRidge,类似经典的岭回归,w参数先验为球面高斯分布,
α
\alpha
α与
λ
\lambda
λ参数先验为伽马分布。三个参数在模型拟合过程中进行联合估算,
α
\alpha
α与
λ
\lambda
λ参数通过最大似然估计得到。
二是ARDRegression,与前者的差别是,本方法通过采用中心椭圆高斯分布初始化w参数,得到更稀疏的w参数。
1.8 LogisticRegression
该回归用于分类应用中,支持二分类与多分类,支持正则化,惩罚项设置如下,通过参数penalty进行设置,当设置为l1时,还可以用于特征选择,类似Lasso回归。
具体原理参考该篇文章
其求解算法如下,通过参照下表,联合使用场景,对参数solvers进行设置:
逻辑回归模型还提供了交叉验证的方法LogisticRegressionCV,对参数c和l1_ratio进行调优。
1.9 Generalized Linear Models¶
广义线性模型是对线性模型的扩展,定义不同的h函数,可以实现不同的分布,其中一些常见的分布如下表。
目标函数包含了代价函数与惩罚项,其不同分布对应的代价函数见上方表。
使用该方法时,TweedieRegressor方法提供了拟合t分布的方法,剩下的可以通过参数power进行设置:
power=0为正太分布,象前面提到的岭回归与弹性网络均适合该分布场景;
power=1是泊松分布,采用 PoissonRegressor 方法,或者TweedieRegressor(power=1, link=‘log’)方法设置可以进行该分布拟合;power=2是伽马分布, 采用GammaRegressor方法,或者TweedieRegressor(power=2, link=‘log’)方法设置可以进行该分布拟合;
power=3是逆高斯分布。
在使用时的需要注意的点:
1、注意对数据进行去量纲化(标准化,归一化等),确保正则项对每一个特征发挥同等作用
2、注意预测可能有负值,然伽马分布,逆高斯分布与泊松分布均不支持负值,此时可以对Xw进行一层转化,如取指数等。
3、如果需要对相对频次建模,可以将目标转化成
{
y
=
c
o
u
n
t
s
e
x
p
o
s
u
r
e
}
\{y=\frac{counts}{exposure}\}
{y=exposurecounts},进行拟合
4、如对TweedieRegressor方法里的power参数进行交叉验证,最好指明评价函数,因为默认的评价函数是方法里默认power参数对应的,可能与所验证的参数不兼容。
1.10 Stochastic Gradient Descent - SGD
随机梯度下降在对大型数据集时,拟合有其优势;还可以通过partial_fit方法实现在线训练,通过对方法 SGDClassifier 和 SGDRegressor 采用不同loss函数与惩罚项,即可实现对不同模型的拟合。
1.11 Perceptron
感知机的同样适用于大型数据集上,其特点如下:
1、无需学习率
2、无需惩罚项
3、只对误差进行模型更新
最后一个特点,意味着感知机比随机梯度下降在使用hinge loss函数时拟合更快,其所得模型会更稀疏。
1.12 Passive Aggressive Algorithms
该算法也是针对大型数据集的一员,与感知机类似的是同样不需要学习率,相反的是需要设置惩罚项C。分类任务可以采用PassiveAggressiveClassifier可设置loss函数为hinge 或者squared_hinge,回归任务可以采用PassiveAggressiveRegressor 可设置loss函数为epsilon_insensitive 或者squared_epsilon_insensitive。
1.13 Robustness regression: outliers and modeling errors
鲁棒性回归,其需要注意的主要是对异常值的应对,异常值需要注意是标签异常,还是特征异常,以及异常的占比。要注意的是,在高纬拟合中,很难通过鲁棒性方法设置保持鲁棒性。sklearn 库主要提供了三个鲁棒性线性回归方法,分别是RANSAC, Theil Sen and HuberRegressor。其各自有缺点如下:
1、HuberRegressor拟合速度快于前两者,在默认设置下,效果通常好于前两者
2、RANSA大多数情况下,在标签异常较多的情况下,表现好于其他两个;拟合速度快于Theil Sen
3、Theil Sen在特征异常中等的情况下,表现好于其他两个,该性能在高纬度是可能会消失。
注意,当无法抉择时,建议采用RANSA方法。
1.13.1 RANSA
随机样本一致性算法,该算法是通过对数据集里随机的非异常数据子集进行模型拟合。因此该算法是只能产生一定概率的合理结果,其概率依赖于迭代次数。首先对数据进行划分,得到多个子数据集,然后根据错误评估或者假设检验对子数据集进行是否为异常数据集判断,最终模型将由判断结果为非异常数据的数据集产生。
每一次迭代所执行的步骤如下:
- 首先从原始数据集里随机采取一定量的样本组成子数据集,对子数据集进行是否有效判断
- 然后在子数据集上进行模型拟合,并评估模型是否有效
- 通过对所有数据下的评估模型的残差计算,低于残差阈值的为非异常数据
- 如果当前非异常数据集为最大数据量存储当前模型为最佳模型,若存在样本量相等的模型,比较其得分选出最佳模型。
1.13.2 Theil-Sen
基于中位数的算法,其可以适用于多变量异常的情况,属于无参算法;因此没有对数据符合某分布的假设,在实验中发现,该算法最多可在异常值占29.3%的情况下还保持较好的性能。该算法在实际执行中通过空间中位数产生多元线性模型,其中中位数通过多维中位数生成器得到。它的时间与空间复杂度如下:
这意味着,在大型数据集的情况下无法考虑所有的可能组合,只能考虑可能组合中的一个随机子集。同时该算法在高纬度下,其性能会消失。
1.13.3 Huber Regression
该回归与岭回归不同的点是对样本采用了线性损失函数来判断是否为异常样本,与前两个鲁棒性算法直接将判断为异常值的样本忽略的做法不同的是给异常样本一个较低的权重。下面是该算法的目标函数,可以看到参数
ϵ
\epsilon
ϵ,可以控制异常划分的阈值大小,当为异常值时采用绝对值,为非异常值时采用平方,这相比于岭回归,避免了由于异常值样本的损失函数值在平方下较大,使得模型拟合受到异常值较大影响的问题。
需要注意的是在前面提到的 SGDRegressor 也支持loss设置为huber,其差异主要有两点,一是Huber Regression具有缩放不变性,一旦参数
ϵ
\epsilon
ϵ设定,对数据集进行不同的缩放操作,其对异常值产生的鲁棒性是一样的;而SGDRegressor一旦缩放方式改变,则需要重新设置参数
ϵ
\epsilon
ϵ。二是Huber Regression更高效,在小样本量实现的鲁棒性能,SGDRegressor需要更多数据进行训练才能得到同样的性能。
1.14 Quantile Regression
分位数回归,目标是估计y的不同分位数的值,相比较于最小二乘法估计的是条件均值。其目标函数如下,可以看到函数里的代价函数部分是线性的,因此它比基于均方误差的模型鲁棒性更强,其性能位于 HuberRegressor与基于均方误差的模型中间。分位数回归在需要区间预测的场景下将很有用,大部分模型提供的是点预测,通常预测区间基于预测误差是0均值常数方差的正太分布下的假设进行计算,而
分数回归预测不一定符合该假设。除了分位数回归外,GradientBoostingRegressor也可以通过设置loss等于"quantile",与alpha设定实现条件分位预测。
1.15 Polynomial regression: extending linear models with basis functions
多项式回归,对线性函数进行拓展,可以拟合非线性数据,其二阶多项式形式如下:
在实际使用中可以借鉴下方代码,其中degree参数指定阶数,若不同变量之间没有交互作用,还可以通过设置参数interaction_only=True ,去掉不同变量之间的交互,仅保留变量自身的相乘。
>>> from sklearn.preprocessing import PolynomialFeatures
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.pipeline import Pipeline
>>> import numpy as np
>>> model = Pipeline([('poly', PolynomialFeatures(degree=3)),
... ('linear', LinearRegression(fit_intercept=False))])
>>> # fit to an order-3 polynomial data
>>> x = np.arange(5)
>>> y = 3 - 2 * x + x ** 2 - x ** 3
>>> model = model.fit(x[:, np.newaxis], y)
>>> model.named_steps['linear'].coef_
array([ 3., -2., 1., -1.])
更多推荐
所有评论(0)