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

要使用广义线性模型执行分类,请参见 Logistic回归 .

1.1.1. 普通最小二乘#

LinearRegression 用系数匹配线性模型 \(w = (w_1, ..., w_p)\) 最小化数据集中观察到的目标与线性逼近预测的目标之间的残余平方和。从数学上讲,它解决了以下形式的问题:

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

LinearRegression 接受它的 fit 方法参数 X , y , sample_weight 并存储系数 \(w\) 线性模型在其 coef_intercept_ 属性::

>>> 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])
>>> reg.intercept_
0.0

普通最小平方的系数估计依赖于特征的独立性。当功能相关且设计矩阵的某些列时 \(X\) 具有大致线性相关性,设计矩阵变得接近奇异,因此,最小平方估计变得对观察目标中的随机误差高度敏感,从而产生很大的方差。的这种情况 multicollinearity 例如,当在没有实验设计的情况下收集数据时可能会出现。

示例

1.1.1.1. 非负最小平方#

可以将所有系数限制为非负,当它们代表一些物理或自然非负量(例如,频率计数或商品价格)。 LinearRegression 接受布尔值 positive 参数:设置为时 True Non-Negative Least Squares 然后应用。

示例

1.1.1.2. 普通最小二乘复杂性#

The least squares solution is computed using the singular value decomposition of \(X\). If \(X\) is a matrix of shape (n_samples, n_features) this method has a cost of \(O(n_{\text{samples}} n_{\text{features}}^2)\), assuming that \(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 方法数组 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_
np.float64(0.13636)

请注意,班级 Ridge 允许用户指定通过设置自动选择求解器 solver="auto" .指定此选项时, Ridge 将在 "lbfgs" , "cholesky" ,而且 "sparse_cg" 解决者。 Ridge 将开始从上到下检查下表中所示的条件。如果条件为真,则选择相应的求解器。

Solver

Condition

“lbfgs”

positive=True 已指定选项。

“古怪”

输入数组X不是稀疏的。

'sparse_cg'

上述条件均不满足。

示例

1.1.2.2. 分类#

Ridge 回归量有一个分类器变体: RidgeClassifier .该分类器首先将二进制目标转换为 {-1, 1} 然后将该问题视为回归任务,优化与上述相同的目标。预测的类别对应于回归量预测的符号。对于多类分类,该问题被视为多输出回归,预测的类对应于具有最高值的输出。

使用(惩罚的)最小平方损失来适应分类模型,而不是更传统的逻辑或铰链损失似乎有问题。然而,在实践中,所有这些模型都可以在准确性或精确性/召回率方面导致相似的交叉验证分数,而使用的惩罚最小平方损失 RidgeClassifier 允许对具有不同计算性能配置文件的数值求解器进行非常不同的选择。

RidgeClassifier 可以比例如显着更快 LogisticRegression 具有大量类,因为它可以计算投影矩阵 \((X^T X)^{-1} X^T\) 只有一次。

此分类器有时被称为 Least Squares Support Vector Machine 一个线性内核。

示例

1.1.2.3. 山脊复杂性#

该方法的复杂性与 普通最小二乘 .

1.1.2.4. 设置正规化参数:留一交叉验证#

RidgeCVRidgeClassifierCV 通过Alpha参数的内置交叉验证实现岭回归/分类。它们的工作方式与 GridSearchCV 除了它默认为高效的留一出 cross-validation .使用默认值时 cross-validation ,由于用于计算留一出误差的公式,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_
np.float64(0.01)

验证的价值 cv 属性将触发交叉验证的使用 GridSearchCV 例如 cv=10 用于10次交叉验证,而不是留一次交叉验证。

引用#
[RL2007]

“关于正规化最小平方的注释”,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}\]

