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

- 整数,默认 = 2

它表示多项式特征的次数。

2

Interaction_only - 布尔值,默认 = false

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

3

include_bias - 布尔值,默认 = true

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

4

order - {'C', 'F'} 中的 str,默认 = '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.])

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