Установка параметра класса через аргумент другого - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу создать остаточный класс, который использует два регрессора, здесь Ridge и RandomForestRegressor, и я хотел бы иметь возможность передавать этот класс в GridSearchCV, но настройка параметров этих двух регрессоров была проблемой для меня. Я попытался установить эти параметры как параметры по умолчанию для моего остаточного класса, чтобы иметь возможность использовать их, но это не работает.

Я пытался использовать self.parameter и т. Д. Кроме того, было бы хорошо, если бы я установил параметры внутри класса (непосредственно давая им числа)

class Residual(base.BaseEstimator, base.RegressorMixin):

    def __init__(self, alpha_ = 5, max_depth_ = 10, n_estimators_ = 10):
        self.base = Ridge(alpha = alpha_)
        self.residual = RandomForestRegressor(max_depth = max_depth_, n_estimators = n_estimators_)

    def fit(self, X, y=None):
        self.base = self.base.fit(X, y)
        self.residual = self.residual.fit(X, np.array(y) - np.array(self.base.predict(X)))
        return self

    def predict(self, X):
        return np.array(self.base.predict(X))+np.array(self.residual.predict(X))


pipline = Pipeline([('CST', ColumnSelectTransformer(['attributes'])),
                          ('DF', DictFlatter()),
                         ('DV', DictVectorizer(sparse = False)),
                         ('res', Residual())])
param_grid = [{'res__alpha_': [.001, .005, .01, .05, .1],{'res__n_estimators_': [200],'res__max_depth_': [10]}]
GSCV = GridSearchCV(pipline, param_grid, cv = 10)
GSCV.fit(data, star_ratings)

Я получаю сообщение об ошибке:

ValueError: array must not contain infs or NaNs

Если я сделаю следующее, все будет хорошо:

class Residual(base.BaseEstimator, base.TransformerMixin, base.RegressorMixin):

    def __init__(self, alpha_ = .01, max_depth_ = 10, n_estimators_ = 150):
        self.base = Ridge(.01)
        self.residual = RandomForestRegressor(max_depth = 10, n_estimators = 150)

    def fit(self, X, y=None):
        self.base = self.base.fit(X, y)
        self.residual = self.residual.fit(X, np.array(y) - np.array(self.base.predict(X)))
        return self

    def predict(self, X):
        return np.array(self.base.predict(X))+np.array(self.residual.predict(X))
...