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 模块使用的参数:

序号参数及说明
1

degree:整数,默认=2

它表示多项式特征的程度。

2

interaction_only: 布尔值,默认 = false

默认情况下,它是假的,但如果设置为真,则生成的特征是最不同程度的输入特征的产物。此类特征称为交互特征。

3

include_bias: 布尔值,默认 = true

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

4

order: str in {‘C’, ‘F’},默认 = ‘C’

该参数表示密集情况下输出数组的顺序。 “F”阶意味着计算速度更快,但另一方面,它可能会减慢后续的估计量。

属性

下表是 PolynomialFeatures 模块使用的属性:

序号属性和描述
1

powers_:array,形状(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工具,基本上用于将多个估算器链接到一个。

下面的 python 脚本使用 Scikit-learn 的流水线工具来简化预处理(将适合 3 阶多项式数据)。

#First, import the necessary packages.
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
import numpy as np

#Next, create an object of Pipeline tool
Stream_model = Pipeline([('poly', PolynomialFeatures(degree=3)), ('linear', LinearRegression(fit_intercept=False))])

#Provide the size of array and order of polynomial data to fit the model.
x = np.arange(5)
y = 3 - 2 * x + x ** 2 - x ** 3
Stream_model = model.fit(x[:, np.newaxis], y)

#Calculate the input polynomial coefficients.
Stream_model.named_steps['linear'].coef_
array([ 3., -2., 1., -1.])

上面的输出表明,在多项式特征上训练的线性模型能够恢复准确的输入多项式系数。