【问题标题】:How to fix Score function for it to work with GridsearchCV, TypeError: score() takes 2 positional arguments but 3 were given如何修复 Score 函数以使其与 GridsearchCV 一起使用,TypeError: score() 需要 2 个位置参数,但给出了 3 个
【发布时间】:2021-05-02 13:27:04
【问题描述】:

我正在尝试制作自己的 BaseEstimator 类以将其用作管道的一部分,但我无法使其工作。这是我得到的:TypeError: score() 接受 2 个位置参数,但给出了 3 个

我已经尝试将 self 参数添加到 score 函数,但它不起作用:我有一个 ValueError 代替。 当我制作一个单独的模型然后单独使用该功能时,一切都很好

class MyRegressor(BaseEstimator):

    def __init__(self, regressor_type: str = 'SGDRegressor'):
        """
        
        """
        self.regressor_type = regressor_type
        

    def fit(self, X, y):
        if self.regressor_type == 'SGDRegressor':
            self.regressor_ = SGDRegressor()
        elif self.regressor_type == 'RandomForestRegressor':
            self.regressor_ = RandomForestRegressor()
        elif self.regressor_type == 'LinearRegression':
            self.regressor_ = LinearRegression()
        elif self.regressor_type == 'CatBoostRegressor':
            self.regressor_ = CatBoostRegressor()
        elif self.regressor_type == 'XGBRegressor':
            self.regressor_ = XGBRegressor()
        else:
            raise ValueError('Unknown regressor type.')

        self.regressor_.fit(X, y)
        return self

    def predict(self, X):
        y_pred = self.regressor_.predict(X)
        return y_pred
      
    def score(y, y_pred):
        smape = sum(abs(y - y_pred) / (abs(y) + abs(y_pred)) / 2) * 100 / len(y)    
        return self.estimator.smape(y, y_pred) 

pipe = Pipeline([('scaler', StandardScaler()), ('MyRegressor', MyRegressor())])
pipe.fit(X_train, y_train_final)

params = {
    
    'MyRegressor__regressor_type': ['SGDRegressor', 'RandomForestRegressor', 'LinearRegression', 'CatBoostRegressor', 'XGBRegressor']
}


search = GridSearchCV(pipe , params, n_jobs=-1, cv=5)
search.fit(X_train, y_train_final)

print('Best model:\n', search.best_params_)

请帮我解决这个问题。提前谢谢!

【问题讨论】:

    标签: python scikit-learn typeerror


    【解决方案1】:

    这种评分函数的预期签名是(self, X, y)。然后,您应该使用self.predict(X) 在评分函数中生成您的y_pred,然后按照您的要求计算剩余的分数。

    【讨论】:

      【解决方案2】:

      你在 score 函数的定义中遗漏了 self 输入参数。

      你应该写def score(self, y, y_pred):

      【讨论】:

        猜你喜欢
        • 2019-12-12
        • 2019-12-17
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 2022-01-19
        相关资源
        最近更新 更多