1.1. 线性模型#

以下是一组用于回归的方法,其中目标值预计是特征的线性组合。 在数学符号中,如果 \(\hat{y}\) 是预测值。

\[\hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_p\]

在整个模块中,我们将向量 \(w = (w_1, ..., w_p)\) 指定为 coef_ ,将 \(w_0\) 指定为 intercept_

要使用广义线性模型进行分类,请参阅 逻辑回归

1.1.1. 普通最小二乘法#

LinearRegression 拟合一个带有系数 \(w = (w_1, ..., w_p)\) 的线性模型,以最小化数据集中观测目标与线性近似预测目标之间的残差平方和。从数学上讲,它解决了一个形式如下的问题:

\[\min_{w} || X w - y||_2^2\]
../_images/sphx_glr_plot_ols_001.png

LinearRegression 将在其 fit 方法中接受数组 Xy ,并将线性模型的系数 \(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 回归通过施加系数大小的惩罚来解决 普通最小二乘法 的一些问题。岭系数最小化了一个带惩罚的残差平方和:

\[\min_{w} || X w - y||_2^2 + \alpha ||w||_2^2\]

复杂度参数 \(\alpha \geq 0\) 控制收缩量:\(\alpha\) 的值越大,收缩量越大,因此系数对共线性的鲁棒性更强。

../_images/sphx_glr_plot_ridge_path_001.png

与其他线性模型一样,Ridge 将在其 fit 方法中接受数组 Xy ,并将线性模型的系数 \(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’

指定了 positive=True 选项。

‘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. 设置正则化参数:留一交叉验证#

RidgeCVRidgeClassifierCV 实现了内置 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 折交叉验证,而不是留一法交叉验证。

#参考文献
[RL2007]

“Notes on Regularized Least Squares”, Rifkin & Lippert ( technical report , course slides ).

1.1.3. Lasso#

Lasso 是一种估计稀疏系数的线性模型。它在某些情况下很有用,因为它倾向于选择具有较少非零系数的解,从而有效地减少了给定解所依赖的特征数量。因此,Lasso 及其变体是压缩感知领域的基本方法。在某些条件下,它可以恢复精确的非零系数集合(参见 压缩感知:具有L1先验(Lasso)的断层扫描重建 )。

从数学上讲,它由一个带有附加正则化项的线性模型组成。要最小化的目标函数是:

\[\min_{w} { \frac{1}{2n_{\text{samples}}} ||X w - y||_2 ^ 2 + \alpha ||w||_1}\]

因此,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 对于低层次任务非常有用,因为它计算了可能值范围内的系数。

示例

Note

使用Lasso进行特征选择

由于Lasso回归产生稀疏模型,因此可以用于执行特征选择,详情请参见 基于 L1 的特征选择

#参考文献

以下两篇参考文献解释了scikit-learn中坐标下降求解器的迭代过程,以及用于收敛控制的 duality gap 计算。

  • “Regularization Path For Generalized linear Models by Coordinate Descent”, Friedman, Hastie & Tibshirani, J Stat Softw, 2010 ( 论文).

  • “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 ( 论文)

1.1.3.1. 设置正则化参数#

alpha 参数控制估计系数的稀疏程度。

1.1.3.1.1. 使用交叉验证#

scikit-learn 提供了通过交叉验证设置Lasso alpha 参数的对象:LassoCVLassoLarsCVLassoLarsCV 基于下面解释的 最小角回归 算法。

对于具有许多共线特征的高维数据集,

LassoCV 通常是首选。然而,LassoLarsCV 具有探索更多相关 alpha 参数值的优势,并且如果样本数量与特征数量相比非常少,它通常比 LassoCV 更快。

lasso_cv_1 lasso_cv_2

1.1.3.1.2. 基于信息准则的模型选择#

或者,估计器 LassoLarsIC 提出使用赤池信息准则(AIC)和贝叶斯信息准则(BIC)。它是一种计算成本较低的替代方法,用于找到 alpha 的最优值,因为正则化路径仅计算一次,而不是使用 k 折交叉验证时的 k+1 次。

实际上,这些准则是在样本内训练集上计算的。简而言之,它们通过模型的灵活性(参见下面的“数学细节”部分)来惩罚不同 Lasso 模型的过度乐观分数。

然而,这样的准则需要对解的自由度进行适当估计,适用于大样本(渐近结果),并假设正确模型在候选模型中。当问题条件不佳时(例如,特征多于样本),它们也倾向于失效。

../_images/sphx_glr_plot_lasso_lars_ic_001.png

示例

1.1.3.1.3. AIC 和 BIC 准则#

AIC(以及 BIC)的定义在文献中可能有所不同。在本节中,我们将提供更多关于 scikit-learn 中计算的准则的信息。

#数学细节

AIC 准则定义为:

\[AIC = -2 \log(\hat{L}) + 2 d\]

其中 \(\hat{L}\) 是模型的最大似然值,\(d\) 是参数的数量(在前一节中也称为自由度)。

BIC 的定义将常数 \(2\) 替换为 \(\log(N)\)

\[BIC = -2 \log(\hat{L}) + \log(N) d\]

其中 \(N\) 是样本数量。

对于线性高斯模型,最大对数似然定义为:

\[\log(\hat{L}) = - \frac{n}{2} \log(2 \pi) - \frac{n}{2} \ln(\sigma^2) - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{2\sigma^2}\]

其中 \(\sigma^2\) 是噪声方差的估计值,\(y_i\)\(\hat{y}_i\) 分别是真实目标值和预测目标值,\(n\) 是样本数量。

将对数似然最大值代入 AIC 公式得到:

\[AIC = n \log(2 \pi \sigma^2) + \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sigma^2} + 2 d\]

上述表达式的第一项有时会被忽略,因为当 \(\sigma^2\) 给定时,它是一个常数。此外,有时会提到 AIC 等价于 \(C_p\) 统计量 [12]。然而,严格来说,它只在某些常数和乘法因子的情况下等价。

最后,我们提到上面 \(\sigma^2\) 是噪声方差的估计值。在 LassoLarsIC 中,当参数 noise_variance 未提供(默认)时,噪声方差通过无偏估计量 [13] 估计为:

\[\sigma^2 = \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{n - p}\]

其中 \(p\) 是特征的数量,\(\hat{y}_i\) 是使用普通最小二乘回归预测的目标值。注意,这个公式仅在 n_samples > n_features 时有效。

参考文献

1.1.3.1.4. 与SVM的正则化参数的比较#

alpha 和 SVM 的正则化参数 C 之间的等价关系由 alpha = 1 / Calpha = 1 / (n_samples * C) 给出,具体取决于估计器和模型优化的确切目标函数。

1.1.4. 多任务Lasso#

MultiTaskLasso 是一个线性模型,它联合估计多个回归问题的稀疏系数: y 是一个形状为 (n_samples, n_tasks) 的二维数组。约束条件是所选特征对于所有回归问题(也称为任务)都是相同的。

下图比较了使用简单Lasso或多任务Lasso获得的系数矩阵W中非零条目的位置。Lasso估计产生分散的非零值,而多任务Lasso的非零值是完整的列。

multi_task_lasso_1 |multi_task_lasso_2|

拟合时间序列模型,强制任何活跃特征在所有时间点上均活跃。

示例

#数学细节

从数学上讲,它由一个线性模型组成,该模型通过混合的 \(\ell_1\) \(\ell_2\) -范数进行正则化训练。 要最小化的目标函数是:

\[\min_{W} { \frac{1}{2n_{\text{samples}}} ||X W - Y||_{\text{Fro}} ^ 2 + \alpha ||W||_{21}}\]

其中 \(\text{Fro}\) 表示 Frobenius 范数

\[||A||_{\text{Fro}} = \sqrt{\sum_{ij} a_{ij}^2}\]

以及 \(\ell_1\) \(\ell_2\) 表示

\[||A||_{2 1} = \sum_i \sqrt{\sum_j a_{ij}^2}.\]

MultiTaskLasso 中的实现使用坐标下降算法来拟合系数。

1.1.5. 弹性网络#

ElasticNet 是一种线性回归模型,其系数同时使用 \(\ell_1\)\(\ell_2\) -范数进行正则化训练。 这种组合允许学习一个稀疏模型,其中很少的权重是非零的,类似于 Lasso ,同时仍然保持 Ridge 的正则化特性。我们使用 l1_ratio 参数控制 \(\ell_1\)\(\ell_2\) 的凸组合。

当存在多个相互关联的特征时,弹性网络很有用。Lasso 可能会随机选择其中一个,而弹性网络可能会选择两者。

在 Lasso 和 Ridge 之间进行权衡的一个实际优势是,它允许弹性网络继承一些在旋转下的稳定性。

在这种情况下,要最小化的目标函数是

\[ \begin{align}\begin{aligned}\min_{w} { \frac{1}{2n_{\text{samples}}} ||X w - y||_2 ^ 2 + \alpha \rho ||w||_1 +\\\frac{\alpha(1-\rho)}{2} ||w||_2 ^ 2}\end{aligned}\end{align} \]
../_images/sphx_glr_plot_lasso_coordinate_descent_path_001.png
ElasticNetCV 可以通过交叉验证来设置参数

alpha (\(\alpha\) ) 和 l1_ratio (\(\rho\) )。

示例

#参考文献

以下两篇参考文献解释了坐标下降求解器在scikit-learn中的迭代过程, 以及用于收敛控制的duality gap计算。

  • “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) 的二维数组。约束条件是所有回归问题(也称为任务)选择的特征是相同的。

