1.1 线性模型¶
下面是一组用于回归的方法, 其中目标值是特征的线性组合。在数学表示法中,如果表示预测值,那么有:
在整个模型中, 我们定义向量 作为coef_
,定义作为 intercept_
。
若需要使用广义线性模型进行分类, 请看 Logistic regression
1.1.1 普通最小二乘法
LinearRegression 是拟合一个带有回归系数的, 使得数据的实际观测值和线性近似预测的预测值之间的残差平方和最小的一个线性模型。数学上讲,它解决了这个形式的问题:
LinearRegression将采用它的 fit
方法去拟合数组,,并将线性模型的回归系数存储在它的coef
_中:
>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression()
>>> reg.coef_
array([0.5, 0.5])
普通最小二乘的系数估计依赖于特征的独立性。当特征相关且设计矩阵的列之间具有近似线性相关性时, 设计矩阵趋于奇异矩阵,最小二乘估计对观测目标的随机误差高度敏感,可能产生很大的方差。例如,在没有实验设计的情况下收集数据时,就可能会出现这种多重共线性的情况。
示例 |
---|
线性回归示例 |
1.1.1.1 普通最小二乘法的复杂度
利用的奇异值分解计算最小二乘, 如果的形状是(n_samples, n_features)
, 假设 这个算法的复杂度是。
1.1.2 岭回归与分类
1.1.2.1 回归
Ridge 通过对系数的大小施加惩罚来解决普通最小二乘的一些问题。岭系数最小化一个带惩罚项的残差平方和:
其中, 是控制收缩量的复杂性参数, 值越大,收缩量越大,这样,系数对共线性的鲁棒性就更强了。
与其他线性模型一样, Ridge 用 fit
方法完成拟合,并将模型系数存储在其 coef_
成员中:
>>> from sklearn import linear_model
>>> reg = linear_model.Ridge(alpha=.5)
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
Ridge(alpha=0.5)
>>> reg.coef_
array([0.34545455, 0.34545455])
>>> reg.intercept_
0.13636...
1.1.2.2 分类
Ridge 有一个分类器变体:RidgeClassifier。该分类器首先将二分类目标转换为{-1,1}
,然后将问题作为一个回归任务处理, 以优化上述目标。预测类对应于回归预测的符号。对于多分类,该问题被视为多输出回归,预测的类对应于具有最高值的输出。
使用(受惩罚的)最小二乘损失来拟合分类模型,而不是更传统的 logistic损失或hinge损失,似乎有些问题。然而,在实践中,所有这些模型都可能导致类似的交叉验证分数, 例如准确性或精确度/召回率,而受惩罚的最小二乘损失使用的岭分类有一个明显的计算机性能剖面选择。
RidgeClassifier可以明显快于LogisticRegression,因为它只计算投影矩阵一次。
这种分类器有时被称为具有线性核的最小二乘支持向量机。
示例 |
---|
正则化函数的岭系数图 基于稀疏特征的文本文档分类 线性模型系数解释中的常见陷阱 |
1.1.2.3 岭复杂度
该方法的复杂度与普通最小二乘法相同。
1.1.2.4 设置正则化参数:广义交叉验证
RidgeCV 通过内置的alpha 参数的控制交叉验证来实现岭回归。 该对象与 GridSearchCV 的使用方法相同,只是它默认为 Generalized Cross-Validation(广义交叉验证 GCV),这是一种有效的留一交叉验证方法(LOO-CV):
>>> import numpy as np
>>> from sklearn import linear_model
>>> reg = linear_model.RidgeCV(alphas=np.logspace(-6, 6, 13))
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
RidgeCV(alphas=array([1.e-06, 1.e-05, 1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01,
1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06]))
>>> reg.alpha_
0.01
指定cv属性的值将触发使用GridSearchCV进行交叉验证,例如,如cv=10
执行10折交叉验证,而不是广义交叉验证。
参考
“Notes on Regularized Least Squares”, Rifkin & Lippert (technical report, course slides).
1.1.3. Lasso
Lasso是一个估计稀疏系数的线性模型。它在某些情况下是有用的,因为它倾向于给出非零系数较少的解,从而有效地减少了给定解所依赖的特征数。 因此,Lasso 及其变体是压缩感知领域的基础。在一定条件下,可以恢复非零系数的精确集合。见压缩感知:用L1优先层重建(Lasso))。
从数学上讲,它由一个带有正则项的线性模型组成。最小化的目标函数是:
这样,LASSO估计器解决了最小二乘损失加惩罚项的最优化问题,其中 是常数,是系数向量的ℓ1范数。
在Lasso
类中的实现采用坐标下降法作为拟合系数的算法。另一个算法 见最小角回归 。
>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha=0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1)
>>> reg.predict([[1, 1]])
array([0.8])
函数lasso path对于较低级别的任务很有用,因为它计算沿着可能值的全部路径上的系数。
示例 |
---|
Lasso和Elastic Net(弹性网络)在稀疏信号上的表现 压缩感知:L1先验层析重建(Lasso) 线性模型系数解释中的常见陷阱 |
注意: 使用 Lasso 进行特征选择
由于Lasso回归产生稀疏模型,因此可以用来进行特征选择。详见:基于 L1 的特征选取。
下面两篇参考解释了scikit-learn坐标下降算法中使用的迭代,以及用于收敛控制的对偶间隔计算的理论基础。
参考
“Regularization Path For Generalized linear Models by Coordinate Descent”, Friedman, Hastie & Tibshirani, J Stat Softw, 2010 (Paper). “An Interior-Point Method for Large-Scale L1-Regularized Least Squares,” S. J. Kim, K. Koh, M. Lustig, S. Boyd and D. Gorinevsky, in IEEE Journal of Selected Topics in Signal Processing, 2007 (Paper)
1.1.3.1 设置正则化参数
alpha
参数控制估计系数的稀疏程度。
1.1.3.1.1 使用交叉验证
scikit-learn 设置Lasso alpha
参数是通过两个公开的对象,LassoCV和LassoLarsCV
。其中, LassoLarsCV
是基于下面将要提到的 最小角回归 算法。
对于具有多个共线特征的高维数据集, LassoCV
通常是更可取的。然而,LassoLarsCV具有探索更多相关α参数值的优点,如果样本数相对于特征数很少,则往往比LassoCV更快。
1.1.3.1.2 基于信息的模型选择
有多种选择时,估计器 LassoLarsIC
建议使用 Akaike information criterion (Akaike 信息判据)(AIC)或 Bayes Information criterion (贝叶斯信息判据)(BIC)。 当使用 k-fold 交叉验证时,正则化路径只计算一次而不是 k + 1 次,所以找到 α 的最优值是一种计算上更经济的替代方法。 然而,这样的判断需要对解决方案的自由度进行适当的估计,它会假设模型是正确的,对大样本(渐近结果)进行导出,即数据实际上是由该模型生成的。 当问题严重受限(比样本更多的特征)时,它们也容易崩溃。
示例 |
---|
Lasso模型选择-交叉验证/AIC/BIC |
1.1.3.1.3 与支持向量机正则化参数的比较
alpha
和 SVM 的正则化参数C
之间的等式关系是 alpha = 1 / C
或者 alpha = 1 / (n_samples * C)
,并依赖于估计器和模型优化的确切的目标函数。
1.1.4 多任务Lasso
MultiTaskLasso
是一个估计多元回归问题的稀疏系数的线性模型, y
是一个二维数组, 形状是(n_samples, n_tasks)
。约束条件是,对于所有回归问题(也叫任务),所选的特征是相同的。
下图比较了简单的Lasso和MultiTaskLasso的系数矩阵中非零项的位置。Lasso 估计产生分散的非零值,而 MultiTaskLasso 的一整列都是非零的。
拟合时间序列模型,强制规定任何活跃的特征在任何时候都是活跃的
示例 |
---|
基于MultiTaskLasso的联合特征选择 |
从数学上讲,它是包含混合使用范数作为正则化的一个线性模型, 最小化的目标函数是:
其中表示Frobenius范数
读作是:
在类MultiTaskLasso中的实现采用坐标下降法作为拟合系数的算法。
1.1.5 弹性网络
ElasticNet
是一个训练时同时用ℓ1和ℓ2范数进行正则化的线性回归模型。
这种组合允许学习稀疏模型,其中很少有权重是非零类, 就像 Lasso
,同时仍然保持 Ridge
的正则化性质。我们可以通过 l1_ratio
参数控制ℓ1和ℓ2范数的凸组合。
当多个特征存在相关时,弹性网是很有用的。Lasso很可能随机挑选其中之一,而弹性网则可能兼而有之。
让Lasso 和 Ridge 进行交互的一个切实的优势是, 它允许弹性网在循环过程中继承 Ridge的一些稳定性。
在这种情况下,要最小化的目标函数是:
ElasticNetCV
类可以通过交叉验证来设置参数 alpha
() 和 `l1_ratio` () 。
示例 |
---|
稀疏信号上的LASSO与ElasticNet Lasso 与 Elastic Net |
以下两篇参考文献解释了在scikit-learn中使用坐标下降法求解的迭代,以及用于收敛控制的对偶间隔计算的理论基础。
参考
“Regularization Path For Generalized linear Models by Coordinate Descent”, Friedman, Hastie & Tibshirani, J Stat Softw, 2010 (Paper). “An Interior-Point Method for Large-Scale L1-Regularized Least Squares,” S. J. Kim, K. Koh, M. Lustig, S. Boyd and D. Gorinevsky, in IEEE Journal of Selected Topics in Signal Processing, 2007 (Paper)
1.1.6 多任务弹性网
MultiTaskElasticNet
是一个估计多元回归问题的稀疏系数的弹性网: Y
是一个二维数组, 形状是 (n_samples, n_tasks)
。约束条件是,对于所有回归问题(也叫任务),所选的特征是相同的。
从数学上讲,它由一个线性模型组成,该模型使用混合的ℓ1ℓ2范数和ℓ2范数进行正则。最小化的目标函数是:
类MultiTaskElasticNet中的实现采用坐标下降法作为拟合系数的算法。
在 MultiTaskElasticNetCV
中可以通过交叉验证来设置参数 alpha
() 和 `l1_ratio` () 。
1.1.7 最小角回归
最小角回归(Least-angle regression, LARS)是一种用于高维数据的回归算法, 由Bradley Efron、Trevor Hastie、Iain Johnstone和Robert Tibshiani开发。LARs和逐步向前回归很相似。在每一步中,它都会找到与目标最相关的特征。当多个特征具有相等的相关性时,它不是沿着相同的特征继续进行,而是沿着特征之间等角的方向进行。
LARS的优势在于:
在特征数明显大于样本数的情况下,它在数值算法上是非常有效的。 它的计算速度和前向选择一样快,其复杂度与普通最小二乘法相同。 它产生一个完整的分段线性解决方案路径,这在交叉验证或类似的尝试调优模型中很有用。 如果两个特征与目标之间的相关性几乎一致,那么它们的系数应以大致相同的速率增加。因此,该算法的性能与我们直觉所期望的一样,而且更稳定。 它很容易被修改,以便为其他估计器(如Lasso)提供解。
LARS的缺点包括:
因为LARS是基于对残差的迭代修改, 它可能会对噪音的影响特别敏感。这个问题,在 2004 年统计年鉴的文章由 Weisberg 详细讨论过。
LARS模型可以使用估计器LARs,或者其低级实现LARS_PATH或LARS_PATH_gram。
1.1.8 LARS Lasso
LassoLars
是利用LARS算法实现的LASSO模型,与基于坐标下降的LASSO模型不同,它得到的是分段线性的精确解,是其自身系数范数的函数。
>>> from sklearn import linear_model
>>> reg = linear_model.LassoLars(alpha=.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
LassoLars(alpha=0.1)
>>> reg.coef_
array([0.717157..., 0. ])
示例 |
---|
利用LARS的LASSO路径 |
LARS 算法提供了一个几乎无代价的沿着正则化参数的系数的完整路径,因此通常的做法用一个函数 lars_path
或 lars_path_gram
来检索路径。
1.1.8.1 数学公式
该算法类似于逐步向前回归,但在每一步都不包含特征,而是在与残差的相关性相等的方向上增加估计系数。
LARS解不是给出向量结果,而是由一条曲线组成,它表示参数向量的ℓ1范数的每个值的解。完整的系数路径存储在数组coef_path_
中,该数组的形状是(n_features, max_features+1)。第一列总是零。
参考
详细介绍了基于Hastie等人的最小角回归(Least Angle Regression)算法
1.1.9 正交匹配追踪(OMP)
OrthogonalMatchingPursuit
和 orthogonal_mp
近似的拟合了一个线性模型, 该模型对非0系数的数值进行了约束。(比如. ℓ0伪范数)。
作为一种像最小角回归这样的前向特征选择方法,正交匹配追踪可以用固定数目的非零元素逼近最优解向量:
或者,正交匹配追踪可以针对特定的误差,而不是特定数目的非零系数。这还可以表示为:
OMP的每一步的都是基于贪心算法,在每一步元素都包含与当前残差高度相关的元素。它类似于简单的匹配寻踪(MP)方法,但更好的是,在每次迭代时,在先前选择的字典元素的空间上用正交投影重新计算残差。
示例 |
---|
正交匹配追踪 |
参考
https://www.cs.technion.ac.il/~ronrubin/Publications/KSVD-OMP-v2.pdf
Matching pursuits with time-frequency dictionaries, S. G. Mallat, Z. Zhang,
1.1.10 贝叶斯回归
贝叶斯回归技术可以用于预估正则化参数:正则化参数不是在硬意义上设置,而是根据手头的数据进行调整。
这可以通过在模型的超参数上引入信息不足的先验(uninformative priors)来实现。岭回归和分类中使用的ℓ2正则化等价于求出在高斯先验下且精度为条件下的最大后验估计。与手动设置lambda不同,可以将其视为要从数据中估计的随机变量。
为了获得一个完全的概率模型,假设输出是分布在周围的高斯分布:
其中,α再次被视为要从数据中估计的随机变量。
贝叶斯回归的优点是:
它可以调整以适应手头的数据 它可以用于在估计过程中引入正则项。
贝叶斯回归的缺点包括:
模型的推断可能很费时间。
参考
关于贝叶斯方法的一个很好的介绍见C.Bishop:模式识别和机器学习
原始算法的细节可在Radford M. Neal的Bayesian learning for neural networks中找到
1.1.10.1 贝叶斯岭回归
BayesianRidge
估计了上述回归问题的概率模型。系数 的先验由球面高斯给出:
α 和 λ 上的先验是一般服从 gamma分布,这是高斯精度的共轭先验。得到的模型称为贝叶斯岭回归,类似于传统的 Ridge
。
在模型拟合过程中,对参数 w、α 和 λ 进行联合估计,通过最大化对数边际似然估计正则化参数α和λ。scikit-learn的实现是基于附录A所描述的算法(TIPING,2001年),其中参数α和λ的更新是按照下面的建议进行的(MacKay,1992年)。最大化过程中的初始值可以用超参数alpha_init
和lambda_init
进行设置。
这里还有四个超参数, 、、、, 是α和λ上的gamma先验分布, 这些通常被选择为无信息先验。默认情况下,。
贝叶斯岭回归用于回归:
>>> from sklearn import linear_model
>>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
>>> Y = [0., 1., 2., 3.]
>>> reg = linear_model.BayesianRidge()
>>> reg.fit(X, Y)
BayesianRidge()
经拟合后,该模型可用于预测新的值:
>>> reg.predict([[1, 0.]])
array([0.50000013])
可以获得模型的系数:
>>> reg.coef_
array([0.49999993, 0.49999993])
由于贝叶斯框架的存在,可以看出权重与普通最小二乘的权重值略有不同。然而,贝叶斯岭回归对不适定问题具有更强的鲁棒性。
示例 |
---|
贝叶斯岭回归 基于贝叶斯岭回归的曲线拟合 |
参考
Section 3.3 in Christopher M. Bishop: Pattern Recognition and Machine Learning, 2006
David J. C. MacKay, Bayesian Interpolation, 1992.
Michael E. Tipping, Sparse Bayesian Learning and the Relevance Vector Machine, 2001.
1.1.10.2 自动关联判定-ARD
ARDRegression
与 Bayesian Ridge Regression,非常相似,但会导致系数 [1] [2] 更加稀疏。ARD回归在系数上具有不同的先验性,因为它放弃了高斯球面的假设。
相反,上的分布被假定为轴平行的椭圆高斯分布。
这意味着每个系数都是从一个以0为中心、精度为的高斯分布中提取的:
并且 。
与Bayesian Ridge Regression相比,的每个坐标都有各自的标准差。而的先验被选择为是给定超参数和的相同的gamma分布。
ARD在文献中也被称为稀疏贝叶斯学习和相关向量机。[3] [4]
示例 |
---|
自动相关判定回归(ARD) |
参考
1Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 7.2.1
2David Wipf and Srikantan Nagarajan: A new view of automatic relevance determination
3Michael E. Tipping: Sparse Bayesian Learning and the Relevance Vector Machine
4Tristan Fletcher: Relevance Vector Machines explained
1.1.11 Logistic回归
Logistic回归,尽管它的名称有"回归",但是却是一个线性的分类模型。Logistic回归在文献中也被称为logit回归、最大熵分类(MaxEnt)或对数线性分类器。在这个模型中, 描述单个实验输出结果的可能性概率用的logistic function。
Logistic回归的实现是在LogisticRegression
, 在这里实现了二分类(binary), 一对多分类(One-vs-Rest,一对剩下), 和多项式Logistic回归, 并且可以选择的正则化有ℓ1、ℓ2或弹性网。
注意:正则化在默认情况下是被应用了的,这在机器学习中很常见,但在统计中不常见。正则化的另一个优点是它提高了数值稳定性。没有正则化就等于将C设置为非常高的值。
作为一个优化问题, 二分类并且带有ℓ2正则化的Logistic回归需要最小化的成本函数如下:
类似地,ℓ1正则化的Logistic回归需要解决以下优化问题:
弹性网正则化是ℓ1和ℓ2的结合,并将最小化下面的成本函数:
其中ρ控制ℓ1正则化和ℓ2正则化的强度(它对应于l1_ratio
参数)。
注意,在这个表示法中,假设了在第次试验中,目标值在取值只能是1或者-1,我们还可以看到,当ρ=1时,弹性网等价于ℓ1正则化,当ρ=0时,则等价于ℓ2正则化。
在 LogisticRegression
类中实现的求解方法包括: “liblinear”, “newton-cg”, “lbfgs”, “sag” and “saga”。
求解方法“liblinear”使用的是坐标下降(CD)法, 并依赖于优秀的C++ LIBLINEAR library库,该库随Scikit-Learn一起提供。然而,用 liblinear库实现的CD算法不能学习真正的多分类模型;取而代之的是, 会将优化问题按照 “one-vs-rest”的方式进行分解, 这样,对所有类都进行了单独的二分类训练。这些都是底层做的, 所以 LogisticRegression
类的对象使用这种方法表现出来就像一个多分类器。对于进行ℓ1正则化的类sklearn.svm.l1_min_c
允许计算C的下界,以便得到一个非“空”(所有特征分量权重全为零)模型。
对于 “lbfgs”, “sag” 和 “newton-cg”只支持 ℓ2正则化或者无正则化,还可以发现对于高维数据, 收敛速度更快。 把这些优化方法的参数multi_class
设置为“multinomial”就会学得一个真正意义上的多分类logistic回归, 这也意味着它的概率估计比使用默认的“one-vs-rest”要更好。
“sag”优化方法用的是随机平均梯度下降( Stochastic Average Gradient descent) 6, 当样本数和特征数都很大时,它比其他的优化方法更快。
“saga”是 “sag”的一种变体, 它同样支持非光滑(non-smooth)的ℓ1正则化( penalty="l1"
), 因此对于稀疏型的logistic回归这是一个不错的选择, 它也是唯一一个支持弹性网正则化(penalty="elasticnet"
)的优化方案。
“lbfgs”是一种类似于Broyden-Fletcher-Goldfarb-Shanno算法的优化方法, 是一种属于拟牛顿(quasi-Newton)的方法。“lbfgs”建议用于小数据集, 对于大型数据集表现会受到影响。
下表汇总了每种优化方法所支持的正则项:
因为“lbfgs”鲁棒性更强, 所以默认是“lbfgs”。对于大型数据集,“saga”解决程序通常更快。对于大型数据集,您还可以考虑使用对数损失( ‘log’ loss)的 SGDClassifier
,这可能会更快,但需要更多的调优。
示例 |
---|
Logistic回归中的L1正则化与稀疏性 L1-Logistic回归的正则化路径 画多项和OVR的Logistic回归图 20个新群体的多类稀疏Logistic回归 用多项式Logistic+L1进行MNIST分类 |
与liblinear的不同 |
---|
当fit_intercept=False , 并且拟合得到的coef_或者待预测的数据为 0 时, solver=liblinear 的LogisticRegression 或者LinearSVC与直接调用外部的liblinear library相比, 在得分上可能有些差异。这是因为对于决策函数是0的样本, LogisticRegression 和LinearSVC 预测为负类(negative class), 而 liblinear 库则会预测为正类。注意, 一个fit_intercept=False 并且很多样本的决策函数为0的模型,很有可能是一个欠拟合 、糟糕的模型, 你应该设置fit_intercept=True 并且增大intercept_scaling 。 |
注意:稀疏Logistic回归的特征选择 |
---|
带有ℓ1正则化的Logistic回归产生稀疏模型,因此可以用于执行特征选择,如基于L1的特征选择中所详细描述的那样。 |
注意:P值估计 |
---|
在回归不受正则化的情况下,可以得到系数的p值和置信区间。包statsmodels package<https://pypi.org/project/statsmodels/>原生支持这个。在scikit-learn里面, 可以使用自助式采样法达到目的。 |
LogisticRegressionCV
实现了内置交叉验证支持下的Logistic回归,根据得分属性找到最优的C
和l1_ratio
。 “newton-cg”, “sag”, “saga” 和 “lbfgs”被发现对于高维的密集数据会更快, 原因是热启动(warm-starting)(见术语表)。
参考
5Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 4.3.4
6Mark Schmidt, Nicolas Le Roux, and Francis Bach: Minimizing Finite Sums with the Stochastic Average Gradient.
7Aaron Defazio, Francis Bach, Simon Lacoste-Julien: SAGA: A Fast Incremental Gradient Method With Support for Non-Strongly Convex Composite Objectives.
8https://en.wikipedia.org/wiki/Broyden%E2%80%93Fletcher%E2%80%93Goldfarb%E2%80%93Shanno_algorithm
1.1.12 广义线性回归(Generalized Linear Regression)
广义线性模型(GLM)以两种方式扩展了线性模型。首先是预测值 是否通过反向连接函数 连接到输入变量 的线性组合
其次,平方损失函数被一个指数分布的单位偏差 所代替 (更准确地说,一个再生指数离散模型(EDM) [11])。
最小化问题变成:
α是L2正则化惩罚项。提供样本权重后,平均值即为加权平均值。
下表列出了一些特定的EDM及其单位偏差(所有这些都属于Tweedie系列):
下图说明了这些分布的概率密度函数(PDF),
根据泊松分布、Tweedie分布(幂=1.5)和具有不同平均值的伽马分布()的随机变量 的PDF。观察泊松分布和Tweedie(幂=1.5)分布在 的点质量,但不观察严格为正的目标域的伽马分布。
分配方式的选择取决于手头的问题:
如果目标值 是计数(非负整数值)或相对频率(非负),则可以使用带有log-link的泊松偏差。 如果目标值是正的,并且是歪斜的,您可以尝试带有log-link的Gamma偏差。 如果目标值似乎比伽马分布的尾部更重,那么您可以尝试使用逆高斯偏差(或者更高的Tweedie族方差)。
可采用的例子包括:
农业/天气建模:每年降雨的次数(Poisson),每次的降雨量(Gamma),每年总降雨量(Tweedie /复合Poisson Gamma)。
风险建模/保单定价:每年索赔事件/投保人的数量(Poisson),每个索赔事件的成本(Gamma),每个投保人每年的总成本(Tweedie /复合Poisson Gamma)。
预测维护:每年生产中断事件的数量:Poisson,中断持续时间:Gamma,每年总中断时间(Tweedie /复式Poisson Gamma)。
参考资料:
10McCullagh, Peter; Nelder, John (1989). Generalized Linear Models, Second Edition. Boca Raton: Chapman and Hall/CRC. ISBN 0-412-31760-5. 11Jørgensen, B. (1992). The theory of exponential dispersion models and analysis of deviance. Monografias de matemática, no. 51. See also Exponential dispersion model.
1.1.12.1. 使用
TweedieRegressor为Tweedie分布实现了一个广义线性模型,该模型允许使用适当的功率参数对上述任何分布进行建模。特别是:
power = 0
: 正态分布。在这种情况下,诸如Ridge
,ElasticNet
等特定的估计器通常更合适。power = 1
: 泊松分布。方便起见可以使用PoissonRegressor
。然而,它完全等同于TweedieRegressor(power=1, link='log')
.power = 2
: 伽马分布。方便起见可以使用GammaRegressor
。然而,它完全等同于TweedieRegressor(power=2, link='log')
.power = 3
: 逆高斯分布。
link函数由link参数决定。
示例:
>>> from sklearn.linear_model import TweedieRegressor
>>> reg = TweedieRegressor(power=1, alpha=0.5, link='log')
>>> reg.fit([[0, 0], [0, 1], [2, 2]], [0, 1, 2])
TweedieRegressor(alpha=0.5, link='log', power=1)
>>> reg.coef_
array([0.2463..., 0.4337...])
>>> reg.intercept_
-0.7638...
Examples:
1.1.12.2. 实际考虑
特征矩阵X在拟合前需要进行标准化。这就保证了可以公平的对特征进行惩罚。
由于线性预测器 可以为负,而泊松、伽马和逆高斯分布不支持负值,因此有必要应用一个保证非负性的逆连接函数。例如,对于 link='log'
,逆连接函数变成 。
如果你想建立一个相对频率的模型,即每次曝光的计数(time,volume,…),你可以通过使用泊松分布和传递 来实现使用作为样本权重。一个具体的例子, 保险索赔的推断回归。
当为 TweedieRegressor
的 power
参数执行交叉验证时,建议指定一个显式的scoring
函数,因为默认的记分器是 TweedieRegressor.score
是 power
本身的函数。
1.1.13 随机梯度下降(SGD)
随机梯度下降是一种简单而又非常有效的拟合线性模型的方法。当样本数量(和特性数量)非常大时,它特别有用,partial_fit
方法允许在线学习(online)和核外(out-of-core)的学习。
SGDClassifier
和 SGDRegressor
类提供了使用不同的(凸)损失函数和不同的正则项, 去拟合一个线性的回归模型或者分类模型。比如, 设定loss="log"
, SGDClassifier
会拟合一个Logistic回归模型。而如果设定loss="hinge"
则会拟合一个线性支持向量机 (SVM)。
参考
1.1.14 感知机(Perceptron)
Perceptron
是另一种适用于大规模学习的简单分类算法。有如下默认:
它不需要设置学习率 它不需要正则项 它只用错误样本更新模型
最后一个特点意味着Perceptron的训练速度略快于带有合页损失(hinge loss)的SGD,因此得到的模型更稀疏。
1.1.15 被动感知算法(Passive Aggressive Algorithms)
被动感知算法是一种大规模学习的算法。和感知机相似,因为它们不需要设置学习率。然而,与感知器不同的是,它们包含正则化参数 C
。
对于分类问题,能使用loss='hinge'
(PA-I)或者loss='squared_hinge'
(PA-II)的 PassiveAggressiveClassifier
类。 对于回归问题, 可以使用 loss='epsilon_insensitive'
(PA-I) 或者loss='squared_epsilon_insensitive'
(PA-II)的类PassiveAggressiveRegressor
。
参考
“Online Passive-Aggressive Algorithms” K. Crammer, O. Dekel, J. Keshat, S. Shalev-Shwartz, Y. Singer - JMLR 7 (2006)
1.1.16 鲁棒回归(Robustness regression):离群(outliers)与模型错误
鲁棒回归的目的是在存在糟糕数据(corrupt data)的情况下拟合一个回归模型:要么有离群值,要么模型中有错误。
1.1.16.1 不同的场景和有用的概念
在处理被离群值损坏的数据时,要记住下面不同的几点:
离群值到底是在还是在
离群值在方向上 离群值在方向上
离群值的比例VS误差的幅度
离群点的数量很重要,他们的离群程度同样重要。
小离群 大离群
鲁棒拟合(robust fitting)的一个重要概念是崩溃点(breakdown point):即拟合模型(仍准确预测)所能承受的离群值的最大比例。
注意,一般来说,在高维设置(特征数目n_features
很大)中,鲁棒拟合是非常困难的.在这些情况下鲁棒拟合可能不会起作用。
权衡:选用哪个估计器? |
---|
Scikit-learn提供了3种鲁棒回归的估计器:RANSAC, Theil Sen 和 HuberRegressor HuberRegressor 一般快于 RANSAC 和 Theil Sen ,除非样本数很大,即 n_samples >> n_features 。 这是因为 RANSAC 和 Theil Sen 都是基于数据的较小子集进行拟合。但使用默认参数时, Theil Sen 和 RANSAC 可能不如 HuberRegressor 鲁棒。RANSAC比Theil Sen快很多, 并且这种快的程度会随着样本数量的增加而加深。 RANSAC将更好地处理方向的大型离群值(最常见的情况)。 Theil Sen将更好地处理方向的中型离群值,但该能力将在高维设置中消失。 陷入疑问时,请使用RANSAC。 |
1.1.16.2 RANSAC:随机抽样一致性(RANdom SAmple Consensus)
RANSAC (RANdom SAmple Consensus)能够使用完整数据集中的样本点组成的随机子集拟合模型。
RANSAC是一种不确定的算法,它以一定概率产生一个合理的结果,而这还取决于迭代次数(见参数 max_trials
)它通常用于线性和非线性回归问题,在计算机视觉领域尤其流行。
该算法将完整的输入样本数据分割成一组可能样本点集合, 该集合收到噪声和离群值的影响,这些离群值是由于对数据的错误测量或无效假设引起的。然后,仅从集合中估计得到模型。
1.1.16.2.1 算法细节
每次迭代都执行以下步骤:
从原始数据中随机选择 min_samples
个样本,并检查数据集是否有效(请参阅is_data_valid
)将模型拟合到随机子集上( base_estimator.fit
),并检查估计的模型是否有效(请参阅is_model_valid
)通过计算模型的残差( base_estimator.predict(X) - y
), 如果样本绝对残差小于residual_threshold
就会被认为是局内点。按照这种方式将数据分为局内点和离群点。当内部的局内样本数达到最大时,模型达到最优就保存下来。如果当前的估计模型有相同的局内点,只有当它有更好的分数时,它才被认为是最好的模型。
这些步骤最终要么执行到了最大次数(max_trials
), 要么满足了某一条件(请看 stop_n_inliers
and stop_score
)而停止。最后的模型是使用之前确定的最佳模型的所有局内样本(一致性集合, consensus set)来估计的。
函数 is_data_valid
和 is_model_valid
可以识别出随机样本子集中的退化组合(degenerate combinations)并予以丢弃(reject)。即便不需要考虑退化情况,也会使用 is_data_valid
,因为在拟合模型之前调用它能得到更高的计算性能。
示例 |
---|
基于RANSAC的鲁棒线性模型估计 鲁棒线性估计拟合 |
参考
https://en.wikipedia.org/wiki/RANSAC “Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography” Martin A. Fischler and Robert C. Bolles - SRI International (1981) “Performance Evaluation of RANSAC Family” Sunglok Choi, Taemin Kim and Wonpil Yu - BMVC (2009)
1.1.16.3 Theil-Sen估计:基于广义中值的估计(generalized-median-based estimator)
TheilSenRegressor
估计器使用高纬度下的中位数的一个泛化性。因此,它对多元离群值具有很强的鲁棒性。但是,请注意,随着维数的增加,估计量的鲁棒性迅速下降。在高维数据上失去鲁棒性, 就不会比普通最小二乘法好。
示例 |
---|
Theil-Sen 回归 鲁棒线性估计拟合 |
参考
1.1.16.3.1 理论细节
TheilSenRegressor
与(普通最小二乘)Ordinary Least Squares (OLS)在渐进效率和无偏估计方面相当。与普通最小二乘相比, Theil-Sen是一种非参数的方法, 这意味着它对数据的基本分布没有任何假定。由于Theil-Sen是一种基于中值的估计器,因此它对损坏的数据(也称为离群值)具有更强的鲁棒性。在简单线性回归的情况下,Theil-Sen的崩溃点(breakdown point)为29.3%,这意味着它可以容忍高达29.3%的损坏数据。
TheilSenRegressor
在scikit-learn中的实现遵循了对多元线性回归模型[10]的推广,该模型使用空间中值,它是多维中值的推广。
就时间和空间的复杂度而言, Theil-Sen可根据:
这使得对样本和特征很大的问题进行全面的应用是不可行的。因此, 可以通过只考虑所有可能组合当中的一个随机子集, 选择一个亚群体的大小从而限制时间和空间复杂度。
示例 |
---|
Theil-Sen 回归 |
参考
10Xin Dang, Hanxiang Peng, Xueqin Wang and Heping Zhang: Theil-Sen Estimators in a Multiple Linear Regression Model.
1120.Kärkkäinen and S. Äyrämö: On Computation of Spatial Median for Robust Data Mining.
1.1.16.4 Huber回归
HuberRegressor
与Ridge
不同, 因为它把线性损失应用于被分为离群值的样本。如果样本的绝对误差小于某一阈值,则该样本被归类为局内样本(inlier)。它也不同于 TheilSenRegressor
和RANSACRegressor
,因为它没有忽略离群值的影响,而是给予它们较小的权重。
给出了HuberRegressor
要最小化的损失函数:
其中
建议将参数epsilon
设为1.35,以达到95%的统计效率。
1.1.16.5 注意
HuberRegressor
与将损失设置为huber
的SGDRegressor
并不相同, 体现在以下几个方面:HuberRegressor
是标量不变。一旦设置了epsilon
,将和按不同的值向下或向上缩放,也会像之前一样对异常值产生同样的鲁棒性。与SGDRegressor
相比,当和被缩放时,必须再一次设置epsilon
。HuberRegressor
对于少量样本的数据用起来更有效,而SGDRegressor
需要对训练数据进行多次传递(passes)才能产生相同的鲁棒性。
示例 |
---|
强异常数据集上的Huber回归与岭回归 |
参考
Peter J. Huber, Elvezio M. Ronchetti: Robust Statistics, Concomitant scale estimates, pg 172
请注意,这个估计器的实现与R实现的鲁棒回归并不相同。(http://www.ats.ucla.edu/stat/r/dae/rreg.htm)因为R实现做了加权最小二乘,权重是根据样本残差大于某一阈值的多少赋予的。
1.1.17 多项式回归:用基函数扩展线性模型
机器学习中的一个常见模式是使用非线性函数对数据的进行变换训练的线性模型。这种方法保持了线性方法的一般快速性能,同时允许它们适应范围更广的数据。
例如,可以通过从系数构造多项式特征(polynomial features)来扩展简单的线性回归。在标准线性回归的情况下,您可能有一个二维数据的模型, 如下所示:
如果我们想用抛物面来拟合数据而不是平面,我们可以用二阶多项式组合特征,这样模型看起来就像这样:
(有时令人惊讶的)观察到,这仍然是一个线性模型:要看到这一点,想象一下创建一组新的特征。
有了这个数据的重新标记,我们的问题就可以写出来了:
我们发现,得到的多项式回归依旧是线性模型, 如上面我们提到过的(即模型在中是线性的),并且可以用同样的技巧来求解。通过在高维空间中考虑这些基函数的线性拟合,该模型具有更大范围的数据拟合的灵活性。
下面是一个应用于一维数据的例子,使用了不同程度的多项式特征:
此图是使用 PolynomialFeatures
转换器创建的,该转换器将输入数据矩阵转换为给定度数的新数据矩阵。使用如下:
>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1],
[2, 3],
[4, 5]])
>>> poly = PolynomialFeatures(degree=2)
>>> poly.fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
的特征已经从转化为,现在可以在任何线性模型中使用。
这种预处理可以通过 Pipeline(流水线)工具来简化。可以创建表示简单多项式回归的单个对象,并按以下方式使用:
>>> 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.])
基于多项式特征训练的线性模型能够准确地恢复输入多项式系数。
在某些情况下,没有必要包含任何单一特征的更高阶的次方,而是让最多 个不同的特征相乘即可, 这就是所谓的交互特征(interaction features )。这些可以通过 PolynomialFeatures
中设置interaction_only=True
得到。
例如,在处理布尔型特征时,对所有都是无用的;但是表示两个布尔的联合。这样,我们就可以用线性分类器解决异或问题:
>>> from sklearn.linear_model import Perceptron
>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
>>> y = X[:, 0] ^ X[:, 1]
>>> y
array([0, 1, 1, 0])
>>> X = PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)
>>> X
array([[1, 0, 0, 0],
[1, 0, 1, 0],
[1, 1, 0, 0],
[1, 1, 1, 1]])
>>> clf = Perceptron(fit_intercept=False, max_iter=10, tol=None,
... shuffle=False).fit(X, y)
分类器“预测”是完美的:
>>> clf.predict(X)
array([0, 1, 1, 0])
>>> clf.score(X, y)
1.0