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())
])
)])