从数学上讲,它由一个线性模型组成,该模型通过混合的 \(\ell_1\) \(\ell_2\) -范数和 \(\ell_2\) -范数进行正则化训练。要最小化的目标函数是:

\[\min_{W} { \frac{1}{2n_{\text{样本}}} ||X W - Y||_{\text{Fro}}^2 + \alpha \rho ||W||_{2 1} + \frac{\alpha(1-\rho)}{2} ||W||_{\text{Fro}}^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)的《Annals of Statistics》的讨论部分详细讨论了这个问题。

统计文章。

LARS模型可以通过估计器 Lars 或其低级实现 lars_pathlars_path_gram 来使用。

1.1.8. LARS Lasso#

LassoLars 是使用LARS算法实现的lasso模型,与基于坐标下降的实现不同,这产生了精确的解,该解是其系数范数的分段线性函数。

../_images/sphx_glr_plot_lasso_lars_001.png
>>> 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_pathlars_path_gram 函数之一检索路径。

#数学表述

该算法类似于前向逐步回归,但在每一步不是包含特征,而是估计的系数在每个特征与残差的相关性等角方向上增加。

与给出向量结果不同,LARS解由一条曲线组成,表示参数向量的 \(\ell_1\) 范数的每个值的解。完整的系数路径存储在形状为 (n_features, max_features + 1) 的数组 coef_path_ 中。第一列始终为零。

参考文献

1.1.9. 正交匹配追踪 (OMP)#

OrthogonalMatchingPursuitorthogonal_mp 实现了 OMP 算法,用于近似拟合具有非零系数数量约束的线性模型(即 \(\ell_0\) 伪范数)。

作为一种前向特征选择方法,类似于 最小角回归 ,正交匹配追踪可以近似具有固定数量非零元素的最优解向量:

\[\underset{w}{\operatorname{arg\,min\,}} ||y - Xw||_2^2 \text{ subject to } ||w||_0 \leq n_{\text{nonzero_coefs}}\]

或者,正交匹配追踪可以针对特定误差而不是特定数量的非零系数。这可以表示为:

\[\underset{w}{\operatorname{arg\,min\,}} ||w||_0 \text{ subject to } ||y-Xw||_2^2 \leq \text{tol}\]

OMP 基于一种贪婪算法,每一步都包含与当前残差最相关的一个原子。它类似于更简单的匹配追踪(MP)方法,但在每次迭代中,残差是使用先前选择的字典元素的正交投影重新计算的,因此更优。

示例

#参考文献

1.1.10. 贝叶斯回归#

贝叶斯回归技术可以用于在估计过程中包含正则化参数:正则化参数不是硬性设定的,而是根据当前数据进行调整。

这可以通过对模型的超参数引入 无信息先验 来实现。 在 岭回归和分类 中使用的 \(\ell_{2}\) 正则化是 等价于在系数 \(w\) 上找到一个具有精度 \(\lambda^{-1}\) 的高斯先验下的最大后验估计。 与其手动设置 lambda ,不如将其视为一个随机变量,从数据中进行估计。

为了获得一个完全概率模型,假设输出 \(y\) 围绕 \(X w\) 呈高斯分布:

\[p(y|X,w,\alpha) = \mathcal{N}(y|X w,\alpha^{-1})\]

其中 \(\alpha\) 再次被视为一个随机变量,需要从数据中进行估计。

贝叶斯回归的优势包括:

  • 它适应手头的数据。

  • 它可以用于在估计过程中包含正则化参数。

贝叶斯回归的缺点包括:

  • 模型的推断可能非常耗时。

#参考文献
    1. Bishop 的《模式识别与机器学习》给出了贝叶斯方法的良好介绍。

  • 原始算法在 Radford M. Neal 的《神经网络的贝叶斯学习》一书中详细介绍。

1.1.10.1. 贝叶斯岭回归#

BayesianRidge 估计如上所述的回归问题的概率模型。 系数 \(w\) 的先验由一个球形高斯分布给出:

\[p(w|\lambda) = \mathcal{N}(w|0,\lambda^{-1}\mathbf{I}_{p})\]

\(\alpha\)\(\lambda\) 的先验选择为 伽马分布 ,这是高斯精度的共轭先验。由此产生的模型称为 贝叶斯岭回归,与经典的 Ridge 类似。

参数 \(w\)\(\alpha\)\(\lambda\) 在模型拟合过程中联合估计,正则化参数 \(\alpha\)\(\lambda\) 通过最大化 对数边际似然 进行估计。scikit-learn 实现 基于(Tipping, 2001)附录A中描述的算法,其中参数 \(\alpha\)\(\lambda\) 的更新按照(MacKay, 1992)的建议进行。最大化过程的初始值可以通过超参数 alpha_initlambda_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])

