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

默认情况下,它是 false,但如果设置为 true,则会生成大多数度数不同的输入特征的乘积的特征。这些特征称为交互特征。

3

include_bias − 布尔值,默认 = true

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

4

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

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

属性

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

序号 属性及描述
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工具简化,这些工具基本上用于将多个估计器链接到一个。

示例

以下 Python 脚本使用 Scikit-learn 的 Pipeline 工具来简化预处理(将拟合到 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.])

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

广告