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