Saltar combinaciones de parámetros prohibidos al usar GridSearchCV

Quiero buscar con avidez todo el espacio de parámetros de mi clasificador de vectores de soporte utilizando GridSearchCV . Sin embargo, algunas combinaciones de parámetros están prohibidas por LinearSVC y lanzan una excepción . En particular, hay combinaciones mutuamente excluyentes de los parámetros dual , penalty y loss :

Por ejemplo, este código:

 from sklearn import svm, datasets from sklearn.model_selection import GridSearchCV iris = datasets.load_iris() parameters = {'dual':[True, False], 'penalty' : ['l1', 'l2'], \ 'loss': ['hinge', 'squared_hinge']} svc = svm.LinearSVC() clf = GridSearchCV(svc, parameters) clf.fit(iris.data, iris.target) 

Devuelve ValueError: Unsupported set of arguments: The combination of penalty='l2' and loss='hinge' are not supported when dual=False, Parameters: penalty='l2', loss='hinge', dual=False

Mi pregunta es: ¿es posible hacer que GridSearchCV omita combinaciones de parámetros que el modelo prohíbe? Si no es así, ¿hay una forma fácil de construir un espacio de parámetros que no viole las reglas?

    error_score=0.0 este problema al pasar error_score=0.0 a GridSearchCV :

    error_score: ‘boost’ (predeterminado) o numérico

    Valor para asignar a la puntuación si se produce un error en el ajuste del estimador. Si se establece en ‘boost’, se genera el error. Si se da un valor numérico, FitFailedWarning se eleva. Este parámetro no afecta el paso de reacondicionamiento, que siempre generará el error.

    Si desea evitar por completo la exploración de combinaciones específicas (sin esperar a que se produzcan errores), debe construir la cuadrícula usted mismo. GridSearchCV puede tomar una lista de dictados, donde se exploran las cuadrículas que abarca cada diccionario de la lista.

    En este caso, la lógica condicional no era tan mala, pero sería realmente tediosa para algo más complicado:

     from sklearn import svm, datasets from sklearn.model_selection import GridSearchCV from itertools import product iris = datasets.load_iris() duals = [True, False] penaltys = ['l1', 'l2'] losses = ['hinge', 'squared_hinge'] all_params = list(product(duals, penaltys, losses)) filtered_params = [{'dual': [dual], 'penalty' : [penalty], 'loss': [loss]} for dual, penalty, loss in all_params if not (penalty == 'l1' and loss == 'hinge') and not ((penalty == 'l1' and loss == 'squared_hinge' and dual is True)) and not ((penalty == 'l2' and loss == 'hinge' and dual is False))] svc = svm.LinearSVC() clf = GridSearchCV(svc, filtered_params) clf.fit(iris.data, iris.target)