sklearn GridsearchCV 结合流水线是如何工作的?

Posted

技术标签:

【中文标题】sklearn GridsearchCV 结合流水线是如何工作的?【英文标题】:How does sklearn GridsearchCV in combination with pipline work? 【发布时间】:2019-08-12 12:09:38 【问题描述】:

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

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

示例:我有一个名为 Scaler() 的自定义 Transformer,它可以选择 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())])

我的参数网格和网格搜索

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。我希望它是这样的。

    实例化所有变形金刚 根据Gridsearch设置参数 通过管道传递 train-fold 通过管道传递测试折叠 重复 所以我预计对transformer方法有8次调用,因为我们需要一个用于火车,一个用于测试折叠。由于 cv=2,我们这样做了 2 次,并且因为我们在参数网格中为 feature_range 定义了两个不同的值,所以我们必须将其乘以 2,因此是 8。出了什么问题?

但是为什么我的 Scaling 类有这么多的调用呢? 如何解释这种日志顺序? 为什么最后的全序列被转换了?

【问题讨论】:

【参考方案1】:

有 4 组三个变换和最后一个变换。

这些组是通过训练、通过测试和计算训练分数。后者可以通过GridSearchCV()构造函数中的return_train_score=False参数消除。

最终的转换是在整个数据集上拟合性能最佳的模型。可以通过 refit=False 选项到 GridSearchCV() 构造函数来消除它。

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

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

您将得到 8 次正确预期的转换。

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

return_train_score:布尔值,可选 如果为 False,则 cv_results_ 属性将不包括训练分数。 当前默认值是 'warn',它的行为是 True 除了引发 查找训练分数时发出警告。该默认值 将在 0.21 中更改为 False。计算训练分数用于 深入了解不同的参数设置如何影响 过拟合/欠拟合权衡。但是计算分数 训练集的计算量可能很大,而且不严格 需要选择产生最佳泛化的参数 性能。

【讨论】:

如果我想有比我更好的方法吗?有一个函数来控制选择哪种特征选择方法以及它们的参数应该是什么样子? 对于超参数优化,您还可以查看hyperopt,它比普通的网格搜索更具功能范围。至于转换器选择,您正在研究 AutoML 领域,因此可能想看看这是如何完成的。但是看看 hyperopt,它可能允许您使用参数构造管道。我最近使用了 Ray Tune,它绝对可以让你在一个实验中创建你的管道。

以上是关于sklearn GridsearchCV 结合流水线是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost 与 GridSearchCV、缩放、PCA 和 sklearn 管道中的 Early-Stopping

GridSearchCV(sklearn)中的多个估计器

GridsearchCV sklearn 中的错误

你能从 sklearn 网格搜索 (GridSearchCV) 中获得所有估计器吗?

无法使用 sklearn 的 GridSearchCV 运行 tflearn

sklearn 中关于 GridSearchCV 的说明