Forma correcta de subclase de sklearn con * argumento

Oct 18 2020

Estoy tratando de crear una subclase de sklearn.svm.LinearSVCy noté el *argumento en la firma. No estoy seguro de si esto se *refiere a ** kwargs o * args o algo más. Estoy intentando crear una subclase de la función init de la siguiente manera. En este escenario, he agregado un único argumento adicional, new_string_in_subclassla función init. desde sklearn.svm importar LinearSVC

class LinearSVCSub(LinearSVC):
    def __init__(self, penalty='l2', loss='squared_hinge', *, dual=True, tol=0.0001, C=1.0, multi_class='ovr',
                 fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0, random_state=None,
                 max_iter=1000, sampler: new_string_in_subclass=None):

        super(LinearSVCSub, self).__init__(penalty=penalty, loss=loss, *, dual=dual, tol=tol,
                                            C=C, multi_class=multi_class, fit_intercept=fit_intercept,
                                                  intercept_scaling=intercept_scaling, class_weight=class_weight,
                                                  verbose=verbose, random_state=random_state, max_iter=max_iter)

        self.new_string_in_subclass = new_string_in_subclass

Si quiero mantener la funcionalidad de los LinearSVCotros métodos de la clase, ¿necesito pasar el argumento * a la __init__función de la superclase? Si es así, ¿cómo hago esto? Ahora mismo obtengo un SyntaxErrorcomo se muestra a continuación:

super (LinearSVCSub, self). init (penalización = penalización, pérdida = pérdida, *, dual = dual, tol = tol, ^ SyntaxError: sintaxis no válida

Respuestas

3 Steve Oct 19 2020 at 01:32

A *solo va en la definición de un método, no en las llamadas a ese método. El *indica que todos los parámetros posteriores solo se pueden proporcionar por nombre, no por posición. Simplemente déjelo afuera cuando llame al super, y debería estar bien.

1 BenReiniger Oct 19 2020 at 01:32

El asterisco sirve para separar los parámetros de solo palabras clave: ¿ Asterisco desnudo en los argumentos de la función? Debe omitirlo al crear una instancia de la clase sklearn.