python - 在 python 中使用 sklearn 自己的估计器进行网格搜索 CV

标签 python search grid knn imputation

我正在尝试构建自己的估计器(回归器)并将其用于插补(KnnImputation)。我在使用网格搜索“GridSearchCV”时遇到问题。 任何想法是什么问题?

我的代码:

class KnnImputation(BaseEstimator, RegressorMixin):

    def __init__(self, k=5, distance='euclidean'):
        self.k = k
        self.distance = distance

    def get_params(self, deep=False):
        return {'k': self.k, 'distance': self.distance}

    def set_params(self, **parameters):
        self.k = parameters['k']
        self.distance = parameters['distance']

    def fit(self, X, y):

        self.xTrain = X.values
        self.yTrain = y.values

        return self

    def predict(self, X):
        ........

        return yPred

# scorer:
scorer = make_scorer(mean_squared_error)

kf = KFold(n_splits=10, shuffle=False, random_state=23)
NN = KnnImputation()
gridSearchNN = GridSearchCV(NN, param_grid=params, scoring=scorer, n_jobs=1,
                            cv=kf.split(xTrain, yTrain), verbose=1)
gridSearchNN.fit(X=xTrain, y=yTrain)

我的错误:

....
  File "C:\Users\...........\dataImputation.py", line 85, in knnImputationMethod
    gridSearchNN.fit(X=xTrain, y=yTrain)
  File "C:\Users\.....\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 740, in fit
    self.best_estimator_.fit(X, y, **fit_params)
AttributeError: 'NoneType' object has no attribute 'fit'

最佳答案

sklearn.model_selection._search 中的 sklearn 源代码中,我们在 fit 方法中包含以下代码:

if self.refit:
    self.best_estimator_ = clone(base_estimator).set_params(
        **self.best_params_)
    refit_start_time = time.time()
    if y is not None:
        self.best_estimator_.fit(X, y, **fit_params)

这里最重要的是一行:

self.best_estimator_ = clone(base_estimator).set_params(**self.best_params_)

克隆由 base_estimator 对象组成,它就是您的 KNNImputation 类。然后在该克隆的估计器上调用实例方法 set_params()。然后变量 self.best_estimator 指向 set_params() 的返回值。

在您提供的代码中,set_params() 方法没有 return 语句,因此它返回 None。因此,对 self.best_estimator_.fit() 的调用相当于 None.fit(),这显然不起作用。您需要通过在 set_params() 函数中返回 self 来启用方法链。

相关代码为:

def set_params(self, **parameters):
    self.k = parameters['k']
    self.distance = parameters['distance']
    return self

TL;博士:

您需要通过返回 self 来启用 set_params 中的方法链。

关于python - 在 python 中使用 sklearn 自己的估计器进行网格搜索 CV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458400/

相关文章:

python - 计算 Django 模板中两个日期之间的天数

javascript - Django 中的通用进度条

java - 在具有重复Java的二维数组中进行二进制搜索

extjs - 如何计算商店中一个字段的总数

jquery - 如何使用 jquery 在图像上绘制网格

python - 比较 Python 中的 2 个日期没有按预期工作

python - 用\and 分隔的十六进制数据是什么类型的?

search - VIM:如何搜索匹配没有特定字符的行?

search - Elasticsearch完成建议者字段包含逗号分隔的值

wpf - 在网格 WPF 中对齐标签