如何查看sklearn.preprocessing.PolynomialFeatures的效果?
How can I see the effect of sklearn.preprocessing.PolynomialFeatures?
如果我有中等数量的基本特征,并从中生成中等阶的多项式特征,要知道特征数组 preprocess_XX
的哪一列对应于基本功能。
我曾经用旧版本的 sklearn(可能是 0.14?)做类似下面的事情:
import numpy as np
from sympy import Symbol
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(4)
x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')
XX = np.random.rand(1000, 3) # replace with the actual data array
preprocess_symXX = poly.fit_transform([x1, x2, x3])
preprocess_XX = poly.fit_transform(XX)
print preprocess_symXX
这太棒了。它会产生像 [1, x1, x2, x3, x1**2, ... ]
这样的输出,这会让我知道我的 preprocess_XX
列实际上来自什么多项式函数。
但现在当我这样做时,它会抱怨 TypeError: can't convert expression to float
。引发此异常的原因是 sklearn.utils.validation
中的一个名为 check_array()
的函数,它试图将 poly.fit_transform()
的输入转换为 dtype=float
.
对于如何查看 fit_transform()?
的输出中的哪一列对应的基本特征的多项式,您有什么建议吗?现在 sympy
似乎不再适用于 [=22] =]?
使用poly.powers_获得力量。然后你可以把它转换成人类可读的东西,像这样:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.random.rand(1000, 3)
poly = PolynomialFeatures(4)
Y = poly.fit_transform(X)
features = ['X1','X2','X3']
print(poly.powers_)
for entry in poly.powers_:
newFeature = []
for feat, coef in zip(features, entry):
if coef > 0:
newFeature.append(feat+'**'+str(coef))
if not newFeature:
print(1) # If all powers are 0
else:
print(' + '.join(newFeature))
打印(打印后 poly.powers_):
1
X1**1
X2**1
X3**1
X1**2
X1**1 + X2**1
X1**1 + X3**1
X2**2
X2**1 + X3**1
X3**2
X1**3
X1**2 + X2**1
X1**2 + X3**1
X1**1 + X2**2
X1**1 + X2**1 + X3**1
X1**1 + X3**2
X2**3
X2**2 + X3**1
X2**1 + X3**2
X3**3
X1**4
X1**3 + X2**1
X1**3 + X3**1
X1**2 + X2**2
X1**2 + X2**1 + X3**1
X1**2 + X3**2
X1**1 + X2**3
X1**1 + X2**2 + X3**1
X1**1 + X2**1 + X3**2
X1**1 + X3**3
X2**4
X2**3 + X3**1
X2**2 + X3**2
X2**1 + X3**3
X3**4
如果我有中等数量的基本特征,并从中生成中等阶的多项式特征,要知道特征数组 preprocess_XX
的哪一列对应于基本功能。
我曾经用旧版本的 sklearn(可能是 0.14?)做类似下面的事情:
import numpy as np
from sympy import Symbol
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(4)
x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')
XX = np.random.rand(1000, 3) # replace with the actual data array
preprocess_symXX = poly.fit_transform([x1, x2, x3])
preprocess_XX = poly.fit_transform(XX)
print preprocess_symXX
这太棒了。它会产生像 [1, x1, x2, x3, x1**2, ... ]
这样的输出,这会让我知道我的 preprocess_XX
列实际上来自什么多项式函数。
但现在当我这样做时,它会抱怨 TypeError: can't convert expression to float
。引发此异常的原因是 sklearn.utils.validation
中的一个名为 check_array()
的函数,它试图将 poly.fit_transform()
的输入转换为 dtype=float
.
对于如何查看 fit_transform()?
的输出中的哪一列对应的基本特征的多项式,您有什么建议吗?现在 sympy
似乎不再适用于 [=22] =]?
使用poly.powers_获得力量。然后你可以把它转换成人类可读的东西,像这样:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.random.rand(1000, 3)
poly = PolynomialFeatures(4)
Y = poly.fit_transform(X)
features = ['X1','X2','X3']
print(poly.powers_)
for entry in poly.powers_:
newFeature = []
for feat, coef in zip(features, entry):
if coef > 0:
newFeature.append(feat+'**'+str(coef))
if not newFeature:
print(1) # If all powers are 0
else:
print(' + '.join(newFeature))
打印(打印后 poly.powers_):
1
X1**1
X2**1
X3**1
X1**2
X1**1 + X2**1
X1**1 + X3**1
X2**2
X2**1 + X3**1
X3**2
X1**3
X1**2 + X2**1
X1**2 + X3**1
X1**1 + X2**2
X1**1 + X2**1 + X3**1
X1**1 + X3**2
X2**3
X2**2 + X3**1
X2**1 + X3**2
X3**3
X1**4
X1**3 + X2**1
X1**3 + X3**1
X1**2 + X2**2
X1**2 + X2**1 + X3**1
X1**2 + X3**2
X1**1 + X2**3
X1**1 + X2**2 + X3**1
X1**1 + X2**1 + X3**2
X1**1 + X3**3
X2**4
X2**3 + X3**1
X2**2 + X3**2
X2**1 + X3**3
X3**4