sumar - saber el indice de un array python
TypeError: solo las matrices de enteros con un elemento se pueden convertir en un índice (2)
Finalmente tengo que resolver el problema. Dos cosas tenían que hacerse:
- train_argcands_target es una lista y tiene que ser una matriz numpy. Me sorprende que haya funcionado bien antes, cuando solo usé el estimador directamente.
- Por alguna razón (todavía no sé por qué), tampoco funciona si utilizo la matriz dispersa creada por el DictVectorizer. Tuve que, "manualmente", transformar cada diccionario de características en una matriz de características con solo enteros que representan cada valor de característica. El proceso de transformación es similar al que presento en el código para los valores objetivo.
Gracias a todos los que intentaron ayudar!
Recibo el siguiente error al realizar la selección recursiva de funciones con validación cruzada:
Traceback (most recent call last):
File "/Users/.../srl/main.py", line 32, in <module>
argident_sys.train_classifier()
File "/Users/.../srl/identification.py", line 194, in train_classifier
feat_selector.fit(train_argcands_feats,train_argcands_target)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/feature_selection/rfe.py", line 298, in fit
ranking_ = rfe.fit(X[train], y[train]).ranking_
TypeError: only integer arrays with one element can be converted to an index
El código que genera el error es el siguiente:
def train_classifier(self):
# Get the argument candidates
argcands = self.get_argcands(self.reader)
# Extract the necessary features from the argument candidates
train_argcands_feats = []
train_argcands_target = []
for argcand in argcands:
train_argcands_feats.append(self.extract_features(argcand))
if argcand["info"]["label"] == "NULL":
train_argcands_target.append("NULL")
else:
train_argcands_target.append("ARG")
# Transform the features to the format required by the classifier
self.feat_vectorizer = DictVectorizer()
train_argcands_feats = self.feat_vectorizer.fit_transform(train_argcands_feats)
# Transform the target labels to the format required by the classifier
self.target_names = list(set(train_argcands_target))
train_argcands_target = [self.target_names.index(target) for target in train_argcands_target]
## Train the appropriate supervised model
# Recursive Feature Elimination
self.classifier = LogisticRegression()
feat_selector = RFECV(estimator=self.classifier, step=1, cv=StratifiedKFold(train_argcands_target, 10))
feat_selector.fit(train_argcands_feats,train_argcands_target)
print feat_selector.n_features_
print feat_selector.support_
print feat_selector.ranking_
print feat_selector.cv_scores_
return
Sé que también debería realizar GridSearch para los parámetros del clasificador LogisticRegression, pero no creo que esa sea la fuente del error (¿o sí?).
Debo mencionar que estoy probando con alrededor de 50 funciones, y casi todas son categóricas (por eso uso el DictVectorizer para transformarlas adecuadamente).
Cualquier ayuda o guía que puedas darme es más que bienvenida. ¡Gracias!
EDITAR
Aquí hay algunos ejemplos de datos de entrenamiento:
train_argcands_feats = [{''head_lemma'': u''Bras/xedlia'', ''head'': u''Bras/xedlia'', ''head_postag'': u''PROP''}, {''head_lemma'': u''Pesquisa_Datafolha'', ''head'': u''Pesquisa_Datafolha'', ''head_postag'': u''N''}, {''head_lemma'': u''dado'', ''head'': u''dado'', ''head_postag'': u''N''}, {''head_lemma'': u''postura'', ''head'': u''postura'', ''head_postag'': u''N''}, {''head_lemma'': u''maioria'', ''head'': u''maioria'', ''head_postag'': u''N''}, {''head_lemma'': u''querer'', ''head'': u''quer'', ''head_postag'': u''V-FIN''}, {''head_lemma'': u''PT'', ''head'': u''PT'', ''head_postag'': u''PROP''}, {''head_lemma'': u''participar'', ''head'': u''participando'', ''head_postag'': u''V-GER''}, {''head_lemma'': u''surpreendente'', ''head'': u''supreendente'', ''head_postag'': u''ADJ''}, {''head_lemma'': u''Bras/xedlia'', ''head'': u''Bras/xedlia'', ''head_postag'': u''PROP''}, {''head_lemma'': u''Pesquisa_Datafolha'', ''head'': u''Pesquisa_Datafolha'', ''head_postag'': u''N''}, {''head_lemma'': u''revelar'', ''head'': u''revela'', ''head_postag'': u''V-FIN''}, {''head_lemma'': u''recusar'', ''head'': u''recusando'', ''head_postag'': u''V-GER''}, {''head_lemma'': u''maioria'', ''head'': u''maioria'', ''head_postag'': u''N''}, {''head_lemma'': u''PT'', ''head'': u''PT'', ''head_postag'': u''PROP''}, {''head_lemma'': u''participar'', ''head'': u''participando'', ''head_postag'': u''V-GER''}, {''head_lemma'': u''surpreendente'', ''head'': u''supreendente'', ''head_postag'': u''ADJ''}, {''head_lemma'': u''Bras/xedlia'', ''head'': u''Bras/xedlia'', ''head_postag'': u''PROP''}, {''head_lemma'': u''Pesquisa_Datafolha'', ''head'': u''Pesquisa_Datafolha'', ''head_postag'': u''N''}, {''head_lemma'': u''revelar'', ''head'': u''revela'', ''head_postag'': u''V-FIN''}, {''head_lemma'': u''governo'', ''head'': u''Governo'', ''head_postag'': u''N''}, {''head_lemma'': u''de'', ''head'': u''de'', ''head_postag'': u''PRP''}, {''head_lemma'': u''governo'', ''head'': u''Governo'', ''head_postag'': u''N''}, {''head_lemma'': u''recusar'', ''head'': u''recusando'', ''head_postag'': u''V-GER''}, {''head_lemma'': u''maioria'', ''head'': u''maioria'', ''head_postag'': u''N''}, {''head_lemma'': u''querer'', ''head'': u''quer'', ''head_postag'': u''V-FIN''}, {''head_lemma'': u''PT'', ''head'': u''PT'', ''head_postag'': u''PROP''}, {''head_lemma'': u''surpreendente'', ''head'': u''supreendente'', ''head_postag'': u''ADJ''}, {''head_lemma'': u''Bras/xedlia'', ''head'': u''Bras/xedlia'', ''head_postag'': u''PROP''}, {''head_lemma'': u''Pesquisa_Datafolha'', ''head'': u''Pesquisa_Datafolha'', ''head_postag'': u''N''}, {''head_lemma'': u''revelar'', ''head'': u''revela'', ''head_postag'': u''V-FIN''}, {''head_lemma'': u''muito'', ''head'': u''Muitas'', ''head_postag'': u''PRON-DET''}, {''head_lemma'': u''prioridade'', ''head'': u''prioridades'', ''head_postag'': u''N''}, {''head_lemma'': u''com'', ''head'': u''com'', ''head_postag'': u''PRP''}, {''head_lemma'': u''prioridade'', ''head'': u''prioridades'', ''head_postag'': u''N''}]
train_argcands_target = [''NULL'', ''ARG'', ''ARG'', ''ARG'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''ARG'', ''ARG'', ''ARG'', ''ARG'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''ARG'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''ARG'', ''NULL'', ''NULL'', ''NULL'', ''NULL'', ''ARG'', ''ARG'', ''NULL'', ''NULL'']
Si alguien sigue interesado,
Utilicé el CountVectorizer
en algo muy similar y me dio el mismo error. Me di cuenta de que el vectorizador me da una matriz dispersa de COO que es básicamente una lista de coordenadas. No se puede acceder a los elementos de las matrices COO a través de índices de fila. Es mejor convertirlo en una matriz de CSR (fila dispersa comprimida) que se indexa por filas. La conversión se puede hacer fácilmente coo_matrix.tocsr()
. No se requiere ningún otro cambio, esto funcionó para mí.