【问题标题】:Parameters are not going to custom estimator in scikit-learn GridSearchCV参数不会用于 scikit-learn GridSearchCV 中的自定义估计器
【发布时间】:2019-08-18 22:32:15
【问题描述】:

我正在尝试将参数传递给 scikit learn 中的自定义估算器,但未能成功。我希望在网格搜索期间更改参数lr。 问题是lr 参数没有改变...

代码示例从here复制更新

(原始代码对我不起作用)

任何带有自定义估算器的 GridSearchCV 的完整工作示例以及更改参数都将不胜感激。

我在ubuntu 18.10 使用scikit-learn 0.20.2

from sklearn.model_selection import GridSearchCV
from sklearn.base import BaseEstimator, ClassifierMixin
import numpy as np

class MyClassifier(BaseEstimator, ClassifierMixin):

     def __init__(self, lr=0.1):
         # Some code
         print('lr:', lr)
         return self

     def fit(self, X, y):
         # Some code
         return self

     def predict(self, X):
         # Some code
         return X % 3

params = {
    'lr': [0.1, 0.5, 0.7]
}
gs = GridSearchCV(MyClassifier(), param_grid=params, cv=4)

x = np.arange(30)
y = np.concatenate((np.zeros(10), np.ones(10), np.ones(10) * 2))
gs.fit(x, y)

特韦辛,马库斯

【问题讨论】:

    标签: python scikit-learn parameter-passing gridsearchcv


    【解决方案1】:

    您无法看到 lr 值的变化,因为您在构造函数中打印。

    如果我们在.fit()函数内部打印,我们可以看到lr值的变化。 这是因为way 创建了不同的估算器副本。请参阅here 以了解创建多个副本的过程。

    from sklearn.model_selection import GridSearchCV
    from sklearn.base import BaseEstimator, ClassifierMixin
    import numpy as np
    
    class MyClassifier(BaseEstimator, ClassifierMixin):
    
        def __init__(self, lr=0):
             # Some code
            print('lr:', lr)
            self.lr = lr
    
        def fit(self, X, y):
             # Some code
            print('lr:', self.lr)
            return self
    
        def predict(self, X):
             # Some code
             return X % 3
    
    params = {
        'lr': [0.1, 0.5, 0.7]
    }
    gs = GridSearchCV(MyClassifier(), param_grid=params, cv=4)
    
    x = np.arange(30)
    y = np.concatenate((np.zeros(10), np.ones(10), np.ones(10) * 2))
    gs.fit(x, y)
    gs.predict(x)
    

    输出:

    lr: 0
    lr: 0
    lr: 0
    lr: 0.1
    lr: 0
    lr: 0.1
    lr: 0
    lr: 0.1
    lr: 0
    lr: 0.1
    lr: 0
    lr: 0.5
    lr: 0
    lr: 0.5
    lr: 0
    lr: 0.5
    lr: 0
    lr: 0.5
    lr: 0
    lr: 0.7
    lr: 0
    lr: 0.7
    lr: 0
    lr: 0.7
    lr: 0
    lr: 0.7
    lr: 0
    lr: 0.1
    

    【讨论】:

    • 所以如果我想根据构造函数中的某个参数值创建MyClassifier 的属性,这是否意味着我不能在MyClassifier__init__() 中包含此代码?例如if lr != 0: self.nonzero = True else: self.nonzero = False
    • 是的,您不能在__init__() 中定义其他参数。顺便说一句,您可以在构造函数之外创建这些属性。比如决策树的feature_importance_属性
    • 我明白了。所以我只需要调用一个不同的方法来运行附加代码,然后再返回我的新属性的值?例如self.nonzero = check_non_zero_lr()def check_non_zero_lr(): if self.lr != 0: return True else: return False
    • 完成。发布here
    • 是的,我整理出来了。
    猜你喜欢
    • 2020-09-25
    • 2018-06-21
    • 2020-04-25
    • 2018-04-05
    • 2019-12-04
    • 2013-06-04
    • 2021-01-02
    • 2020-07-17
    • 2020-01-15
    相关资源
    最近更新 更多