torres sucesion sintaxis resueltos recursivo recursividad recursivas recursiva programacion programa las juego hanoi funciones entendiendo ejercicios con python machine-learning scikit-learn feature-selection rfe

python - sucesion - sintaxis de recursividad



Hacer una estimación de hiperparámetro para el estimador en cada pliegue de Eliminación de características recursivas (1)

Entonces, ¿desea buscar en la red C en SVM para cada número de características en el RFE? ¿O para cada iteración de CV en el RFECV? De su última oración, creo que es la primera.

Puedes hacer RFE(GridSearchCV(SVC(), param_grid)) para lograr eso, aunque no estoy seguro de que sea realmente útil.

No creo que el segundo sea posible en este momento (pero pronto). Podría hacer GridSeachCV(RFECV(), param_grid={''estimator__C'': Cs_to_try}) , pero eso anida dos conjuntos de validación cruzada dentro de cada uno.

Actualización: GridSearchCV no tiene coef_ , por lo que el primero falla. Una solución simple:

class GridSeachWithCoef(GridSearchCV): @property def coef_(self): return self.best_estimator_.coef_

Y luego usa eso en su lugar.

Estoy usando sklearn para llevar a cabo la eliminación recursiva de características con validación cruzada, usando el módulo RFECV. RFE implica entrenar repetidamente un estimador en el conjunto completo de características, luego eliminar las características menos informativas, hasta converger en el número óptimo de características.

Con el fin de obtener un rendimiento óptimo por parte del estimador, quiero seleccionar los mejores hiperparámetros para el estimador para cada número de características (editado para mayor claridad). El estimador es una SVM lineal, así que solo estoy buscando el parámetro C.

Inicialmente, mi código era el siguiente. Sin embargo, esto solo hizo una búsqueda en cuadrícula para C al principio, y luego usó la misma C para cada iteración.

from sklearn.cross_validation import StratifiedKFold from sklearn.feature_selection import RFECV from sklearn import svm, grid_search def get_best_feats(data,labels,c_values): parameters = {''C'':c_values} # svm1 passed to clf which is used to grid search the best parameters svm1 = SVC(kernel=''linear'') clf = grid_search.GridSearchCV(svm1, parameters, refit=True) clf.fit(data,labels) #print ''best gamma'',clf.best_params_[''gamma''] # svm2 uses the optimal hyperparameters from svm1 svm2 = svm.SVC(C=clf.best_params_[''C''], kernel=''linear'') #svm2 is then passed to RFECVv as the estimator for recursive feature elimination rfecv = RFECV(estimator=svm2, step=1, cv=StratifiedKFold(labels, 5)) rfecv.fit(data,labels) print "support:",rfecv.support_ return data[:,rfecv.support_]

La documentación para RFECV proporciona el parámetro "estimator_params: Parámetros para el estimador externo. Útil para realizar búsquedas de cuadrícula cuando se pasa un objeto RFE como argumento, por ejemplo, a un objeto sklearn.grid_search.GridSearchCV".

Por lo tanto, quiero intentar pasar mi objeto ''rfecv'' al objeto de búsqueda de la grilla, de la siguiente manera:

def get_best_feats2(data,labels,c_values): parameters = {''C'':c_values svm1 = SVC(kernel=''linear'') rfecv = RFECV(estimator=svm1, step=1, cv=StratifiedKFold(labels, 5), estimator_params=parameters) rfecv.fit(data, labels) print "Kept {} out of {} features".format((data[:,rfecv.support_]).shape[1], data.shape[1]) print "support:",rfecv.support_ return data[:,rfecv.support_] X,y = get_heart_data() c_values = [0.1,1.,10.] get_best_feats2(X,y,c_values)

Pero esto devuelve el error:

max_iter=self.max_iter, random_seed=random_seed) File "libsvm.pyx", line 59, in sklearn.svm.libsvm.fit (sklearn/svm /libsvm.c:1674) TypeError: a float is required

Entonces, mi pregunta es: ¿cómo puedo pasar el objeto rfe a la búsqueda de grillas para hacer la validación cruzada para cada iteración de eliminación de características recursivas?

Gracias