由于贝叶斯框架,找到的权重与 普通最小二乘法 找到的权重略有不同。然而,贝叶斯岭回归对病态问题更为稳健。

示例

#参考文献

1.1.10.2. 自动相关性确定 - ARD#

自动相关性确定(Automatic Relevance Determination,如在 ARDRegression 中实现)是一种线性模型,与 贝叶斯岭回归 非常相似,但会导致更稀疏的系数 \(w\) [1] [2]

ARDRegression\(w\) 施加了一个不同的先验:它放弃了球形高斯分布,转而采用中心椭圆高斯分布。这意味着每个系数 \(w_{i}\) 本身可以从一个高斯分布中抽取,以零为中心,并具有精度 \(\lambda_{i}\)

\[p(w|\lambda) = \mathcal{N}(w|0,A^{-1})\]

其中 \(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 与 贝叶斯岭回归 的详细比较,请参见下面的示例。

示例

参考文献

1.1.11. 逻辑回归#

逻辑回归在 LogisticRegression 中实现。尽管其名称如此,根据 scikit-learn/ML 的命名法,它被实现为一种分类的线性模型,而不是回归模型。逻辑回归在文献中也被称为对数回归、最大熵分类(MaxEnt)或对数线性分类器。在这个模型中,描述单次试验可能结果的概率是通过使用 逻辑函数 来建模的。

此实现可以拟合二元、一对多或多类逻辑回归,并可选地使用 \(\ell_1\)\(\ell_2\) 或弹性网络正则化。

Note

正则化

默认情况下应用正则化,这在机器学习中很常见,但在统计学中并不常见。正则化的另一个优点是它提高了数值稳定性。不进行正则化相当于将 C 设置为一个非常高的值。

Note

逻辑回归作为广义线性模型(GLM)的特例

逻辑回归是具有二项/伯努利条件分布和对数链接函数的 广义线性模型 的特例。逻辑回归的数值输出,即预测概率,可以通过应用一个阈值(默认值为 0.5)来用作分类器。这就是在 scikit-learn 中的实现方式,因此它期望一个分类目标,使得逻辑回归成为一个分类器。

示例

1.1.11.1. 二元情况#

为了便于表示,我们假设目标 \(y_i\) 对于数据点 \(i\) 取值于集合 \(\{0, 1\}\) 。 一旦拟合完成,LogisticRegressionpredict_proba 方法预测 正类的概率 \(P(y_i=1|X_i)\)

\[\hat{p}(X_i) = \operatorname{expit}(X_i w + w_0) = \frac{1}{1 + \exp(-X_i w - w_0)}.\]

作为一个优化问题,带有正则化项 \(r(w)\) 的二分类逻辑回归最小化以下成本函数:

(1)#\[\min_{w} \frac{1}{S}\sum_{i=1}^n s_i \left(-y_i \log(\hat{p}(X_i)) - (1 - y_i) \log(1 - \hat{p}(X_i))\right) + \frac{r(w)}{S C}\,,\]

其中 \({s_i}\) 对应于用户分配给特定训练样本的权重(向量 \(s\) 是通过类权重和样本权重的逐元素乘积形成的), 并且总和 \(S = \sum_{i=1}^n s_i\)

我们目前通过 penalty 参数提供了四种正则化项 \(r(w)\) 的选择:

penalty

\(r(w)\)

None

\(0\)

\(\ell_1\)

\(\|w\|_1\)

\(\ell_2\)

\(\frac{1}{2}\|w\|_2^2 = \frac{1}{2}w^T w\)

ElasticNet

\(\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\) 个类别,从而得到多项逻辑回归,参见 对数线性模型

Note

可以使用 \(K-1\) 个权重向量来参数化一个 \(K\) 类分类模型,利用所有类别概率之和必须为1的事实,通过其他类别概率完全确定一个类别概率。我们有意选择使用 \(K\) 个权重向量来过度参数化模型,以简化实现并保持关于类别顺序的对称归纳偏差,参见 [16]。在使用正则化时,这种效果变得尤为重要。过度参数化的选择可能对未惩罚的模型有害,因为此时解可能不唯一,如 [16] 所示。

#数学细节

\(y_i \in {1, \ldots, K}\) 是观测值 \(i\) 的标签(序数)编码目标变量。我们不再使用单一的系数向量,而是使用一个系数矩阵 \(W\) ,其中每一行向量 \(W_k\) 对应于类别 \(k\) 。我们的目标是预测类别概率 \(P(y_i=k|X_i)\) ,通过 predict_proba 方法进行预测:

\[\hat{p}_k(X_i) = \frac{\exp(X_i W_k + W_{0, k})}{\sum_{l=0}^{K-1} \exp(X_i W_l + W_{0, l})}.\]

优化目标变为

\[\min_W -\frac{1}{S}\sum_{i=1}^n \sum_{k=0}^{K-1} s_{ik} [y_i = k] \log(\hat{p}_k(X_i)) + \frac{r(W)}{S C}\,,\]

其中 \([P]\) 表示 Iverson 括号,如果 \(P\) 为假,则其值为 \(0\) ,否则其值为 \(1\)

再次,\(s_{ik}\) 是用户分配的权重(样本权重和类别权重的乘积),其总和为 \(S = \sum_{i=1}^n \sum_{k=0}^{K-1} s_{ik}\)

我们目前通过 penalty 参数提供了四种正则化项 \(r(W)\) 的选择,其中 \(m\) 是特征的数量:

penalty

\(r(W)\)

None

\(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\)

ElasticNet

\(\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”求解器,因其稳健性。对于大型数据集,“saga”求解器通常更快。 对于大型数据集,您还可以考虑使用 SGDClassifier 并设置 loss="log_loss" ,这可能会更快,但需要更多调整。

1.1.11.3.1. 求解器之间的差异#

使用 solver=liblinearLogisticRegressionLinearSVC 与外部 liblinear 库直接获得的分数可能有所不同, 当 fit_intercept=False 并且拟合的 coef_ (或)要预测的数据为零时。这是因为对于 decision_function 为零的样本,LogisticRegressionLinearSVC 预测负类,而 liblinear 预测正类。请注意,具有 fit_intercept=False 且许多样本的 decision_function 为零的模型很可能是欠拟合的、不良模型,建议您设置 fit_intercept=True 并增加 intercept_scaling

#求解器详情
  • 求解器 “liblinear” 使用坐标下降 (CD) 算法,并依赖于出色的 C++ LIBLINEAR 库 ,该库随 scikit-learn 一起提供。然而,liblinear 中实现的 CD 算法无法学习真正的多项式(多类)模型;相反,优化问题以 “one-vs-rest” 方式分解,因此为所有类训练单独的二元分类器。这发生在幕后,因此使用此求解器的 LogisticRegression 实例表现为多类分类器。对于 \(\ell_1\) 正则化,sklearn.svm.l1_min_c 允许计算 C 的下限,以获得非 “null”(所有特征权重为零)模型。

  • “lbfgs”、”newton-cg” 和 “sag” 求解器仅支持 \(\ell_2\) 正则化或无正则化,并且对于某些高维数据发现收敛速度更快。将 multi_class 设置为 “multinomial” 并使用这些求解器学习真正的多项式逻辑回归模型 [5],这意味着其概率估计应比默认的 “one-vs-rest” 设置更好地校准。

  • “sag” 求解器使用随机平均梯度下降 [6]。对于大型数据集,当样本数量和特征数量都很大时,它比其他求解器更快。

  • “saga” 求解器 [7] 是 “sag” 的一个变体,也支持非平滑的 penalty="l1" 。因此,它是稀疏多项逻辑回归的首选求解器。它也是唯一支持 penalty="elasticnet" 的求解器。

  • “lbfgs” 是一种优化算法,近似于 Broyden–Fletcher–Goldfarb–Shanno 算法 [8],属于拟牛顿方法。因此,它可以处理各种不同的训练数据,因此是默认求解器。然而,它在数据集规模不佳和具有罕见类别的一热编码分类特征的数据集上性能较差。

  • “newton-cholesky” 求解器是一个精确的牛顿求解器,计算 Hessian 矩阵并求解生成的线性系统。它是 n_samples >> n_features 的很好选择,但有一些缺点:仅支持 \(\ell_2\) 正则化。此外,由于 Hessian 矩阵是显式计算的,内存使用量对 n_featuresn_classes 都有二次依赖。因此,在多类情况下只实现了 one-vs-rest 方案。

有关这些求解器的一些比较,请参见 [9]

参考文献

Note

使用稀疏逻辑回归进行特征选择

带有 :math:` ell_1 惩罚项的逻辑回归会产生稀疏模型,因此可以用于执行特征选择,详情请参见 :ref: l1_feature_selection ` 。

Note

P值估计

在无惩罚项的回归情况下,可以获得系数的P值和置信区间。` statsmodels 包 <https://pypi.org/project/statsmodels/> `_ 原生支持这一点。在 sklearn 中,也可以使用自助法(bootstrapping)来替代。

:class:` LogisticRegressionCV`实现了内置交叉验证支持的逻辑回归,以根据 scoring 属性找到最优的 Cl1_ratio 参数。对于高维密集数据,”newton-cg”、”sag”、”saga” 和 “lbfgs” 求解器由于热启动(参见 Glossary )而被发现速度更快。

1.1.12. 广义线性模型#

广义线性模型(GLM)通过两种方式扩展了线性模型 [10]。首先,预测值 \(\hat{y}\) 通过逆链接函数 \(h\) 与输入变量 \(X\) 的线性组合相联系,即

\[\hat{y}(w, X) = h(Xw).\]

其次,平方损失函数被指数族分布(或更准确地说,再生指数分散模型(EDM)[11]_)的单位偏差 \(d\) 所替代。

最小化问题变为:

\[\min_{w} \frac{1}{2 n_{\text{samples}}} \sum_i d(y_i, \hat{y}_i) + \frac{\alpha}{2} ||w||_2^2,\]

其中 \(\alpha\) 是 L2 正则化惩罚项。当样本权重存在时, 如果提供,平均值变为加权平均值。

下表列出了一些特定的EDM及其单位偏差:

这些分布的概率密度函数(PDF)在下图中展示,

../_images/poisson_gamma_tweedie_distributions.png

PDF of a random variable Y following Poisson, Tweedie (power=1.5) and Gamma distributions with different mean values (\(\mu\) ). Observe the point mass at \(Y=0\) for the Poisson distribution and the Tweedie (power=1.5) distribution, but not for the Gamma distribution which has a strictly positive target domain.#

伯努利分布是一种离散概率分布,用于建模伯努利试验——一个只有两种互斥结果的事件。 分类分布是伯努利分布对分类随机变量的推广。虽然伯努利分布中的随机变量

分布有两种可能的结果,而分类随机变量可以取 K 个可能的类别之一,每个类别的概率分别指定。

选择的分布取决于手头的问题:

  • 如果目标值 \(y\) 是计数(非负整数值)或相对频率(非负),您可能会使用带有对数链接的泊松分布。

  • 如果目标值是正值且偏斜,您可能会尝试使用带有对数链接的伽玛分布。

  • 如果目标值似乎比伽玛分布具有更重的尾部,您可能会尝试逆高斯分布(甚至更高方差的 Tweedie 族的幂)。

  • 如果目标值 \(y\) 是概率,您可以使用伯努利分布。带有对数链接的伯努利分布可用于二元分类。带有 softmax 链接的分类分布可用于多类分类。

#使用案例示例
  • 农业/天气建模:每年降雨事件的数量(泊松),每次事件的降雨量(伽玛),每年的总降雨量(Tweedie/复合泊松伽玛)。

  • 风险建模/保险政策定价:每年每位保单持有人的索赔事件数量(泊松),每次事件的成本(伽玛),每年每位保单持有人的总成本(Tweedie/复合泊松伽玛)。

  • 信用违约:贷款无法偿还的概率(伯努利)。

  • 欺诈检测:金融交易(如现金转账)是欺诈交易的概率(伯努利)。

  • 预测性维护:每年生产中断事件的数量(泊松),中断的持续时间(伽玛),每年的总中断时间(Tweedie/复合泊松伽玛)。

  • 医学药物测试:在一组试验中治愈患者的概率或患者将经历副作用的概率(伯努利)。

  • 新闻分类:将新闻文章分类为三个类别,即商业新闻、政治和娱乐新闻(分类)。

参考文献

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回归在保险理赔中的应用

在进行 TweedieRegressorpower 参数交叉验证时,建议指定一个明确的 scoring 函数,因为默认的评分器 TweedieRegressor.score 本身就是 power 的函数。

1.1.13. 随机梯度下降 - SGD#

随机梯度下降是一种简单但非常高效的拟合线性模型的方法。当样本数量(以及特征数量)非常大时,它特别有用。 partial_fit 方法支持在线/外存学习。

SGDClassifierSGDRegressor 类提供了使用不同(凸)损失函数和不同惩罚项来拟合分类和回归线性模型的功能。例如,使用 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)。

#参考文献

1.1.16. 鲁棒性回归:异常值和模型错误#

鲁棒回归旨在在存在腐败数据(无论是异常值还是模型错误)的情况下拟合回归模型。

../_images/sphx_glr_plot_theilsen_001.png

1.1.16.1. 不同的场景和有用的概念#

在处理被异常值污染的数据时,需要记住以下几点: .. |y_outliers| image:: ../auto_examples/linear_model/images/sphx_glr_plot_robust_fit_003.png

target:

../auto_examples/linear_model/plot_robust_fit.html

scale:

60%

  • X 或 y 中的异常值

  • 异常值的比例与误差幅度

    异常点的数量很重要,但同样重要的是它们有多异常。

稳健拟合的一个重要概念是崩溃点:数据中可以有多少异常值,拟合才开始忽略内联数据。

请注意,通常在高维设置中(大量 n_features ),稳健拟合非常困难。这里的稳健模型可能在这些设置中不起作用。

1.1.16.2. RANSAC: RANdom SAmple Consensus#

RANSAC(RANdom SAmple Consensus)从完整数据集中的随机子集的内点拟合模型。

RANSAC 是一个非确定性算法,仅以一定概率产生合理结果,该概率取决于迭代次数(参见 max_trials 参数)。它通常用于线性和非线性回归问题,并且在摄影测量计算机视觉领域特别受欢迎。

该算法将完整的输入样本数据分为一组内点(可能受到噪声影响)和异常值(例如由错误测量或数据无效假设引起)。然后仅从确定的内点估计生成的模型。

../_images/sphx_glr_plot_ransac_001.png

示例

#算法详情

每次迭代执行以下步骤:

  1. 从原始数据中随机选择 min_samples 个样本,并检查数据集是否有效(参见 is_data_valid )。

  2. 将模型拟合到随机子集( estimator.fit ),并检查估计的模型是否有效(参见 is_model_valid )。

  3. 通过计算到估计模型的残差( estimator.predict(X) - y )将所有数据分类为内点或离群点——所有绝对残差小于或等于 residual_threshold 的数据样本被视为内点。

  4. 如果内点样本数量最多,则将拟合的模型保存为最佳模型。如果当前估计的模型具有相同数量的内点,则仅当其得分更高时才被视为最佳模型。

这些步骤执行的次数要么达到最大次数( max_trials ),要么直到满足某个特殊的停止标准之一(参见 stop_n_inliersstop_score )。最终模型是使用先前确定的最佳模型的所有内点样本(共识集)进行估计的。

is_data_validis_model_valid 函数允许识别并拒绝退化的随机子样本组合。如果估计的模型不需要用于识别退化情况,则应使用 is_data_valid ,因为它在拟合模型之前被调用,从而带来更好的计算性能。

#参考文献

1.1.16.3. Theil-Sen 估计器:广义中位数估计器#

TheilSenRegressor 估计器使用多维中位数的广义化。因此,它对多变量离群值具有鲁棒性。然而,需要注意的是,随着问题维度的增加,估计器的鲁棒性会迅速下降。在高维度下,它失去了鲁棒性特性,变得不比普通最小二乘法更好。

示例

#理论考虑

TheilSenRegressor 在渐近效率和作为无偏估计器方面与 普通最小二乘法 (OLS) 相当。与 OLS 不同,Theil-Sen 是一种非参数方法,这意味着它不对数据的基础分布做任何假设。由于 Theil-Sen 是基于中位数的估计器,因此它对损坏数据(即离群值)更具鲁棒性。在单变量设置中,Theil-Sen 在简单线性回归的情况下具有约 29.3% 的崩溃点,这意味着它可以容忍最多 29.3% 的任意损坏数据。

../_images/sphx_glr_plot_theilsen_001.png

scikit-learn 中 TheilSenRegressor 的实现遵循使用空间中位数的多变量线性回归模型的广义化 [14],空间中位数是中位数到多维的广义化 [15]

在时间和空间复杂度方面,Theil-Sen 的规模根据

\[\binom{n_{\text{samples}}}{n_{\text{subsamples}}}\]

这使得它无法全面应用于具有大量样本和特征的问题。因此,可以通过选择一个子群体的大小来限制时间和空间复杂度,只考虑所有可能组合的随机子集。

参考文献

另请参阅 维基百科页面

1.1.16.4. Huber 回归#

HuberRegressorRidge 不同,因为它对被分类为异常值的样本应用线性损失。如果某个样本的绝对误差小于某个阈值,则该样本被分类为内点。它与 TheilSenRegressorRANSACRegressor 不同,因为它不会忽略异常值的影响,而是给予它们较小的权重。

../_images/sphx_glr_plot_huber_vs_ridge_001.png

示例

#数学细节

HuberRegressor 最小化的损失函数如下:

\[\min_{w, \sigma} {\sum_{i=1}^n\left(\sigma + H_{\epsilon}\left(\frac{X_{i}w - y_{i}}{\sigma}\right)\sigma\right) + \alpha {||w||_2}^2}\]

其中

\[\begin{split}H_{\epsilon}(z) = \begin{cases} z^2, & \text {if } |z| < \epsilon, \\ 2\epsilon|z| - \epsilon^2, & \text{otherwise} \end{cases}\end{split}\]

建议将参数 epsilon 设置为 1.35 以达到 95% 的统计效率。

参考文献

  • Peter J. Huber, Elvezio M. Ronchetti: 《稳健统计学》,伴随尺度估计,第 172 页

HuberRegressor 与将损失设置为 huberSGDRegressor 在以下方面有所不同。

  • HuberRegressor 是尺度不变的。一旦设置了 epsilon ,将 Xy 按不同值缩放,与之前相比,对异常值的鲁棒性保持不变。而 SGDRegressorXy 缩放时需要重新设置 epsilon

  • HuberRegressor 在数据样本较少时应更高效,而 SGDRegressor 需要多次遍历训练数据才能产生相同的鲁棒性。

请注意,此估计器与 R 语言的稳健回归实现(https://stats.oarc.ucla.edu/r/dae/robust-regression/)不同,因为 R 实现通过根据残差超过某个阈值的程度为每个样本赋予权重来进行加权最小二乘法实现。

1.1.17. 分位数回归#

分位数回归估计 \(y\) 在给定 \(X\) 条件下的中位数或其他分位数,而普通最小二乘法(OLS)估计条件均值。

如果对预测区间而不是点预测感兴趣,分位数回归可能会有所帮助。有时,预测区间是基于预测误差呈零均值和恒定方差的正态分布假设计算的。分位数回归即使在误差具有非恒定(但可预测)方差或非正态分布的情况下,也能提供合理的预测区间。

../_images/sphx_glr_plot_quantile_regression_002.png
align:

center

scale:

50%

基于最小化针球损失,条件分位数也可以通过线性模型以外的模型来估计。例如, GradientBoostingRegressor 可以在其参数 loss 设置为 "quantile" 且参数 alpha 设置为应预测的分位数时预测条件分位数。请参阅示例: 梯度提升回归的预测区间

大多数分位数回归的实现基于线性规划问题。当前的实现基于 scipy.optimize.linprog

示例

#数学细节

作为一个线性模型,QuantileRegressor 给出了线性预测 \(\hat{y}(w, X) = Xw\) 用于第 \(q\) 个分位数,\(q \in (0, 1)\) 。然后通过以下最小化问题找到权重或系数 \(w\)

\[\min_{w} {\frac{1}{n_{\text{samples}}} \sum_i PB_q(y_i - X_i w) + \alpha ||w||_1}.\]

这包括针球损失(也称为线性损失),参见 mean_pinball_loss

\[\begin{split}PB_q(t) = q \max(t, 0) + (1 - q) \max(-t, 0) = \begin{cases} q t, & t > 0, \\ 0, & t = 0, \\ (q-1) t, & t < 0 \end{cases}\end{split}\]

以及由参数 alpha 控制的 L1 惩罚,类似于 Lasso

由于针球损失仅在线性残差中,分位数回归比基于平方误差的均值估计对异常值更加稳健。介于两者之间的是 HuberRegressor

#参考文献

1.1.18. 多项式回归:通过基函数扩展线性模型#

机器学习中一个常见的模式是使用在数据的非线性函数上训练的线性模型。这种方法保持了线性方法通常快速性能的同时,允许它们拟合更广泛的数据范围。

#数学细节

例如,简单的线性回归可以通过从系数构造**多项式特征**来扩展。在标准的线性回归情况下,对于二维数据,您可能有一个模型如下所示:

\[\hat{y}(w, x) = w_0 + w_1 x_1 + w_2 x_2\]

如果我们想将抛物面拟合到数据而不是平面,我们可以将特征组合在二阶多项式中,使得模型如下所示:

\[\hat{y}(w, x) = w_0 + w_1 x_1 + w_2 x_2 + w_3 x_1 x_2 + w_4 x_1^2 + w_5 x_2^2\]

这个(有时令人惊讶的)观察是这*仍然是一个线性模型*:要看到这一点,想象创建一组新的特征

\[z = [x_1, x_2, x_1 x_2, x_1^2, x_2^2]\]

通过这种数据的重新标记,我们的问题可以写成

\[\hat{y}(w, z) = w_0 + w_1 z_1 + w_2 z_2 + w_3 z_3 + w_4 z_4 + w_5 z_5\]

我们看到,得到的多项式回归与我们上面考虑的线性模型属于同一类(即模型在线性于 \(w\) ),并且可以通过相同的技术解决。通过考虑线性拟合,

在由这些基函数构建的高维空间中,模型具有灵活性,可以适应更广泛的数据范围。

以下是将这一思想应用于一维数据的示例,使用不同次数的多项式特征:

../_images/sphx_glr_plot_polynomial_interpolation_001.png

此图是使用 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`` 的特征已从 :math:`[x_1, x_2]` 转换为 :math:`[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))])
>>> # 拟合三次多项式数据
>>> 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\) 个不同的特征。这些可以通过设置 interaction_only=TruePolynomialFeatures 中获得。

例如,当处理布尔特征时, \(x_i^n = x_i\) 对于所有 \(n\) 都是无用的;但 \(x_i x_j\) 表示两个布尔值的合取。这样,我们可以用线性分类器解决 XOR 问题:

>>> 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