2016-01-19 2 views
4

Если у меня есть умеренное количество базовых функций и я получаю от них умеренный порядок полиномиальных функций, может возникнуть путаница, чтобы знать, какой столбец массива признаков preprocess_XX соответствует преобразованию основных функций.Как я могу увидеть эффект sklearn.preprocessing.PolynomialFeatures?

Я использовал, чтобы сделать что-то вроде следующего, с более старой версией 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 больше не похоже на работу с fit_transform?

ответ

3

Используйте 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