sklearn onehotencoder multiple labelencoder inverse_transform for example columns categorical python scikit-learn classification text-classification

python - onehotencoder - no se puede usar FeatureUnion en scikit-learn debido a diferentes dimensiones



sklearn categorical encoding (2)

Estoy tratando de usar FeatureUnion para extraer diferentes características de una estructura de datos, pero falla debido a diferentes dimensiones: ValueError: blocks[0,:] has incompatible row dimensions

Implementacion

Mi FeatureUnion está construida de la siguiente manera:

features = FeatureUnion([ (''f1'', Pipeline([ (''get'', GetItemTransformer(''f1'')), (''transform'', vectorizer_f1) ])), (''f2'', Pipeline([ (''get'', GetItemTransformer(''f2'')), (''transform'', vectorizer_f1) ])) ])

GetItemTransformer se utiliza para obtener diferentes partes de datos de la misma estructura. La Idea se describe aquí en scikit-learn issue-tracker.

La Estructura misma se almacena como {''f1'': data_f1, ''f2'': data_f2} donde data_f1 son listas diferentes con diferentes longitudes.

Pregunta

Como el Y-Vector es diferente de los Data-Fields, supongo que se produce el error, pero ¿cómo puedo escalar el vector para que se ajuste en ambos casos?


No sé si esto se aplica a su pregunta, pero nos encontramos con el mismo error en una situación ligeramente diferente y lo solucionamos.

Nuestras entradas de f1 eran listas de 15 valores numéricos y necesitábamos hacer tf-idf en f2 . Esto generó el mismo error sobre las dimensiones de fila incompatibles.

Después de ejecutarlo a través del depurador, descubrimos que las formas de nuestras matrices eran sutilmente diferentes yendo a la llamada hstack() en FeatureUnion : (2569,) y (2659, 706) .

Si lanzamos f1 a una matriz numpy 2D, la forma cambia a (2659, 15) y la llamada hstack funciona.

El elenco fue algo así: f1 = np.array(list(f1)) .


Esto es lo que funcionó para mí:

class ArrayCaster(BaseEstimator, TransformerMixin): def fit(self, x, y=None): return self def transform(self, data): print data.shape print np.transpose(np.matrix(data)).shape return np.transpose(np.matrix(data)) FeatureUnion([(''text'', Pipeline([ (''selector'', ItemSelector(key=''text'')), (''vect'', CountVectorizer(ngram_range=(1,1), binary=True, min_df=3)), (''tfidf'', TfidfTransformer()) ]) ), (''other data'', Pipeline([ (''selector'', ItemSelector(key=''has_foriegn_char'')), (''caster'', ArrayCaster()) ]) )])