una sumar saber matriz matrices manejo indice imprimir extraer elementos elemento como columna buscar array agregar python scikit-learn feature-selection

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:

  1. 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.
  2. 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í.