用sklearn的多项式功能无法理解

时间:2018-08-18 07:19:29

标签: python machine-learning scikit-learn polynomials

需要sklearn的多项式特征的帮助。它与一个功能配合得很好,但是每当我添加多个功能时,它都会在数组中输出一些值,除了将这些值提高到度的幂上。 例如:对于此数组,

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 个答案:

答案 0 :(得分:6)

如果您有特征[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的简单方法可以创建新功能。有一个很好的参考文献here。当然,使用PolynomialFeatures有弊端(“过度拟合”)(请参见here)。

修改:
使用多项式特征时必须小心。用于计算多项式特征数的公式为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

因此,在这种情况下,您可能需要应用正则化来惩罚某些权重。该算法很有可能开始遭受curse of dimensionality的困扰(here也是一个很好的讨论)。

答案 1 :(得分:6)

PolynomialFeatures生成一个具有给定度数的所有多项式组合的新矩阵。

像[a]的2度将转换为[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

答案 2 :(得分:1)

您具有3维数据,下面的代码生成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]])

答案 3 :(得分:0)

根据scikit的0.23 docs(以及早至0.15),PolynomialFeatures

[生成]一个新的特征矩阵,该矩阵由度小于或等于指定度的特征的所有多项式组合组成。 例如,如果输入样本为二维且格式为[a,b],则2阶多项式特征为[1,a,b,a ^ 2,ab,b ^ 2]

答案 4 :(得分:0)

检查功能的一般方法是使用poly.get_feature_names()。在这种情况下,应该是

In [15]: poly.get_feature_names(['a','b','c'])
Out[15]: ['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项。