因此,套索估计解决了最小平方罚的最小化问题 \(\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 对于较低级别的任务很有用,因为它计算沿着可能值的完整路径的系数。

示例

备注

Feature selection with Lasso

由于Lasso回归产生稀疏模型,因此可用于执行特征选择,如 基于L1的特征选择 .

引用#

以下两篇参考文献解释了scikit-learn的坐标下降求解器中使用的迭代,以及用于收敛控制的对偶间隙计算。

  • “通过坐标下降为广义线性模型的正规化路径”,Friedman、Hastie和Tibshirani、J Stat Softw,2010年 (Paper _).

  • “大规模L1正规化最小平方的内点方法”,S。J. Kim、K. Koh,M.勒斯蒂格,S.博伊德和D。Gorinevsky,载于IEEE信号处理精选主题杂志,2007年 (Paper _)

1.1.3.1. 设置规则化参数#

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

1.1.3.1.1. 使用交叉验证#

scikit-learn暴露设置套索的物体 alpha 通过交叉验证参数: LassoCVLassoLarsCV . LassoLarsCV 是基于 最小角回归 算法解释如下。

对于具有许多共线特征的多维数据集, LassoCV 通常是更可取的。然而, LassoLarsCV 具有探索更相关的价值观的优势 alpha 参数,如果样本数量与要素数量相比非常少,则通常比 LassoCV .

lasso_cv_1 lasso_cv_2

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

或者,估计器 LassoLarsIC 建议使用Akaike信息准则(AIC)和Bayes信息准则(BIC)。找到Alpha的最佳值是一种计算上更便宜的替代方案,因为在使用k重交叉验证时,规则化路径仅计算一次,而不是k+1次。

事实上,这些标准是在样本内训练集上计算的。简而言之,他们通过灵活性来惩罚不同Lasso模型过于乐观的分数(参见。至下面的“数学详细信息”部分)。

然而,此类标准需要对解决方案的自由度进行正确估计,是针对大样本(渐进结果)推导的,并假设正确的模型是正在研究的候选模型。当问题条件不佳时(例如特征多于样本),它们也往往会崩溃。

../_images/sphx_glr_plot_lasso_lars_ic_001.png

示例

1.1.3.1.3. AIC和BIC标准#

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

数学细节#

AIC标准定义为:

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

哪里 \(\hat{L}\) 是模型的最大可能性, \(d\) 是参数的数量(在上一节中也称为自由度)。

CIC的定义取代了常数 \(2\) 通过 \(\log(N)\) :

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

哪里 \(N\) 是样本数量。

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

\[\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. 与支持机的正规化参数的比较#

的等价性 alpha 以及支持者的正规化参数, C 由下式给出 alpha = 1 / Calpha = 1 / (n_samples * C) ,取决于估计量和模型优化的确切目标函数。

1.1.4. 多任务套索#

MultiTaskLasso 是一个线性模型,联合估计多重回归问题的稀疏系数: y 是一个2D阵列,具有形状 (n_samples, n_tasks) .限制是,对于所有回归问题(也称为任务),所选特征都是相同的。

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

多_任务_lasso_1多_任务_lasso_2

适应时间序列模型,规定任何活动特征始终处于活动状态。

示例

数学细节#

在数学上,它由一个用混合训练的线性模型组成 \(\ell_1\) \(\ell_2\) - 正规化规范。最小化的目标函数是:

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

哪里 \(\text{Fro}\) 表明弗罗贝尼乌斯规范

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

and \(\ell_1\) \(\ell_2\) reads

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

课堂中的实现 MultiTaskLasso 使用坐标下降作为算法来匹配系数。

1.1.5. Elastic-Net#

ElasticNet is a linear regression model trained with both \(\ell_1\) and \(\ell_2\)-norm regularization of the coefficients. This combination allows for learning a sparse model where few of the weights are non-zero like Lasso, while still maintaining the regularization properties of Ridge. We control the convex combination of \(\ell_1\) and \(\ell_2\) using the l1_ratio parameter.

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

Lasso和Ridge之间权衡的一个实际优势是,它允许Elastic-Net继承Ridge在旋转下的部分稳定性。

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

\[\min_{w} { \frac{1}{2n_{\text{samples}}} ||X w - y||_2 ^ 2 + \alpha \rho ||w||_1 + \frac{\alpha(1-\rho)}{2} ||w||_2 ^ 2}\]
../_images/sphx_glr_plot_lasso_lasso_lars_elasticnet_path_002.png

The class ElasticNetCV can be used to set the parameters alpha (\(\alpha\)) and l1_ratio (\(\rho\)) by cross-validation.

示例

引用#

以下两篇参考文献解释了scikit-learn的坐标下降求解器中使用的迭代,以及用于收敛控制的对偶间隙计算。

  • “通过坐标下降为广义线性模型的正规化路径”,Friedman、Hastie和Tibshirani、J Stat Softw,2010年 (Paper _).

  • “大规模L1正规化最小平方的内点方法”,S。J. Kim、K. Koh,M.勒斯蒂格,S.博伊德和D。Gorinevsky,载于IEEE信号处理精选主题杂志,2007年 (Paper _)

1.1.6. 多任务Elastic-Net#

MultiTaskElasticNet 是一个弹性网络模型,用于联合估计多重回归问题的稀疏系数: Y 是一个2D形状阵列 (n_samples, n_tasks) .限制是,对于所有回归问题(也称为任务),所选特征都是相同的。

在数学上,它由一个用混合训练的线性模型组成 \(\ell_1\) \(\ell_2\) - 规范和 \(\ell_2\) - 正规化规范。最小化的目标函数是:

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

课堂中的实现 MultiTaskElasticNet 使用坐标下降作为算法来匹配系数。

The class MultiTaskElasticNetCV can be used to set the parameters alpha (\(\alpha\)) and l1_ratio (\(\rho\)) by cross-validation.

1.1.7. 最小角回归#

最小角回归(LARS)是一种针对多维数据的回归算法,由Bradley Efron、Trevor Hastie、Iain Johnstone和Robert Tibshirani开发。LARS类似于前向逐步回归。在每一步,它都会找到与目标最相关的特征。当存在多个具有相等相关性的特征时,它不是沿着同一特征继续,而是沿着特征之间的等角度方向进行。

LARS的优点是:

  • 在特征数量明显大于样本数量的情况下,它在数字上是高效的。

  • 它的计算速度与前向选择一样快,并且具有与普通最小平方相同的复杂度。

  • 它生成完整的分段线性解路径,这在交叉验证或类似的调整模型尝试中很有用。

  • 如果两个特征与目标的相关性几乎相同,那么它们的系数应该以大致相同的速度增加。因此,该算法的行为符合直觉的预期,并且更加稳定。

  • 它很容易被修改以为其他估计器(例如Lasso)生成解决方案。

LARS方法的缺点包括:

  • 由于LARS是基于对残余的迭代调整,因此它似乎对噪音的影响特别敏感。Weisberg在Efron等人(2004)《统计年鉴》文章的讨论部分详细讨论了这个问题。

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

1.1.8. LARS套索#

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

../_images/sphx_glr_plot_lasso_lasso_lars_elasticnet_path_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\) 参数载体的规范。完整的系数路径存储在数组中 coef_path_ 形状 (n_features, max_features + 1) .第一列始终为零。

引用

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. 贝叶斯回归#

Bayesian回归技术可用于在估计过程中包括正规化参数:正规化参数不是严格设置的,而是根据手头的数据进行调整。

这可以通过引入 uninformative priors 超过模型的超参数。的 \(\ell_{2}\) 使用的正规化 岭回归与分类 等价于在系数上的高斯先验下找到最大后验估计 \(w\) 精准 \(\lambda^{-1}\) .不是制订 lambda 手动可以将其视为随机变量,从数据中估计。

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

\[p(y| X,w,\Alpha)= \mathCal{N}(y| X w,\Alpha ''')\]

哪里 \(\alpha\) 再次被视为从数据中估计的随机变量。

Bayesian回归的优点是:

  • 它会适应手头的数据。

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

Bayesian回归的缺点包括:

  • 模型的推断可能很耗时。

引用#
  • C中对Bayesian方法进行了很好的介绍。Bishop:模式识别和机器学习

  • 书中详细介绍了原始算法 Bayesian learning for neural networks 作者:Radford M.尼尔

1.1.10.1. Bayesian Ridge Regression#

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

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

前科结束 \(\alpha\)\(\lambda\) 被选择为 gamma distributions ,高斯精确度的共乘先验。生成的模型称为 Bayesian Ridge Regression ,与经典的 Ridge .

The parameters \(w\), \(\alpha\) and \(\lambda\) are estimated jointly during the fit of the model, the regularization parameters \(\alpha\) and \(\lambda\) being estimated by maximizing the log marginal likelihood. The scikit-learn implementation is based on the algorithm described in Appendix A of (Tipping, 2001) where the update of the parameters \(\alpha\) and \(\lambda\) is done as suggested in (MacKay, 1992). The initial value of the maximization procedure can be set with the hyperparameters alpha_init and lambda_init.

There are four more hyperparameters, \(\alpha_1\), \(\alpha_2\), \(\lambda_1\) and \(\lambda_2\) of the gamma prior distributions over \(\alpha\) and \(\lambda\). These are usually chosen to be non-informative. By default \(\alpha_1 = \alpha_2 = \lambda_1 = \lambda_2 = 10^{-6}\).

Bayesian Ridge回归用于回归::

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

由于Bayesian框架,找到的权重与 普通最小二乘 .然而,Bayesian Ridge回归对病态问题更稳健。

示例

引用#

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

自动相关性确定(如在中实现的那样 ARDRegression )是一种线性模型,与 Bayesian Ridge Regression ,但这会导致系数更稀疏 \(w\) [1] [2] .

ARDRegression 提出了不同的先验 \(w\) :它将球形高斯分布丢弃为中心椭圆高斯分布。这意味着每个系数 \(w_{i}\) 本身可以从高斯分布中绘制,以零为中心,具有精确度 \(\lambda_{i}\) :

\[p(w|\拉姆达)= \mathCal{N}(w| 0,A ''\]

with \(A\) being a positive definite diagonal matrix and \(\text{diag}(A) = \lambda = \{\lambda_{1},...,\lambda_{p}\}\).

In contrast to the Bayesian Ridge Regression, each coordinate of \(w_{i}\) has its own standard deviation \(\frac{1}{\lambda_i}\). The prior over all \(\lambda_i\) is chosen to be the same gamma distribution given by the hyperparameters \(\lambda_1\) and \(\lambda_2\).

ARD在文献中也被称为 Sparse Bayesian LearningRelevance Vector Machine [3] [4] .对于ARD和 Bayesian Ridge Regression ,请参阅下面的例子。

示例

引用

1.1.11. Logistic回归#

逻辑回归在 LogisticRegression .尽管它的名字,但它是作为线性分类模型实现的,而不是根据scikit-learn/ML命名法的回归模型。逻辑回归在文献中也被称为logit回归、最大熵分类(MaxEnt)或log线性分类器。在该模型中,描述单个试验可能结果的概率使用 logistic function .

此实现可以使用可选的二元、一vs-Rest或多项逻辑回归 \(\ell_1\) , \(\ell_2\) 或Elastic-Net正规化。

备注

Regularization

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

备注

Logistic Regression as a special case of the Generalized Linear Models (GLM)

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

示例

1.1.11.1. 二进制情况#

为了方便符号,我们假设目标 \(y_i\) 取集中的值 \(\{0, 1\}\) 对于数据点 \(i\) .安装完毕后, predict_proba 方法 LogisticRegression 预测阳性类的概率 \(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)}.\]

As an optimization problem, binary class logistic regression with regularization term \(r(w)\) minimizes the following cost function:

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

我们目前为正规化术语提供了四种选择 \(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\)

For ElasticNet, \(\rho\) (which corresponds to the l1_ratio parameter) controls the strength of \(\ell_1\) regularization vs. \(\ell_2\) regularization. Elastic-Net is equivalent to \(\ell_1\) when \(\rho = 1\) and equivalent to \(\ell_2\) when \(\rho=0\).

请注意,类别权重和样本权重的规模将影响优化问题。例如,将样本权重乘以一个常数 \(b>0\) 相当于乘以(逆)正规化强度 C 通过 \(b\) .

1.1.11.2. 多项案例#

二元情况可以扩展到 \(K\) 导致多项逻辑回归的类,另请参阅 log-linear model .

备注

可以对a进行辅助治疗 \(K\) - 仅使用类别分类模型 \(K-1\) 权重载体,通过利用所有类概率之和必须等于一的事实,让一个类概率完全由其他类概率确定。我们故意选择过度参数化模型 \(K\) 为了易于实现并保留有关类排序的对称感性偏差,请参阅 [16]. 当使用正规化时,这种效应变得特别重要。过度参数化的选择可能会对未受惩罚的模型不利,因为解决方案可能不是唯一的,如所示 [16].

数学细节#

Let \(y_i \in \{1, \ldots, K\}\) be the label (ordinal) encoded target variable for observation \(i\). Instead of a single coefficient vector, we now have a matrix of coefficients \(W\) where each row vector \(W_k\) corresponds to class \(k\). We aim at predicting the class probabilities \(P(y_i=k|X_i)\) via predict_proba as:

\[\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]\) 代表艾弗森括号,其评估结果为 \(0\) 如果 \(P\) 为假,否则其评估结果为 \(1\) .

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

我们目前为正规化术语提供了四种选择 \(r(W)\) 经由 penalty 争论,其中 \(m\) 是功能的数量:

处罚

\(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-spanky”、“sag”和“saga”:

下表总结了每个求解器支持的罚分和多项多类:

Solvers

Penalties

'lbfgs'

'liblinear'

'newton-cg'

'newton-cholesky'

'sag'

'saga'

L2处罚

是的

是的

是的

是的

是的

是的

L1处罚

没有

是的

没有

没有

没有

是的

Elastic-Net(L1 + L2)

没有

没有

没有

没有

没有

是的

无处罚(“无”)

是的

没有

是的

是的

是的

是的

Multiclass support

多项多类

是的

没有

是的

是的

是的

是的

Behaviors

惩罚拦截(坏)

没有

是的

没有

没有

没有

没有

对于大型数据集来说更快

没有

没有

没有

没有

是的

是的

对未缩放的数据集稳健

是的

是的

是的

是的

没有

没有

由于其稳健性,默认使用“lbfgs”解算器。为 n_samples >> n_features ,“newton-spoky”是一个不错的选择,可以达到高精度(微小 tol 价值观)。对于大型数据集,“saga”求解器通常更快(比“lbgs”更快),特别是对于低精度(高 tol ).对于大型数据集,您还可以考虑使用 SGDClassifierloss="log_loss" ,这可能更快,但需要更多的调整。

1.1.11.3.1. 求解者之间的差异#

之间获得的分数可能存在差异 LogisticRegressionsolver=liblinearLinearSVC 和外部liblinear库,当 fit_intercept=False 和适合 coef_ (or)要预测的数据是零。这是因为对于具有 decision_function 零, LogisticRegressionLinearSVC 预测消极类别,而Liblinear预测积极类别。请注意,具有 fit_intercept=False 并拥有许多样本 decision_function 零,可能是一个不适合、坏的模型,建议您设置 fit_intercept=True 并增加 intercept_scaling .

Solvers' details#
  • 求解器“liblinear”使用坐标下降(CD)算法,并依赖于优秀的C++ LIBLINEAR library ,它随scikit-learn一起发货。然而,Liblinear中实现的CD算法无法学习真正的多项(多类)模型;相反,优化问题以“一对休息”的方式分解,因此为所有类训练单独的二进制分类器。这发生在引擎盖下,所以 LogisticRegression 使用该求解器的实例表现为多类分类器。为 \(\ell_1\) 正则化 sklearn.svm.l1_min_c 允许计算C的下限,以获得非“空”(所有特征权重为零)模型。

  • “lbfgs”、“newton-cg”和“sag”解算器仅支持 \(\ell_2\) 规则化或不规则化,并且发现对于一些多维数据收敛得更快。设置 multi_class 通过这些求解器进行“多项”学习真正的多项逻辑回归模型 [5], 这意味着其概率估计应该比默认的“一对休息”设置更好地校准。

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

  • “传奇”解决者 [7] 是“sag”的变体,也支持非光滑 penalty="l1" .因此,这是稀疏多项逻辑回归的首选求解器。它也是唯一支持的解算器 penalty="elasticnet" .

  • “lbfgs”是一种逼近Broyden-Fletcher-Goldfarb-Shanno算法的优化算法 [8], 属于准牛顿方法。因此,它可以处理广泛的不同训练数据,因此是默认的求解器。然而,它的性能在扩展不良的数据集以及具有罕见类别的单一热编码分类特征的数据集上会受到影响。

  • “牛顿-牛顿”解算器是一个精确的牛顿解算器,用于计算黑森矩阵并求解所得线性系统。对于 n_samples >> n_features 并且可以达到高精度(微小值 tol ),但有几个缺点:只有 \(\ell_2\) 支持正规化。此外,由于Hessian矩阵是显式计算的,因此内存使用具有二次依赖性 n_features 以及关于 n_classes .

有关其中一些求解器的比较,请参阅 [9].

引用

备注

Feature selection with sparse logistic regression

逻辑回归分析 \(\ell_1\) 惩罚会产生稀疏模型,因此可以用于执行特征选择,详细说明在 基于L1的特征选择 .

备注

P-value estimation

在不进行惩罚的回归情况下,可以获得系数的p值和置信区间。的 statsmodels package 天生支持这一点。在sklearn中,人们也可以使用自举。

LogisticRegressionCV 通过内置交叉验证支持实施逻辑回归,以找到最佳结果 Cl1_ratio 参数根据 scoring 属性由于热启动,“newton-cg”、“sag”、“saga”和“lbfgs”解算器对于多维密集数据来说速度更快(请参阅 Glossary ).

1.1.12. 广义线性模型#

广义线性模型(GLM)以两种方式扩展线性模型 [10]. 首先,预测值 \(\hat{y}\) 与输入变量的线性组合相关联 \(X\) 通过反向链接函数 \(h\) 作为

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

其次,单位偏差取代平方损失函数 \(d\) 指数族中的分布(或者更准确地说,生殖指数离散模型(EDM) [11]) .

最小化问题变成:

\[\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及其单位偏差:

分布

Target Domain

单位偏差 \(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)如下图所示,

../_images/poisson_gamma_tweedie_distributions.png

随机变量Y的PDF遵循Poisson、Tweedie(功效=1.5)和Gamma分布,具有不同平均值 (\(\mu\) ).观察点质量 \(Y=0\) 对于Poisson分布和Tweedie(功率=1.5)分布,但对于具有严格正目标域的Gamma分布不适用。#

伯努里分布是对伯努里试验进行建模的离散概率分布--这是一个只有两个相互排斥结果的事件。类别分布是类别随机变量伯努里分布的推广。虽然伯努里分布中的随机变量有两种可能的结果,但类别随机变量可以采用K个可能的类别之一,每个类别的概率分别指定。

分布的选择取决于当前的问题:

  • 如果目标值 \(y\) 是计数(非负整值)或相对频率(非负),则可以使用带有日志链接的Poisson分布。

  • 如果目标值为正值且有偏差,则可以尝试带有日志链接的Gamma分布。

  • 如果目标值似乎比伽玛分布的尾部更重,则可以尝试逆高斯分布(甚至是Tweedie系列的更高方差)。

  • 如果目标值 \(y\) 是概率,你可以使用伯努里分布。具有logit链接的伯努里分布可用于二进制分类。具有softmax链接的类别分布可用于多类分类。

用例示例#
  • 农业/天气建模:每年降雨事件数量(Poisson)、每次事件的降雨量(Gamma)、每年总降雨量(Tweedie /Complex Poisson Gamma)。

  • 风险建模/保险单定价:每年索赔事件/保单持有人数量(Poisson)、每次事件的成本(Gamma)、每位保单持有人每年的总成本(Tweedie /复合Poisson Gamma)。

  • 信用违约:贷款无法偿还的可能性(伯努利)。

  • 欺诈检测:现金转移等金融交易是欺诈交易的可能性(伯努利)。

  • 预测性维护:每年生产中断事件数量(Poisson)、中断持续时间(Gamma)、每年总中断时间(Tweedie / Compound Gamma Poisson)。

  • 医疗药物测试:在一系列试验中治愈患者的可能性或患者出现副作用的可能性(伯努里)。

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

引用

1.1.12.1. 使用#

TweedieRegressor 为Tweedie分布实现广义线性模型,允许使用适当的 power 参数.特别是:

  • power = 0 :正态分布。具体估计值,例如 Ridge , ElasticNet 在这种情况下通常更合适。

  • power = 1 :Poisson分布。 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_
np.float64(-0.7638)

示例

  • sphx_glr_auto_examples_linear_model_plot_poisson_regression_non_normal_loss.py

  • sphx_glr_auto_examples_linear_model_plot_tweedie_regression_insurance_claims.py

实际考虑#

所述特征矩阵 X 在试穿前应进行标准化。这确保了惩罚平等地对待特征。

由于线性预测器 \(Xw\) 可以是负的,而Poisson、Gamma和逆高斯分布不支持负值,因此有必要应用保证非负性的反向链接函数。例如用 link='log' ,反向链接函数变成 \(h(Xw)=\exp(Xw)\) .

If you want to model a relative frequency, i.e. counts per exposure (time, volume, ...) you can do so by using a Poisson distribution and passing \(y=\frac{\mathrm{counts}}{\mathrm{exposure}}\) as target values together with \(\mathrm{exposure}\) as sample weights. For a concrete example see e.g. sphx_glr_auto_examples_linear_model_plot_tweedie_regression_insurance_claims.py.

执行交叉验证时 power 参数 TweedieRegressor ,建议明确指定 scoring 功能,因为默认记分器 TweedieRegressor.score 取决于 power 本身

1.1.13. 随机梯度下降-新加坡元#

随机梯度下降是一种简单但非常有效的线性模型匹配方法。当样本数量(和特征数量)非常大时,它特别有用。的 partial_fit 方法允许在线/非核心学习。

的类 SGDClassifierSGDRegressor 提供使用不同(凸)损失函数和不同罚分来匹配线性模型以进行分类和回归的功能。例如,与 loss="log" , SGDClassifier 符合逻辑回归模型,而 loss="hinge" 它适合线性支持向量机(SVM)。

您可以参考专门的 随机梯度下降 文档部分了解更多详细信息。

1.1.14. 感知器#

Perceptron 是另一种适合大规模学习的简单分类算法。默认:

  • 它不需要学习率。

  • 它没有被正规化(惩罚)。

  • 它仅在错误时更新其模型。

最后一个特征意味着,在铰链损失的情况下,Perceptron的训练速度比Singapore略快,并且生成的模型更稀疏。

实际上 Perceptron 是一个包裹 SGDClassifier 类使用感知器损失和恒定的学习率。参阅 mathematical section 详细信息,请参阅Singapore程序。

1.1.15. 被动攻击算法#

被动攻击算法是一个用于大规模学习的算法家族。它们与Perceptron类似,不需要学习率。然而,与感知器相反,它们包括一个正规化参数 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. 不同的场景和有用的概念#

在处理被异常值损坏的数据时需要记住不同的事情:

  • Outliers in X or in y ?

    y方向的离群值

    X方向的离群值

    y_outliers

    X_outliers

  • Fraction of outliers versus amplitude of error

    离群点的数量很重要,但它们在多大程度上是离群值也很重要。

    小异常值

    大异常值

    y_outliers

    large_y_outliers

鲁棒拟合的一个重要概念是崩溃点:数据的一部分,可以是离群的拟合开始错过内在的数据。

请注意,一般来说,在多维设置中稳健地匹配(大 n_features )很难。这里的稳健模型可能无法在这些环境中工作。

1.1.16.2. 随机抽样共识#

RASAC(随机样本共识)从完整数据集中的内点随机子集中匹配模型。

RASAC是一种非确定性算法,仅产生具有一定概率的合理结果,该概率取决于迭代次数(请参阅 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 可媲美 Ordinary Least Squares (OLS) 就渐进效率而言和作为无偏估计量而言。与OLS相比,Theil-Sen是一种非参数方法,这意味着它不对数据的潜在分布做出任何假设。由于Theil-Sen是一种基于中位数的估计器,因此它对损坏的数据(即离群值)更稳健。在单变量设置中,在简单线性回归的情况下,Theil-Sen的崩溃点约为29.3%,这意味着它可以容忍高达29.3%的任意损坏数据。

../_images/sphx_glr_plot_theilsen_001.png

执行 TheilSenRegressor 在scikit-learn中遵循多元线性回归模型的概括 [14] 使用空间中位数,这是中位数到多个维度的概括 [15].

在时间和空间复杂性方面,Theil-Sen根据

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

这使得不可能详尽地应用于具有大量样本和特征的问题。因此,可以通过仅考虑所有可能组合的随机子集来选择子种群的大小来限制时间和空间复杂性。

引用

也看到 Wikipedia page

1.1.16.4. 胡伯回归#

HuberRegressor 不同于 Ridge 因为它将线性损失应用于被定义为离群值的样本 epsilon 参数.如果样本的绝对误差小于阈值,则该样本被分类为内点 epsilon .它不同于 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 与使用不同 SGDRegressor 损失将为 huber 通过以下方式。

  • HuberRegressor 是缩放不变的。一旦 epsilon 已设置,缩放 Xy 向下或向上不同的值将产生与以前相同的对离群值的鲁棒性。相比 SGDRegressor 哪里 epsilonXy 被缩放。

  • HuberRegressor 对于样本数量较少的数据使用应该更有效, SGDRegressor 需要对训练数据进行多次传递才能产生相同的鲁棒性。

请注意,此估计量不同于 R implementation of Robust Regression 因为R实现进行加权最小平方实现,根据剩余值大于某个阈值的多少为每个样本赋予权重。

1.1.17. 分位数回归#

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

如果有兴趣预测区间而不是点预测,分位数回归可能很有用。有时,预测区间是基于预测误差正态分布、均值为零且方差为恒定的假设来计算的。分位数回归即使对于具有非恒定(但可预测)方差或非正态分布的误差也能提供合理的预测区间。

../_images/sphx_glr_plot_quantile_regression_002.png

基于最小化弹球损失,条件分位数也可以通过线性模型以外的模型来估计。例如, GradientBoostingRegressor 如果其参数可以预测条件分位数 loss 设置为 "quantile" 和参数 alpha 设置为应该预测的分位数。请参阅中的示例 梯度Boosting回归的预测区间 .

分位数回归的大多数实现都基于线性规划问题。当前的实施基于 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}\]

L1罚分由参数控制 alpha ,类似于 Lasso .

由于弹球损失在剩余中仅呈线性,因此分位数回归对异常值的鲁棒性比基于平方误差的平均值估计要强得多。介于两者之间的是 HuberRegressor .

引用#

1.1.18. 多元回归:用基函数扩展线性模型#

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

数学细节#

例如,简单的线性回归可以通过构建来扩展 polynomial features 从系数。 在标准线性回归的情况下,对于二维数据,您可能有一个看起来像这样的模型:

\[\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_12 + w_5 x_22\]

(有时令人惊讶)的观察是,这是 still a linear model :要看到这一点,请想象创建一组新功能

\[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\]

我们看到由此产生的 polynomial regression 与我们上面考虑的线性模型相同(即该模型是线性的 \(w\) )并且可以通过相同的技术来解决。 通过考虑用这些基函数构建的更高维度空间内的线性匹配,该模型具有适应更广泛范围的数据的灵活性。

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

../_images/sphx_glr_plot_polynomial_interpolation_001.png

此图形是使用 PolynomialFeatures Transformer,将输入数据矩阵转换为给定次数的新数据矩阵。它可以如下使用::

>>> 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 已从 \([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.])

基于多项特征训练的线性模型能够准确恢复输入的多项系数。

在某些情况下,没有必要包括任何单个特征的更高次,而只需包括所谓的特征 interaction features 最多只能成倍增加 \(d\) 鲜明的特征。这些可以从 PolynomialFeatures 与设定 interaction_only=True .

For example, when dealing with boolean features, \(x_i^n = x_i\) for all \(n\) and is therefore useless; but \(x_i x_j\) represents the conjunction of two booleans. This way, we can solve the XOR problem with a linear classifier:

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