Scikit Learn - 扩展线性建模

本章重点介绍 Sklearn 中的多项式特征和流水线工具。

多项式特征简介

使用数据的非线性函数训练的线性模型通常能够保持线性方法的快速性能。它还允许它们拟合更广泛的数据。这就是机器学习中使用线性模型(在非线性函数上训练)的原因。

一个例子是,可以通过从系数构建多项式特征来扩展简单的线性回归。

从数学上讲,假设我们有一个标准线性回归模型,那么对于二维数据,它看起来像这样 −

$$Y=W_{0}+W_{1}X_{1}+W_{2}X_{2}$$

现在,我们可以将特征组合成二阶多项式,我们的模型将如下所示 −

$$Y=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$$

以上仍然是线性模型。在这里,我们看到,得到的多项式回归属于同一类线性模型,可以用类似的方法求解。

为此,scikit-learn 提供了一个名为 PolynomialFeatures 的模块。该模块将输入数据矩阵转换为给定次数的新数据矩阵。

参数

下表列出了 PolynomialFeatures 模块使用的参数。

Sr.No 参数及说明
1

degree − 整数,默认值 = 2

表示多项式特征的次数。

2

interaction_only − 布尔值,默认值 = false

默认情况下,该值为 false,但如果设置为 true,则会生成由大多数次数不同的输入特征乘积而成的特征。此类特征称为交互特征。

3

include_bias −布尔值,默认值 = true

它包含一个偏置列,即所有多项式幂都为零的特征。

4

order − str in {'C', 'F'},默认值 = 'C'

此参数表示稠密情况下输出数组的阶数。 "F"阶意味着计算速度更快,但另一方面,它可能会减慢后续估计器的速度。

属性

下表包含 PolynomialFeatures 模块使用的属性

Sr.No 属性和说明
1

powers_ −数组,形状为 (n_output_features, n_input_features)

它表示 powers_[i,j] 是第 i 个输出中第 j 个输入的指数。

2

n_input_features _ − int

顾名思义,它给出了输入特征的总数。

3

n_output_features _ − int

顾名思义,它给出了多项式输出特征的总数。

实现示例

以下 Python 脚本使用 PolynomialFeatures 转换器将 8 个元素的数组转换为形状为 (4,2) 的负数;

from sklearn.preprocessing import PolynomialFeatures
import numpy as np
Y = np.arange(8).reshape(4, 2)
poly = PolynomialFeatures(degree=2)
poly.fit_transform(Y)

输出

array(
   [
      [ 1., 0., 1., 0., 0., 1.],
      [ 1., 2., 3., 4., 6., 9.],
      [ 1., 4., 5., 16., 20., 25.],
      [ 1., 6., 7., 36., 42., 49.]
   ]
)

使用 Pipeline 工具简化

上述预处理,即将输入数据矩阵转换为给定阶数的新数据矩阵,可以使用 Pipeline 工具简化,这些工具主要用于将多个估计器链接成一个。

示例

以下 Python 脚本使用 Scikit-learn 的 Pipeline 工具简化预处理(将拟合三阶多项式数据)。

#首先,导入必要的软件包。
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
import numpy as np

#接下来,创建 Pipeline 工具对象
Stream_model = Pipeline([('poly', PolynomialFeatures(degree=3)), ('linear', LinearRegression(fit_intercept=False))])

#提供数组大小和多项式数据的阶数,以便拟合模型。
x = np.arange(5)
y = 3 - 2 * x + x ** 2 - x ** 3
Stream_model = model.fit(x[:, np.newaxis], y)

#计算输入多项式系数。
Stream_model.named_steps['linear'].coef_

输出

array([ 3., -2., 1., -1.])

以上输出表明,基于多项式特征训练的线性模型能够恢复精确的输入多项式系数。