2016-11-05 4 views
0

Ich versuche, eine Klasse zu erstellen, die eine Klasse von sklearn erbtPython Vererbung Änderung type-Attribut

class my_lasso(linear_model.Lasso): 

    def __init__(self, alpha=1.0, fit_intercept=True, normalize=False, 
       precompute=False, copy_X=True, max_iter=1000, tol=1e-4, 
       warm_start=False, positive=False, random_state=None, 
       selection='cyclic'): 
     super(my_lasso, self).__init__(
       alpha=alpha, fit_intercept=fit_intercept, 
       normalize=normalize, precompute=precompute, copy_X=copy_X, 
       max_iter=max_iter, tol=tol, warm_start=warm_start, 
       positive=positive, random_state=random_state, 
       selection=selection) 

    def fit(self, x, y): 
     super(my_lasso, self).fit(x, y) 
     self.x = x 
     self.y = y 
     self.residus = self.y - self.predict(self.x) 
     self.r2 = self.score(self.x, self.y) 
     self.error = np.linalg.norm(self.residus) ** 2 
     self.support = np.zeros(x.shape[1]) 
     self.support[self.coef_ != 0] = 1 

Was ich nicht verstehe, das ist, wenn ich meine Klasse testen es das Attribut intercept_ auf ein Array ändert

In [5]: testlasso.intercept_ 
Out[5]: array([ 23.44591837]) 

gleich, wenn ich versuche, von LinearRegression zu erben. Meine coefs sind jetzt doppelt Arrays

In [7]: testls.coef_ 
Out[7]: 
array([[-0.56194996, 0.80247616, -0.0150445 , -5.76399971, 0.23495704, 
    2.77166415]]) 

Irgendwelche Hinweise?

Vielen Dank!

Antwort

0

Erstens, wenn Sie den Konstruktor nicht überschreiben, dann brauchen Sie den Block nicht.

Ihr Code ist in Ordnung. Die Form intercept_ und coef_ ergibt sich aus der number of targets, die 2 ist.

+0

Thx! war y als 2D-Matrize, jetzt funktioniert es gut. was meinst du mit "Wenn Sie den Konstruktor nicht überschreiben, dann brauchen Sie den Block nicht." – nyounes

+0

Vielen Dank. Ich wollte sagen, dass Sie die Methode "__init__" verlieren können, da Sie sie nicht außer Kraft setzen. –