1.1. 线性模型#
以下是用于回归的一组方法,其中目标值预期是特征的线性组合。在数学符号中,如果 \(\hat{y}\) 是预测值。
在整个模块中,我们将向量 \(w = (w_1, ..., w_p)\) 指定为 coef_
,并将 \(w_0\) 指定为 intercept_
。
要使用广义线性模型进行分类,请参见 逻辑回归。
1.1.1. 普通最小二乘法#
LinearRegression
使用系数 \(w = (w_1, ..., w_p)\) 拟合线性模型,以最小化数据集中的观测目标与线性近似预测的目标之间的残差平方和。在数学上,它解决以下形式的问题
LinearRegression
将在它的 fit
方法中接受数组 X
、y
,并将线性模型的系数 \(w\) 存储在它的 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])
普通最小二乘法的系数估计依赖于特征的独立性。当特征相关且设计矩阵 \(X\) 的列具有近似线性依赖性时,设计矩阵变得接近奇异,因此,最小二乘估计对观测目标中的随机误差变得高度敏感,产生很大的方差。这种多重共线性的情况可能在收集数据时没有实验设计的情况下出现。
示例
1.1.1.1. 非负最小二乘法#
可以将所有系数限制为非负数,这在它们代表某些物理量或自然非负量(例如,频率计数或商品价格)时可能很有用。 LinearRegression
接受一个布尔值 positive
参数:当设置为 True
时,将应用 非负最小二乘法。
示例
1.1.1.2. 普通最小二乘法复杂度#
最小二乘解是使用 X 的奇异值分解计算的。如果 X 是一个形状为 (n_samples, n_features)
的矩阵,则此方法的成本为 \(O(n_{\text{samples}} n_{\text{features}}^2)\),假设 \(n_{\text{samples}} \geq n_{\text{features}}\)。
1.1.2. 岭回归和分类#
1.1.2.1. 回归#
Ridge
回归通过对系数的大小施加惩罚来解决 普通最小二乘法 中的一些问题。岭回归系数最小化带惩罚的残差平方和
复杂度参数 \(\alpha \geq 0\) 控制收缩量:\(\alpha\) 的值越大,收缩量越大,因此系数对共线性更加稳健。
与其他线性模型一样,Ridge
将在它的 fit
方法中接收数组 X
、y
,并将线性模型的系数 \(w\) 存储在它的 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...
请注意,类 Ridge
允许用户通过设置 solver="auto"
来指定自动选择求解器。当指定此选项时,Ridge
将在 "lbfgs"
、"cholesky"
和 "sparse_cg"
求解器之间进行选择。 Ridge
将从上到下开始检查下表中显示的条件。如果条件为真,则选择相应的求解器。
求解器 |
条件 |
‘lbfgs’ |
指定了 |
‘cholesky’ |
输入数组 X 不是稀疏的。 |
‘sparse_cg’ |
以上条件均未满足。 |
1.1.2.2. 分类#
Ridge
回归器有一个分类变体:RidgeClassifier
。此分类器首先将二元目标转换为 {-1, 1}
,然后将问题视为回归任务,优化与上述相同的目标。预测的类别对应于回归器预测的符号。对于多类分类,问题被视为多输出回归,预测的类别对应于具有最高值的输出。
使用(带惩罚的)最小二乘损失来拟合分类模型而不是更传统的逻辑损失或铰链损失似乎很可疑。然而,在实践中,所有这些模型在准确率或精确率/召回率方面都可以导致相似的交叉验证分数,而 RidgeClassifier
使用的带惩罚的最小二乘损失允许对具有不同计算性能配置文件的数值求解器进行非常不同的选择。
RidgeClassifier
可能比例如具有大量类别的 LogisticRegression
快得多,因为它可以仅计算一次投影矩阵 \((X^T X)^{-1} X^T\)。
此分类器有时被称为具有线性核的 最小二乘支持向量机。
示例
1.1.2.3. 岭复杂度#
此方法具有与 普通最小二乘法 相同的复杂度。
1.1.2.4. 设置正则化参数:留一交叉验证#
RidgeCV
和 RidgeClassifierCV
实现岭回归/分类,并内置了 alpha 参数的交叉验证。它们的工作方式与 GridSearchCV
相同,只是它默认使用高效的留一 交叉验证。当使用默认的 交叉验证 时,由于用于计算留一误差的公式,alpha 不能为 0。有关详细信息,请参见 [RL2007]。
使用示例
>>> 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 折交叉验证,而不是留一交叉验证。
1.1.3. Lasso#
Lasso
是一种线性模型,它估计稀疏系数。它在某些情况下很有用,因为它倾向于偏好具有较少非零系数的解,有效地减少了给定解所依赖的特征数量。因此,Lasso 及其变体是压缩感知领域的基础。在某些条件下,它可以恢复非零系数的精确集合(参见 压缩感知:使用 L1 先验(Lasso)进行断层扫描重建)。
在数学上,它由一个线性模型组成,并添加了一个正则化项。要最小化的目标函数是
因此,Lasso 估计解决了最小二乘惩罚的最小化问题,其中添加了 \(\alpha ||w||_1\),其中 \(\alpha\) 是一个常数,\(||w||_1\) 是系数向量的 \(\ell_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
对于更低级的任务很有用,因为它计算了所有可能值的完整路径上的系数。
示例
参考文献#
1.1.3.1. 设置正则化参数#
alpha
参数控制估计系数的稀疏程度。
1.1.3.1.1. 使用交叉验证#
scikit-learn 提供了通过交叉验证设置 Lasso alpha
参数的对象:LassoCV
和 LassoLarsCV
。 LassoLarsCV
基于下面解释的 最小角回归 算法。
对于具有许多共线性特征的高维数据集,LassoCV
通常更可取。但是,LassoLarsCV
的优势在于探索了更多相关的 alpha
参数值,如果样本数量与特征数量相比非常小,它通常比 LassoCV
更快。
1.1.3.1.2. 基于信息准则的模型选择#
或者,估计器 LassoLarsIC
建议使用 Akaike 信息准则 (AIC) 和贝叶斯信息准则 (BIC)。它是一种计算成本更低的替代方法,用于找到 alpha 的最佳值,因为正则化路径只计算一次,而不是使用 k 折交叉验证时计算 k+1 次。
实际上,这些准则是在样本内训练集上计算的。简而言之,它们通过不同 Lasso 模型的灵活性来惩罚它们过于乐观的得分(参见下面的“数学细节”部分)。
然而,这些准则需要对解的自由度进行适当的估计,是针对大样本(渐近结果)推导出来的,并假设正确的模型是正在调查的候选模型。当问题条件很差时(例如,特征多于样本),它们也往往会失效。
示例
1.1.3.1.3. AIC 和 BIC 准则#
AIC(以及 BIC)的定义在文献中可能有所不同。在本节中,我们将提供有关 scikit-learn 中计算的准则的更多信息。
数学细节#
AIC 准则定义为
其中 \(\hat{L}\) 是模型的最大似然,\(d\) 是参数数量(也称为上一节中的自由度)。
BIC 的定义将常数 \(2\) 替换为 \(\log(N)\)
其中 \(N\) 是样本数量。
对于线性高斯模型,最大对数似然定义为
其中 \(\sigma^2\) 是噪声方差的估计值,\(y_i\) 和 \(\hat{y}_i\) 分别是真实目标和预测目标,\(n\) 是样本数量。
将最大对数似然代入 AIC 公式得到
上述表达式的第一项有时会被丢弃,因为当 \(\sigma^2\) 被提供时,它是一个常数。此外,有时会说 AIC 等于 \(C_p\) 统计量 [12]。然而,在严格意义上,它只在某些常数和乘法因子上是等价的。
最后,我们上面提到 \(\sigma^2\) 是噪声方差的估计值。在 LassoLarsIC
中,当参数 noise_variance
未提供(默认)时,噪声方差通过无偏估计器 [13] 估计,定义为
其中 \(p\) 是特征数量,\(\hat{y}_i\) 是使用普通最小二乘回归预测的目标。注意,此公式仅在 n_samples > n_features
时有效。
参考文献
1.1.3.1.4. 与 SVM 的正则化参数比较#
alpha
与 SVM 的正则化参数 C
之间的等价关系由 alpha = 1 / C
或 alpha = 1 / (n_samples * C)
给出,具体取决于估计器和模型优化的精确目标函数。
1.1.4. 多任务 Lasso#
MultiTaskLasso
是一种线性模型,它共同估计多个回归问题的稀疏系数:y
是一个形状为 (n_samples, n_tasks)
的二维数组。约束条件是所选特征对于所有回归问题(也称为任务)都是相同的。
下图比较了使用简单 Lasso 或 MultiTaskLasso 获得的系数矩阵 W 中非零项的位置。Lasso 估计产生分散的非零项,而 MultiTaskLasso 的非零项是完整的列。
拟合时间序列模型,强制任何活动特征在所有时间都处于活动状态。
示例
数学细节#
在数学上,它包含一个使用混合 \(\ell_1\) \(\ell_2\) 范数进行正则化的线性模型。要最小化的目标函数是
其中 \(\text{Fro}\) 表示 Frobenius 范数
而 \(\ell_1\) \(\ell_2\) 则表示
类 MultiTaskLasso
中的实现使用坐标下降作为算法来拟合系数。
1.1.5. 弹性网络#
ElasticNet
是一种线性回归模型,它使用系数的 \(\ell_1\) 和 \(\ell_2\) 范数正则化进行训练。这种组合允许学习一个稀疏模型,其中很少的权重是非零的,就像 Lasso
一样,同时仍然保持 Ridge
的正则化特性。我们使用 l1_ratio
参数控制 \(\ell_1\) 和 \(\ell_2\) 的凸组合。
当存在多个相互关联的特征时,弹性网络很有用。Lasso 可能会随机选择其中一个,而弹性网络可能会选择两者。
在 Lasso 和 Ridge 之间进行权衡的实际优势在于,它允许弹性网络继承 Ridge 在旋转下的一些稳定性。
在这种情况下,要最小化的目标函数是
类 ElasticNetCV
可用于通过交叉验证设置参数 alpha
(\(\alpha\)) 和 l1_ratio
(\(\rho\))。
示例
1.1.6. 多任务弹性网络#
The MultiTaskElasticNet
是一个弹性网络模型,它共同估计多个回归问题的稀疏系数:Y
是一个形状为 (n_samples, n_tasks)
的二维数组。约束条件是,所有回归问题(也称为任务)的选择特征相同。
在数学上,它由一个线性模型组成,该模型使用混合的 \(\ell_1\) \(\ell_2\)-范数和 \(\ell_2\)-范数进行正则化。要最小化的目标函数是
类 MultiTaskElasticNet
中的实现使用坐标下降作为算法来拟合系数。
类 MultiTaskElasticNetCV
可用于通过交叉验证设置参数 alpha
(\(\alpha\)) 和 l1_ratio
(\(\rho\))。
1.1.7. 最小角回归#
最小角回归 (LARS) 是一种针对高维数据的回归算法,由 Bradley Efron、Trevor Hastie、Iain Johnstone 和 Robert Tibshirani 开发。LARS 类似于向前逐步回归。在每一步中,它都会找到与目标最相关的特征。当有多个特征具有相同的相关性时,它不会沿着同一个特征继续,而是沿着这些特征之间的等角方向前进。
LARS 的优点是
在特征数量明显大于样本数量的情况下,它在数值上是有效的。
在计算上它与向前选择一样快,并且具有与普通最小二乘相同的复杂度。
它产生完整的分段线性解路径,这在交叉验证或类似的模型调整尝试中很有用。
如果两个特征与目标几乎同样相关,那么它们的系数应该以大致相同的速率增加。因此,该算法的行为符合直觉,并且也更稳定。
它很容易修改以产生其他估计器的解,例如 Lasso。
LARS 方法的缺点包括
由于 LARS 基于对残差的迭代重新拟合,因此它似乎对噪声的影响特别敏感。Weisberg 在 Efron 等人 (2004) 的《统计年鉴》文章的讨论部分详细讨论了这个问题。
LARS 模型可以通过估计器 Lars
或其低级实现 lars_path
或 lars_path_gram
使用。
1.1.8. LARS Lasso#
LassoLars
是一个使用 LARS 算法实现的 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.6..., 0. ])
示例
Lars 算法几乎免费地提供了沿正则化参数的系数的完整路径,因此常见的操作是使用以下函数之一检索路径:lars_path
或 lars_path_gram
。
1.1.9. 正交匹配追踪 (OMP)#
OrthogonalMatchingPursuit
和 orthogonal_mp
实现 OMP 算法,用于逼近线性模型的拟合,同时对非零系数的数量(即 \(\ell_0\) 伪范数)施加约束。
作为一种类似于 最小角回归 的向前特征选择方法,正交匹配追踪可以使用固定数量的非零元素来逼近最佳解向量
或者,正交匹配追踪可以针对特定误差而不是特定数量的非零系数。这可以表示为
OMP 基于贪婪算法,该算法在每一步都包含与当前残差相关性最高的原子。它类似于更简单的匹配追踪 (MP) 方法,但更好的是,在每次迭代中,使用对先前选择的字典元素空间的正交投影重新计算残差。
示例
参考文献#
https://www.cs.technion.ac.il/~ronrubin/Publications/KSVD-OMP-v2.pdf
使用时频字典的匹配追踪,S. G. Mallat,Z. Zhang,
1.1.10. 贝叶斯回归#
贝叶斯回归技术可用于在估计过程中包含正则化参数:正则化参数不是以硬性方式设置,而是根据手头的數據进行调整。
这可以通过在模型的超参数上引入 非信息先验 来实现。在 岭回归和分类 中使用的 \(\ell_{2}\) 正则化等效于在系数 \(w\) 上具有精度 \(\lambda^{-1}\) 的高斯先验下找到最大后验估计。与其手动设置 lambda
,不如将其视为一个从数据中估计的随机变量。
为了获得一个完全概率模型,假设输出 \(y\) 在 \(X w\) 周围呈高斯分布
其中 \(\alpha\) 再次被视为一个从数据中估计的随机变量。
贝叶斯回归的优点是
它适应手头的數據。
它可用于在估计过程中包含正则化参数。
贝叶斯回归的缺点包括
模型的推断可能很耗时。
参考文献#
C. Bishop 的《模式识别与机器学习》对贝叶斯方法进行了很好的介绍。
Radford M. Neal 的书籍《神经网络的贝叶斯学习》详细介绍了原始算法。
1.1.10.1. 贝叶斯岭回归#
BayesianRidge
估计回归问题的概率模型,如上所述。系数 \(w\) 的先验由球形高斯给出
对 \(\alpha\) 和 \(\lambda\) 的先验选择为 伽马分布,这是高斯精度的共轭先验。由此产生的模型称为贝叶斯岭回归,类似于经典的 Ridge
。
参数 \(w\)、\(\alpha\) 和 \(\lambda\) 在模型拟合期间共同估计,正则化参数 \(\alpha\) 和 \(\lambda\) 通过最大化对数边际似然来估计。scikit-learn 实现基于 (Tipping, 2001) 附录 A 中描述的算法,其中参数 \(\alpha\) 和 \(\lambda\) 的更新如 (MacKay, 1992) 中所建议的那样进行。最大化过程的初始值可以使用超参数 alpha_init
和 lambda_init
设置。
还有四个超参数,\(\alpha_1\)、\(\alpha_2\)、\(\lambda_1\) 和 \(\lambda_2\),它们是 \(\alpha\) 和 \(\lambda\) 上的伽马先验分布的超参数。这些通常被选择为非信息性的。默认情况下,\(\alpha_1 = \alpha_2 = \lambda_1 = \lambda_2 = 10^{-6}\)。
贝叶斯岭回归用于回归
>>> 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])
模型的系数 \(w\) 可以被访问。
>>> reg.coef_
array([0.49999993, 0.49999993])
由于贝叶斯框架,找到的权重与 普通最小二乘法 找到的权重略有不同。然而,贝叶斯岭回归对病态问题更鲁棒。
示例
参考文献#
Christopher M. Bishop: 模式识别与机器学习,2006 年第 3.3 节
David J. C. MacKay, 贝叶斯插值,1992 年。
Michael E. Tipping, 稀疏贝叶斯学习与相关向量机,2001 年。
1.1.10.2. 自动相关性确定 - ARD#
自动相关性确定 (在 ARDRegression
中实现) 是一种线性模型,它与 贝叶斯岭回归 非常相似,但它会导致更稀疏的系数 \(w\) [1] [2]。
ARDRegression
对 \(w\) 施加了一个不同的先验:它放弃了球形高斯分布,转而采用以零为中心的椭圆高斯分布。这意味着每个系数 \(w_{i}\) 本身可以从一个高斯分布中抽取,以零为中心,精度为 \(\lambda_{i}\)
其中 \(A\) 是一个正定对角矩阵,\(\text{diag}(A) = \lambda = \{\lambda_{1},...,\lambda_{p}\}\)。
与 贝叶斯岭回归 相比,\(w_{i}\) 的每个坐标都有自己的标准差 \(\frac{1}{\lambda_i}\)。所有 \(\lambda_i\) 的先验被选择为由超参数 \(\lambda_1\) 和 \(\lambda_2\) 给出的相同伽马分布。
ARD 在文献中也被称为稀疏贝叶斯学习和相关向量机 [3] [4]。有关 ARD 和 贝叶斯岭回归 之间比较的详细说明,请参见下面的示例。
示例
参考文献
Christopher M. Bishop: 模式识别与机器学习,第 7.2.1 章
David Wipf 和 Srikantan Nagarajan: 自动相关性确定的新视角
Michael E. Tipping: 稀疏贝叶斯学习与相关向量机
Tristan Fletcher: 相关向量机解释
1.1.11. 逻辑回归#
逻辑回归在 LogisticRegression
中实现。尽管它的名字,它在 scikit-learn/ML 命名法中被实现为分类的线性模型,而不是回归。逻辑回归在文献中也被称为 logit 回归、最大熵分类 (MaxEnt) 或对数线性分类器。在这个模型中,描述单个试验可能结果的概率使用 逻辑函数 建模。
此实现可以拟合二元、一对多或多项式逻辑回归,并具有可选的 \(\ell_1\)、\(\ell_2\) 或弹性网络正则化。
注意
正则化
默认情况下应用正则化,这在机器学习中很常见,但在统计学中并不常见。正则化的另一个优点是它提高了数值稳定性。没有正则化相当于将 C 设置为非常高的值。
注意
逻辑回归作为广义线性模型 (GLM) 的特例
逻辑回归是 广义线性模型 的特例,具有二项式/伯努利条件分布和 Logit 链接。逻辑回归的数值输出(即预测概率)可以通过应用阈值(默认值为 0.5)将其用作分类器。这就是它在 scikit-learn 中的实现方式,因此它期望一个分类目标,使逻辑回归成为一个分类器。
示例
1.1.11.1. 二元情况#
为了便于表示,我们假设目标 \(y_i\) 对数据点 \(i\) 取值于集合 \(\{0, 1\}\) 中。拟合后,predict_proba
方法 LogisticRegression
预测正类 \(P(y_i=1|X_i)\) 的概率为
作为一个优化问题,具有正则化项 \(r(w)\) 的二元类逻辑回归最小化以下成本函数
其中 \({s_i}\) 对应于用户分配给特定训练样本的权重(向量 \(s\) 由类权重和样本权重的逐元素乘积形成),并且总和 \(S = \sum_{i=1}^n s_i\)。
我们目前通过 penalty
参数为正则化项 \(r(w)\) 提供四种选择
penalty |
\(r(w)\) |
---|---|
|
\(0\) |
\(\ell_1\) |
\(\|w\|_1\) |
\(\ell_2\) |
\(\frac{1}{2}\|w\|_2^2 = \frac{1}{2}w^T w\) |
|
\(\frac{1 - \rho}{2}w^T w + \rho \|w\|_1\) |
对于 ElasticNet,\(\rho\)(对应于 l1_ratio
参数)控制 \(\ell_1\) 正则化与 \(\ell_2\) 正则化的强度。当 \(\rho = 1\) 时,Elastic-Net 等效于 \(\ell_1\),当 \(\rho=0\) 时,等效于 \(\ell_2\)。
请注意,类权重和样本权重的比例会影响优化问题。例如,将样本权重乘以一个常数 \(b>0\) 等效于将(逆)正则化强度 C
乘以 \(b\)。
1.1.11.2. 多项式情况#
二元情况可以扩展到 \(K\) 类,从而导致多项式逻辑回归,另请参见 对数线性模型。
注意
可以使用仅 \(K-1\) 个权重向量来参数化 \(K\) 类分类模型,通过利用所有类概率必须加起来为 1 的事实,将一个类概率完全由其他类概率决定。我们故意选择使用 \(K\) 个权重向量对模型进行过度参数化,以方便实现并保持关于类排序的对称归纳偏差,参见 [16]。这种影响在使用正则化时尤其重要。过度参数化的选择对于未惩罚的模型可能是有害的,因为在这种情况下,解决方案可能不是唯一的,如 [16] 中所示。
数学细节#
令 \(y_i \in {1, \ldots, K}\) 为观测值 \(i\) 的标签(序数)编码目标变量。现在我们不再使用单个系数向量,而是使用系数矩阵 \(W\),其中每个行向量 \(W_k\) 对应于类 \(k\)。我们的目标是通过 predict_proba
预测类概率 \(P(y_i=k|X_i)\),如下所示
优化目标变为
其中 \([P]\) 表示艾弗森括号,如果 \(P\) 为假,则其值为 \(0\),否则其值为 \(1\)。
同样,\(s_{ik}\) 是用户分配的权重(样本权重和类权重的乘积),其总和为 \(S = \sum_{i=1}^n \sum_{k=0}^{K-1} s_{ik}\)。
我们目前通过 penalty
参数提供了四种正则化项 \(r(W)\) 的选择,其中 \(m\) 是特征数量
penalty |
\(r(W)\) |
---|---|
|
\(0\) |
\(\ell_1\) |
\(\|W\|_{1,1} = \sum_{i=1}^m\sum_{j=1}^{K}|W_{i,j}|\) |
\(\ell_2\) |
\(\frac{1}{2}\|W\|_F^2 = \frac{1}{2}\sum_{i=1}^m\sum_{j=1}^{K} W_{i,j}^2\) |
|
\(\frac{1 - \rho}{2}\|W\|_F^2 + \rho \|W\|_{1,1}\) |
1.1.11.3. 求解器#
在 LogisticRegression
类中实现的求解器为“lbfgs”、“liblinear”、“newton-cg”、“newton-cholesky”、“sag”和“saga”。
下表总结了每个求解器支持的惩罚和多项式多类。
求解器 |
|||||||
惩罚 |
‘lbfgs’ |
‘liblinear’ |
‘newton-cg’ |
‘newton-cholesky’ |
‘sag’ |
‘saga’ |
|
L2 惩罚 |
是 |
否 |
是 |
否 |
是 |
是 |
|
L1 惩罚 |
否 |
是 |
否 |
否 |
否 |
是 |
|
弹性网络 (L1 + L2) |
否 |
否 |
否 |
否 |
否 |
是 |
|
无惩罚 (‘none’) |
是 |
否 |
是 |
是 |
是 |
是 |
|
多类支持 |
|||||||
多项式多类 |
是 |
否 |
是 |
否 |
是 |
是 |
|
行为 |
|||||||
惩罚截距(不好) |
否 |
是 |
否 |
否 |
否 |
否 |
|
对于大型数据集更快 |
否 |
否 |
否 |
否 |
是 |
是 |
|
对未缩放数据集具有鲁棒性 |
是 |
是 |
是 |
是 |
否 |
否 |
默认情况下使用“lbfgs”求解器,因为它具有鲁棒性。对于大型数据集,“saga”求解器通常更快。对于大型数据集,您也可以考虑使用 SGDClassifier
以及 loss="log_loss"
,它可能更快,但需要更多调整。
1.1.11.3.1. 求解器之间的差异#
当 fit_intercept=False
且拟合 coef_
(或)要预测的数据为零时,LogisticRegression
使用 solver=liblinear
或 LinearSVC
获得的分数与直接使用外部 liblinear 库获得的分数之间可能存在差异。这是因为对于 decision_function
为零的样本,LogisticRegression
和 LinearSVC
预测负类,而 liblinear 预测正类。请注意,具有 fit_intercept=False
且具有许多 decision_function
为零的样本的模型很可能是一个拟合不足的糟糕模型,建议您设置 fit_intercept=True
并增加 intercept_scaling
。
求解器详细信息#
求解器“liblinear”使用坐标下降 (CD) 算法,并依赖于与 scikit-learn 一起提供的出色 C++ LIBLINEAR 库。但是,liblinear 中实现的 CD 算法无法学习真正的多项式(多类)模型;相反,优化问题以“一对多”的方式分解,因此为所有类训练了单独的二元分类器。这在幕后发生,因此使用此求解器的
LogisticRegression
实例表现为多类分类器。对于 \(\ell_1\) 正则化,sklearn.svm.l1_min_c
允许计算 C 的下界,以获得非“空”模型(所有特征权重为零)。求解器“lbfgs”、“newton-cg”和“sag”仅支持 \(\ell_2\) 正则化或无正则化,并且发现对于某些高维数据收敛速度更快。将
multi_class
设置为“multinomial”并使用这些求解器将学习真正的多项式逻辑回归模型 [5],这意味着它的概率估计应该比默认的“一对多”设置更好地校准。求解器“sag”使用随机平均梯度下降 [6]。当样本数量和特征数量都很大时,它比大型数据集上的其他求解器更快。
求解器“saga” [7] 是“sag”的一个变体,它也支持非光滑的
penalty="l1"
。因此,它是稀疏多项式逻辑回归的首选求解器。它也是唯一支持penalty="elasticnet"
的求解器。“lbfgs”是一种优化算法,它近似于 Broyden–Fletcher–Goldfarb–Shanno 算法 [8],它属于拟牛顿方法。因此,它可以处理各种不同的训练数据,因此是默认的求解器。但是,它的性能在缩放不良的数据集和具有罕见类别的独热编码分类特征的数据集上会下降。
求解器“newton-cholesky”是一个精确的牛顿求解器,它计算海森矩阵并求解得到的线性系统。对于
n_samples
>>n_features
,它是一个非常好的选择,但它有一些缺点:仅支持 \(\ell_2\) 正则化。此外,由于显式计算海森矩阵,内存使用量对n_features
以及n_classes
具有二次依赖关系。因此,对于多类情况,仅实现了“一对多”方案。
有关这些求解器中一些的比较,请参见 [9]。
参考文献
Christopher M. Bishop: 模式识别与机器学习,第 4.3.4 章
Mark Schmidt、Nicolas Le Roux 和 Francis Bach: 使用随机平均梯度最小化有限和。
Aaron Defazio、Francis Bach、Simon Lacoste-Julien: SAGA:一种支持非强凸复合目标的快速增量梯度方法。
https://en.wikipedia.org/wiki/Broyden%E2%80%93Fletcher%E2%80%93Goldfarb%E2%80%93Shanno_algorithm
Thomas P. Minka “逻辑回归的数值优化器比较”
LogisticRegressionCV
实现带有内置交叉验证支持的逻辑回归,以根据 scoring
属性找到最佳的 C
和 l1_ratio
参数。“newton-cg”、“sag”、“saga” 和 “lbfgs” 求解器被发现对于高维稠密数据更快,因为它们使用热启动(参见 词汇表)。
1.1.12. 广义线性模型#
广义线性模型 (GLM) 以两种方式扩展线性模型 [10]。首先,预测值 \(\hat{y}\) 通过逆链接函数 \(h\) 与输入变量 \(X\) 的线性组合相关联,如下所示:
其次,平方损失函数被指数族分布的单位偏差 \(d\)(更准确地说,是可再生指数离散模型 (EDM) [11])替换。
最小化问题变为
其中 \(\alpha\) 是 L2 正则化惩罚。当提供样本权重时,平均值变为加权平均值。
下表列出了一些特定的 EDM 及其单位偏差
分布 |
目标域 |
单位偏差 \(d(y, \hat{y})\) |
---|---|---|
正态 |
\(y \in (-\infty, \infty)\) |
\((y-\hat{y})^2\) |
伯努利 |
\(y \in \{0, 1\}\) |
\(2({y}\log\frac{y}{\hat{y}}+({1}-{y})\log\frac{{1}-{y}}{{1}-\hat{y}})\) |
类别 |
\(y \in \{0, 1, ..., k\}\) |
\(2\sum_{i \in \{0, 1, ..., k\}} I(y = i) y_\text{i}\log\frac{I(y = i)}{\hat{I(y = i)}}\) |
泊松 |
\(y \in [0, \infty)\) |
\(2(y\log\frac{y}{\hat{y}}-y+\hat{y})\) |
伽马 |
\(y \in (0, \infty)\) |
\(2(\log\frac{\hat{y}}{y}+\frac{y}{\hat{y}}-1)\) |
逆高斯 |
\(y \in (0, \infty)\) |
\(\frac{(y-\hat{y})^2}{y\hat{y}^2}\) |
这些分布的概率密度函数 (PDF) 在下图中说明:
伯努利分布是一种离散概率分布,用于模拟伯努利试验——一个只有两种互斥结果的事件。类别分布是伯努利分布的推广,适用于类别随机变量。虽然伯努利分布中的随机变量只有两种可能的结果,但类别随机变量可以取 K 个可能类别中的一个,每个类别的概率分别指定。
分布的选择取决于具体问题
如果目标值 \(y\) 是计数(非负整数值)或相对频率(非负值),则可以使用具有对数链接的泊松分布。
如果目标值是正值且偏斜,则可以使用具有对数链接的伽马分布。
如果目标值似乎比伽马分布具有更重的尾部,则可以使用逆高斯分布(甚至 Tweedie 族中更高的方差幂)。
如果目标值 \(y\) 是概率,则可以使用伯努利分布。具有 logit 链接的伯努利分布可用于二元分类。具有 softmax 链接的类别分布可用于多类分类。
用例示例#
农业/天气建模:每年降雨事件数量(泊松)、每次降雨量(伽马)、每年总降雨量(Tweedie/复合泊松伽马)。
风险建模/保险保单定价:每年每位投保人索赔事件数量(泊松)、每次事件成本(伽马)、每年每位投保人总成本(Tweedie/复合泊松伽马)。
信用违约:贷款无法偿还的概率(伯努利)。
欺诈检测:金融交易(如现金转账)是欺诈交易的概率(伯努利)。
预测性维护:每年生产中断事件数量(泊松)、中断持续时间(伽马)、每年总中断时间(Tweedie/复合泊松伽马)。
医疗药物测试:在一组试验中治愈患者的概率或患者出现副作用的概率(伯努利)。
新闻分类:将新闻文章分类为三大类,即商业新闻、政治新闻和娱乐新闻(类别)。
参考文献
McCullagh, Peter; Nelder, John (1989). Generalized Linear Models, Second Edition. Boca Raton: Chapman and Hall/CRC. ISBN 0-412-31760-5.
Jørgensen, B. (1992). The theory of exponential dispersion models and analysis of deviance. Monografias de matemática, no. 51. 另请参见 指数离散模型.
1.1.12.1. 用法#
TweedieRegressor
实现了一个用于 Tweedie 分布的广义线性模型,它允许使用适当的 power
参数对上述任何分布进行建模。特别是
power = 0
:正态分布。在这种情况下,通常更适合使用诸如Ridge
、ElasticNet
等特定估计器。power = 1
:泊松分布。为了方便起见,提供了PoissonRegressor
。但是,它与TweedieRegressor(power=1, link='log')
严格等效。power = 2
:伽马分布。为了方便起见,提供了GammaRegressor
。但是,它与TweedieRegressor(power=2, link='log')
严格等效。power = 3
:逆高斯分布。
链接函数由 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...
示例
实际注意事项#
特征矩阵 X
应该在拟合之前进行标准化。这确保了惩罚对特征进行公平处理。
由于线性预测器 \(Xw\) 可能为负,而泊松、伽马和逆高斯分布不支持负值,因此有必要应用一个逆链接函数来保证非负性。例如,使用 link='log'
,逆链接函数变为 \(h(Xw)=\exp(Xw)\)。
如果要对相对频率进行建模,即每暴露量(时间、体积等)的计数,则可以使用泊松分布并将 \(y=\frac{\mathrm{counts}}{\mathrm{exposure}}\) 作为目标值,并将 \(\mathrm{exposure}\) 作为样本权重传递。有关具体示例,请参见例如 保险索赔的 Tweedie 回归。
在对 TweedieRegressor
的 power
参数执行交叉验证时,建议指定一个明确的 scoring
函数,因为默认评分器 TweedieRegressor.score
本身是 power
的函数。
1.1.13. 随机梯度下降 - SGD#
随机梯度下降是一种简单但非常有效的方法来拟合线性模型。当样本数量(和特征数量)非常大时,它特别有用。 partial_fit
方法允许在线/离线学习。
类 SGDClassifier
和 SGDRegressor
提供了使用不同的(凸)损失函数和不同的惩罚来拟合分类和回归的线性模型的功能。例如,使用 loss="log"
,SGDClassifier
拟合一个逻辑回归模型,而使用 loss="hinge"
,它拟合一个线性支持向量机 (SVM)。
有关更多详细信息,您可以参考专门的 随机梯度下降 文档部分。
1.1.14. 感知器#
Perceptron
是另一种适用于大规模学习的简单分类算法。默认情况下
它不需要学习率。
它没有正则化(惩罚)。
它只在出现错误时更新其模型。
最后一个特征意味着感知器比使用铰链损失的 SGD 训练速度略快,并且生成的模型更稀疏。
事实上,Perceptron
是围绕 SGDClassifier
类使用感知器损失和恒定学习率的包装器。有关更多详细信息,请参阅 SGD 过程的 数学部分。
1.1.15. 被动攻击算法#
被动攻击算法是一系列用于大规模学习的算法。它们类似于感知器,因为它们不需要学习率。但是,与感知器相反,它们包含一个正则化参数 C
。
对于分类,PassiveAggressiveClassifier
可以与 loss='hinge'
(PA-I) 或 loss='squared_hinge'
(PA-II) 一起使用。对于回归,PassiveAggressiveRegressor
可以与 loss='epsilon_insensitive'
(PA-I) 或 loss='squared_epsilon_insensitive'
(PA-II) 一起使用。
参考文献#
“在线被动攻击算法” K. Crammer, O. Dekel, J. Keshat, S. Shalev-Shwartz, Y. Singer - JMLR 7 (2006)
1.1.16. 稳健回归:异常值和建模误差#
稳健回归旨在拟合存在损坏数据的回归模型:异常值或模型中的误差。
1.1.16.1. 不同的场景和有用的概念#
在处理受异常值损坏的数据时,需要牢记以下几点
X 或 y 中的异常值?
异常值的比例与误差的幅度
异常点的数量很重要,但它们是异常值的程度也很重要。
稳健拟合的一个重要概念是崩溃点:数据可以是异常值的比例,以便拟合开始错过内点数据。
请注意,通常情况下,在高维设置(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 将更好地处理 y 方向上的大异常值(最常见的情况)。
Theil Sen 将更好地处理 X 方向上的中等大小的异常值,但此属性将在高维设置中消失。
如有疑问,请使用 RANSAC。
1.1.16.2. RANSAC:随机抽样一致性#
RANSAC(随机抽样一致性)从完整数据集中的内点随机子集拟合模型。
RANSAC 是一种非确定性算法,它只以一定的概率产生合理的结果,该概率取决于迭代次数(参见 max_trials
参数)。它通常用于线性回归和非线性回归问题,尤其是在摄影测量计算机视觉领域很受欢迎。
该算法将完整的输入样本数据分成一组内点,这些内点可能受到噪声的影响,以及异常值,这些异常值例如是由错误的测量或对数据的无效假设造成的。然后,仅根据确定的内点估计结果模型。
示例
算法详情#
每次迭代执行以下步骤:
从原始数据中选择
min_samples
个随机样本,并检查数据集是否有效(参见is_data_valid
)。将模型拟合到随机子集 (
estimator.fit
),并检查估计的模型是否有效(参见is_model_valid
)。通过计算估计模型的残差 (
estimator.predict(X) - y
) 将所有数据分类为内点或外点 - 所有绝对残差小于或等于residual_threshold
的数据样本都被视为内点。如果内点样本数量最大,则将拟合的模型保存为最佳模型。如果当前估计的模型具有相同的内点数量,则只有在它具有更好的分数时才将其视为最佳模型。
这些步骤要么执行最大次数 (max_trials
),要么直到满足其中一个特殊的停止条件(参见 stop_n_inliers
和 stop_score
)。最终模型使用先前确定的最佳模型的所有内点样本(一致集)进行估计。
is_data_valid
和 is_model_valid
函数允许识别和拒绝随机子样本的退化组合。如果估计的模型不需要用于识别退化情况,则应使用 is_data_valid
,因为它在拟合模型之前被调用,从而导致更好的计算性能。
参考文献#
“随机样本一致性:一种用于模型拟合的范式,应用于图像分析和自动化制图” Martin A. Fischler 和 Robert C. Bolles - SRI International (1981)
“RANSAC 家族的性能评估” Sunglok Choi、Taemin Kim 和 Wonpil Yu - BMVC (2009)
1.1.16.3. Theil-Sen 估计器:基于广义中值的估计器#
TheilSenRegressor
估计器使用多维中值的推广。因此,它对多变量异常值具有鲁棒性。但是请注意,估计器的鲁棒性会随着问题的维数快速下降。在高维情况下,它会失去其鲁棒性,并且与普通最小二乘法相比没有优势。
示例
理论考虑#
TheilSenRegressor
在渐近效率和无偏估计方面与 普通最小二乘法 (OLS) 相当。与 OLS 不同,Theil-Sen 是一种非参数方法,这意味着它对数据的潜在分布没有假设。由于 Theil-Sen 是一种基于中值的估计器,因此它对损坏的数据(即异常值)更稳健。在单变量设置中,Theil-Sen 在简单线性回归的情况下具有约 29.3% 的崩溃点,这意味着它可以容忍高达 29.3% 的任意损坏数据。
scikit-learn 中 TheilSenRegressor
的实现遵循对使用空间中值的 [14] 多元线性回归模型的推广,空间中值是中值在多维空间的推广 [15]。
在时间和空间复杂度方面,Theil-Sen 的缩放比例为
这使得它无法被完全应用于具有大量样本和特征的问题。因此,可以通过仅考虑所有可能组合的随机子集来选择子群体的规模,以限制时间和空间复杂度。
参考文献
Xin Dang、Hanxiang Peng、Xueqin Wang 和 Heping Zhang:多元线性回归模型中的 Theil-Sen 估计器。
Kärkkäinen 和 S. Äyrämö:关于稳健数据挖掘的空间中值计算。
另请参见 维基百科页面
1.1.16.4. Huber 回归#
HuberRegressor
与 Ridge
不同,因为它对被分类为异常值的样本应用线性损失。如果样本的绝对误差小于某个阈值,则该样本被分类为内点。它与 TheilSenRegressor
和 RANSACRegressor
不同,因为它不会忽略异常值的影响,而是对它们赋予较小的权重。
示例
数学细节#
HuberRegressor
最小化的损失函数由下式给出
其中
建议将参数 epsilon
设置为 1.35 以实现 95% 的统计效率。
参考文献
Peter J. Huber、Elvezio M. Ronchetti:稳健统计,伴随尺度估计,第 172 页
HuberRegressor
与使用 SGDRegressor
并将损失设置为 huber
的区别在于以下方面。
HuberRegressor
对缩放具有不变性。一旦设置了epsilon
,将X
和y
按不同的值向上或向下缩放将产生与之前相同的对异常值的鲁棒性。与SGDRegressor
相比,在SGDRegressor
中,当X
和y
被缩放时,需要重新设置epsilon
。HuberRegressor
在样本数量较少的数据上使用应该更有效,而SGDRegressor
需要对训练数据进行多次遍历才能产生相同的鲁棒性。
请注意,此估计器与 R 中的稳健回归实现不同(https://stats.oarc.ucla.edu/r/dae/robust-regression/),因为 R 实现使用加权最小二乘法实现,权重根据每个样本的残差超过某个阈值的程度来分配。
1.1.17. 分位数回归#
分位数回归估计 \(y\) 在给定 \(X\) 条件下的中位数或其他分位数,而普通最小二乘法 (OLS) 估计条件均值。
如果对预测区间而不是点预测感兴趣,分位数回归可能很有用。有时,预测区间是根据预测误差服从均值为零且方差恒定的正态分布的假设来计算的。即使对于具有非恒定(但可预测)方差或非正态分布的误差,分位数回归也能提供合理的预测区间。
基于最小化弹球损失,除了线性模型之外,其他模型也可以估计条件分位数。例如,如果 GradientBoostingRegressor
的参数 loss
设置为 "quantile"
且参数 alpha
设置为要预测的分位数,则它可以预测条件分位数。请参阅 梯度提升回归的预测区间 中的示例。
大多数分位数回归实现都是基于线性规划问题。当前实现基于 scipy.optimize.linprog
。
示例
数学细节#
作为线性模型,QuantileRegressor
对 \(q\) 分位数(\(q \in (0, 1)\))给出线性预测 \(\hat{y}(w, X) = Xw\)。然后通过以下最小化问题找到权重或系数 \(w\):
这包括弹球损失(也称为线性损失),另请参阅 mean_pinball_loss
,
以及由参数 alpha
控制的 L1 惩罚,类似于 Lasso
。
由于弹球损失仅在残差中是线性的,因此分位数回归比基于平方误差的均值估计对异常值更稳健。介于两者之间的是 HuberRegressor
。
参考文献#
Koenker, R., & Bassett Jr, G. (1978). 回归分位数。 计量经济学:计量经济学会杂志,33-50。
Portnoy, S., & Koenker, R. (1997). 高斯野兔和拉普拉斯乌龟:平方误差估计量与绝对误差估计量的可计算性。统计科学,12,279-300。
Koenker, R. (2005). 分位数回归。剑桥大学出版社。
1.1.18. 多项式回归:使用基函数扩展线性模型#
机器学习中的一种常见模式是使用训练在数据非线性函数上的线性模型。这种方法保持了线性方法通常的快速性能,同时允许它们拟合更广泛的数据范围。
数学细节#
例如,可以通过从系数构建**多项式特征**来扩展简单的线性回归。在标准线性回归情况下,您可能有一个针对二维数据的模型,如下所示
如果我们想对数据拟合抛物面而不是平面,我们可以将特征组合在二阶多项式中,使模型看起来像这样
(有时令人惊讶的)观察结果是,这仍然是一个线性模型:要看到这一点,想象创建一个新的特征集
通过这种数据的重新标记,我们的问题可以写成
我们看到,由此产生的多项式回归属于我们上面考虑的同一类线性模型(即模型在 \(w\) 中是线性的),并且可以通过相同的技术求解。通过考虑在使用这些基函数构建的高维空间内的线性拟合,该模型具有灵活性以拟合更广泛的数据范围。
以下是用不同次数的多项式特征将此想法应用于一维数据的示例
此图是使用 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.]])
的特征已从\([x_1, x_2]\)转换为\([1, x_1, x_2, x_1^2, x_1 x_2, x_2^2]\),现在可以在任何线性模型中使用。
这种预处理可以通过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.])
在多项式特征上训练的线性模型能够准确地恢复输入多项式系数。
在某些情况下,不需要包含任何单个特征的更高幂,而只需要所谓的交互特征,这些特征最多将\(d\)个不同特征相乘。这些特征可以通过PolynomialFeatures
获得,设置interaction_only=True
。
例如,在处理布尔特征时,\(x_i^n = x_i\)对于所有\(n\)都是无用的;但\(x_i x_j\)表示两个布尔值的合取。这样,我们就可以用线性分类器解决异或问题
>>> 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