Следуя принципу открытого доступа, я хочу создать свою LinearRegression путем наследования для sklearn one. Я пытаюсь создать MyRegression с той же функциональностью, что и LinearRegression, но добавляю одну функцию

Не могли бы вы помочь, почему не работает?

    from sklearn.linear_model import LinearRegression

class MyRegression(LinearRegression):
    def __init__(self):
        super(LinearRegression, self).__init__()
        
    def modified_fit(self, x, y):
        return self.fit(x, y)


x = [
    (1,2),
    (2,3)
]
y = [1,2]

regression = MyRegression()
regression.modified_fit(x, y)

У меня есть ошибка, но, насколько я понимаю, все параметры и методы исходной линейной регрессии должны были быть унаследованы от родителя во время процесса init ()

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-29-7d9a5c74a33f> in <module>
     16 
     17 regression = MyRegression()
---> 18 regression.modified_fit(x, y)

<ipython-input-29-7d9a5c74a33f> in modified_fit(self, x, y)
      6 
      7     def modified_fit(self, x, y):
----> 8         return self.fit(x, y)
      9 
     10 

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\base.py in fit(self, X, y, sample_weight)
    478         """
    479 
--> 480         n_jobs_ = self.n_jobs
    481         X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],
    482                          y_numeric=True, multi_output=True)

AttributeError: 'MyRegression' object has no attribute 'n_jobs'
0
Ruslan Talypov 3 Дек 2020 в 16:41

1 ответ

Лучший ответ

Я использовал PyCharm, чтобы переопределить метод, вот результат ... и он работает нормально.

from sklearn.linear_model import LinearRegression
class MyRegression(LinearRegression):
    def __init__(self, *, fit_intercept=True, normalize=False, copy_X=True, n_jobs=None):
        super().__init__(fit_intercept=fit_intercept, normalize=normalize, copy_X=copy_X, n_jobs=n_jobs)

    def modified_fit(self, x, y):
        return self.fit(x, y)


x = [(1, 2),(2, 3)]
y = [1, 2]

regression = MyRegression()
regression.modified_fit(x, y)

Другой вариант, который работает:

from sklearn.linear_model import LinearRegression
class MyRegression(LinearRegression):
    def __init__(self):
        super().__init__()

См. этот ответ о конструкторе переопределения в python

0
Avihay Tsayeg 3 Дек 2020 в 15:45