sklearn GridsearchCV与pipline结合如何工作?

时间:2019-03-21 15:21:07

标签: python scikit-learn pipeline grid-search

结合自定义转换,我很难理解GridsearchCV的工作原理。

我想要实现的目标: 我想实现一个Transformer / Estimator,它允许根据参数在某些方法之间进行切换,因为我想在gridsearch中包括这些不同的方法。

示例:我有一个自定义的Scaler()变压器,可以选择MinMaxScaler或StandardScaler。 (为简单起见)

class Scaling():

def __init__(self, **params):
    self.method=None
    self.params = {}
    print("INITIATING CLASS")


def fit(self, X, y=None):
    return self

def transform(self, X): 
    print("TRANSFORMING", X)
    if self.method == "minMax":
        self.scaler = 
        MinMaxScaler(feature_range=self.params["feature_range"])
    elif self.method == "std":
        self.scaler = StandardScaler()

    return self.scaler.fit_transform(X)

def get_params(self, **params):
    return {**StandardScaler().get_params(), **MinMaxScaler().get_params(), 
            **{"method":""} }

def set_params(self, **params):
    print("SETTING PARAMETER")
    self.method = params["method"]
    self.params = params

这是我的示例数据:

data = np.array([1,2,3,4,5,6,7,8,9,10]).reshape(-1,1)
y = [2,3,4,5,6,7,8,9,10,11]

我的路线:

p = Pipeline([('scaler', Scaling()),
('model', LinearRegression())])

我的paramgrid和Gridsearch

hyperparams = {
'scaler__feature_range' : [(0,1), (-100,10)],
'scaler__method':["minMax"]
 }

clf = GridSearchCV(p,hyperparams, cv=2)
clf.fit(data, y)

它确实有效,但是我对打印日志感到困惑:

INITIATING CLASS
INITIATING CLASS
INITIATING CLASS
SETTING PARAMETER
TRANSFORMING [[ 6][ 7][ 8][ 9][10]]
TRANSFORMING [[1][2][3][4][5]]
TRANSFORMING [[ 6][ 7][ 8][ 9][10]]
INITIATING CLASS 
SETTING PARAMETER
TRANSFORMING [[1][2][3][4][5]]
TRANSFORMING [[ 6][ 7][ 8][ 9][10]]
TRANSFORMING [[1][2][3][4][5]]
INITIATING CLASS
SETTING PARAMETER
TRANSFORMING [[ 6][ 7][ 8][ 9][10]]
TRANSFORMING [[1][2][3][4][5]]
TRANSFORMING [[ 6][ 7][ 8][ 9][10]]
INITIATING CLASS
SETTING PARAMETER
TRANSFORMING [[1][2][3][4][5]]
TRANSFORMING [[ 6][ 7][ 8][ 9][10]]
TRANSFORMING [[1][2][3][4][5]]
INITIATING CLASS
SETTING PARAMETER
TRANSFORMING [[ 1][ 2 [ 3][ 4][ 5][ 6][ 7][ 8][ 9][10]]

我设置了cv = 2。我希望这样。

  1. 实例化所有变形金刚
  2. 根据Gridsearch设置参数
  3. 将折叠式火车通过管道
  4. 通过管道进行测试折叠
  5. 重复 因此,我本来希望对转换器方法有8个调用,因为我们需要一个火车训练和一个测试折叠。由于cv = 2,我们执行了2次,并且由于我们在paramgrid中为feature_range定义了两个不同的值,因此必须将其乘以2,因此乘以8。这是怎么回事?

但是为什么我的Scaling类有这么多调用? 如何解释此日志顺序? 为什么最后的完整序列会被转换?

1 个答案:

答案 0 :(得分:1)

共有4组,包括三个变换和最后一个单个变换。

组为火车通过,测试通过和计算训练成绩。可以通过return_train_score=False构造函数中的GridSearchCV()参数来消除后者。

最终的转换将使性能最佳的模型适合整个数据集。可以使用refit=False构造函数的GridSearchCV()选项消除它。

因此,一旦您实例化clf对象为:

clf = GridSearchCV(p,hyperparams, cv=2, refit=False, return_train_score=False)

您将获得8次正确的转换。

在GridSearchCV文档页面中查看评论:

  

return_train_score :布尔值,可选       如果为False,则cv_results_属性将不包括训练得分。       当前默认值是“警告”,除了提高以外,它的行为还为True   查找训练分数时发出警告。该默认   将在0.21中更改为False。计算训练分数用于   了解不同的参数设置如何影响   过拟合/欠拟合权衡。但是计算分数   训练集在计算上可能是昂贵的,并且并不严格   需要选择产生最佳概括的参数   性能。