使用 scikit-learn提供的PolynomialFeatures 这个类可以进行特征的构造, 例如有两个特征a和b,由这两个特征构造的特征项为[1, a, b, a2, a*b, b2]。
PolynomialFeatures 这个类有 3 个参数:
degree:控制多项式的次数;
interaction_only:默认为 False,如果指定为 True,那么就不会有特征本身和本身结合的项,组合的特征中没有 a2 和 b2;
include_bias:默认为 True 。如果为 True 的话,那么结果中就会有 0 次幂项,即全为 1 这一列。
下面通过几个例子进行说明:
构造一个3*2维的特征值
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(6).reshape(3, 2)
X
输出:
array([[0, 1],
[2, 3],
[4, 5]])
pf = PolynomialFeatures(2)
pf.fit_transform(X)
输出
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
通过powers_属性可以看出上面的输出是怎么由这些特征组合的:
pf.powers_
输出:
array([[0, 0],
[1, 0],
[0, 1],
[2, 0],
[1, 1],
[0, 2]], dtype=int64)
可以看到,pf.powers_输出的第一行是[0, 0],对应的是上面pf.fit_transform(X)的[1, 1, 1]这一列。意思是上面的3*2维特征的第一列的0次幂加上第二列的0次幂,剩下的以此类推。
可以设置include_bias=False,这时就没有 0 次幂项(两个特征组合一起的0次幂没有,如a0*b0,但一个特征的0次幂是存在的,如a0*b1),即全为 1 这一列。
pf = PolynomialFeatures(include_bias=False)
pf.fit_transform(X)
输出
array([[ 0., 1., 0., 0., 1.],
[ 2., 3., 4., 6., 9.],
[ 4., 5., 16., 20., 25.]])
此时pf.powers_输出:
array([[1, 0],
[0, 1],
[2, 0],
[1, 1],
[0, 2]], dtype=int64)
官方文档:
https://scikit-learn.org/stable/modules/preprocessing.html#preprocessing