无法理解sklearn中的PolynomialFeatures。

22

需要在sklearn的Polynomial Features中寻求帮助。它在一个特征方面运作得相当不错,但是每当我添加多个特征时,它还会输出一些除了值的幂次方之外的值。

例如:对于这个数组,

X=np.array([[230.1,37.8,69.2]])

当我尝试时

X_poly=poly.fit_transform(X)

它输出

[[ 1.00000000e+00 2.30100000e+02 3.78000000e+01 6.92000000e+01
5.29460100e+04 8.69778000e+03 1.59229200e+04 1.42884000e+03
2.61576000e+03 4.78864000e+03]]

这里,8.69778000e+03,1.59229200e+04,2.61576000e+03 是什么?

5个回答

35

如果您拥有特征[a, b, c],则默认的多项式特征(在sklearn中,阶数为2)应为[1, a, b, c, a^2, b^2, c^2, ab, bc, ca]

2.61576000e+0337.8x62.2=2615.762615.76 = 2.61576000 x 10^3

通过使用PolynomialFeatures,可以简便地创建新特征。这里有一个好的参考链接。当然,使用PolynomialFeatures也存在缺点(“过度拟合”),请参见此处

编辑:
使用多项式特征时需要注意。计算多项式特征数量的公式为N(n,d)=C(n+d,d),其中n是特征数,d是多项式的次数,C是组合数。在我们的例子中,数字为C(3+2,2)=5!/(5-2)!2!=10,但当特征数或次数较高时,多项式特征将变得过多。例如:

N(100,2)=5151
N(100,5)=96560646

因此,在这种情况下,您可能需要应用正则化来惩罚一些权重。很可能算法会开始受到维度诅咒的影响(这里也有一个非常好的讨论)。


2
为什么它会给出ab,bc,ca? - TechieBoy101
@TechieBoy101:它是多项式特征,而不是单项式特征。没有什么限制它一次只能处理一个变量。 - user2357112
1
@TechieBoy101,sklearn中默认的PolynomialFeatures包括所有的多项式组合。你可以添加interaction_only=True来排除像a^2, b^2, c^2这样的幂次。当然,如果你的模型表现更好,你也可以排除交互作用 - PolynomialFeatures是一种简单的方法来以某种人为的方式派生新特征。 - dim
3
多项式特征的公式是不正确的,尽管 bc 的位置是正确的。查看 poly.get_feature_names(['a','b','c']),将会得到 ['1', 'a', 'b', 'c', 'a^2', 'a b', 'a c', 'b^2', 'b c', 'c^2'] - Niko Pasanen
当我们通过将数据提升到一定幂次方来添加额外特征时,是否会引入多重共线性? - Medan
在PolynomialFeatures中,fit()和transform()方法具体是做什么的?尽管我已经阅读了文档,但我仍然不理解。我试图用StandardScaler中fit()和transform()方法的类比来解释,但似乎并没有意义;因为在两种情况下,fit()和transform()方法所做的事情是不同的。 - JEAN LEONARDO

16

PolynomialFeatures 会生成一个新矩阵,该矩阵包含给定次数的所有特征的多项式组合。

例如,对于二次项(degree 2),[a] 会被转换为 [1,a,a^2]。

您可以将输入数据的转换过程可视化为由 PolynomialFeatures 生成的矩阵。

from sklearn.preprocessing import PolynomialFeatures
a = np.array([1,2,3,4,5])
a = a[:,np.newaxis]
poly = PolynomialFeatures(degree=2)
a_poly = poly.fit_transform(a)
print(a_poly)

输出:

 [[ 1.  1.  1.]
 [ 1.  2.  4.]
 [ 1.  3.  9.]
 [ 1.  4. 16.]
 [ 1.  5. 25.]]

你可以看到以[1,a,a^2]形式生成的矩阵。

为了观察散点图上的多项式特征,让我们使用数字1-100。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures

#Making 1-100 numbers
a = np.arange(1,100,1)
a = a[:,np.newaxis]

#Scaling data with 0 mean and 1 standard Deviation, so it can be observed easily
scaler = StandardScaler()
a = scaler.fit_transform(a)

#Applying PolynomialFeatures
poly = PolynomialFeatures(degree=2)
a_poly = poly.fit_transform(a)

#Flattening Polynomial feature matrix (Creating 1D array), so it can be plotted. 
a_poly = a_poly.flatten()
#Creating array of size a_poly with number series. (For plotting)
xarr = np.arange(1,a_poly.size+1,1)

#Plotting
plt.scatter(xarr,a_poly)
plt.title("Degree 2 Polynomial")
plt.show()

输出:

2 Degree

将度数更改为3,我们得到:

3 Degree


6

检查特征的一般方法是使用poly.get_feature_names()。在这种情况下,它将是

>>> poly.get_feature_names(['a','b','c'])
    ['1', 'a', 'b', 'c', 'a^2', 'a b', 'a c', 'b^2', 'b c', 'c^2']

8.69778000e+03,1.59229200e+04,2.61576000e+03则对应于a*ba*cb*c 项,分别对应。


2

您有三维数据,下面的代码可以生成所有二次多项式特征:

X=np.array([[230.1,37.8,69.2]])
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures()
X_poly=poly.fit_transform(X)
X_poly
#array([[  1.00000000e+00,   2.30100000e+02,   3.78000000e+01,
#      6.92000000e+01,   5.29460100e+04,   8.69778000e+03,
#      1.59229200e+04,   1.42884000e+03,   2.61576000e+03,
#      4.78864000e+03]])

这也可以使用以下代码生成:
a, b, c = 230.1, 37.8, 69.2 # 3-dimensional data
np.array([[1,a,b,c,a**2,a*b,c*a,b**2,b*c,c**2]]) # all possible degree-2 polynomial features
# array([[  1.00000000e+00,   2.30100000e+02,   3.78000000e+01,
      6.92000000e+01,   5.29460100e+04,   8.69778000e+03,
      1.59229200e+04,   1.42884000e+03,   2.61576000e+03,
      4.78864000e+03]])

如果我们有一个形状为(11, 1)的数组,那么所有可能的特征将是什么? - Anoushiravan R

1
根据scikit的0.23文档(以及0.15版本),PolynomialFeatures将生成一个新的特征矩阵,其中包含所有度数小于或等于指定度数的特征的多项式组合。例如,如果输入样本是二维的且形式为[a,b],则度数为2的多项式特征为[1,a,b,a^2,ab,b^2]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接