dsl*_*ack 4 python preprocessor sympy scikit-learn
如果我有中等数量的基本特征并从中生成中等阶数的多项式特征,那么弄不清楚特征数组的哪一列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
Run Code Online (Sandbox Code Playgroud)
太棒了 它会产生类似的输出[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似乎不再使用fit_transform?
使用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))
Run Code Online (Sandbox Code Playgroud)
哪个打印(在打印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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |