Sklearn GridSearchCV如何与管道工作结合使用



我很难理解GridSearchCV的真正起作用,并结合了自定义的转换。

我想实现的目标:我想实现一个变压器/估计器,该变压器/估计器允许在某些方法之间根据参数进行切换,因为我想在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. 通过管道将测试折叠
  6. 重复因此,我本来可以预期对Transformer方法进行8次呼叫,因为我们需要火车一个和一个用于测试折叠的电话。由于cv = 2,我们执行了2次,并且由于我们在paramgrid内定义了两个不同的值,所以我们必须用2,因此是8个乘以它。

但是为什么我的缩放课程有这么多电话?如何解释该日志的顺序?为什么末端的完整序列转换了?

有4组三个转换和最终的单个变换。

组是火车通行证,测试通行证和计算训练得分。GridSearchCV()构造器中的return_train_score=False参数可以消除后者。

最终转换拟合了整个数据集中最佳性能模型。可以使用refit=False构造函数的CC_3选项消除它。

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

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

您将根据您正确预期获得8个变换。

请参阅GridSearchCV文档中的评论页面:

return_train_score :布尔值,可选 如果false,则CV_Results_属性将不包括训练分数。 当前默认值是"警告",除了提高外,其行为是正确的 抬高训练分数时警告。那默认 将在0.21中更改为false。计算培训分数用于 了解不同的参数设置如何影响 过度拟合/不足的权衡。但是计算分数 培训集在计算上可能很昂贵,并且并非严格 选择最佳概括的参数需要 性能。

最新更新