我很难理解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。我希望这样。
- 实例化所有变压器
- 根据GridSearch 设置参数
- 通过管道将火车折叠
- 通过管道将测试折叠
- 重复因此,我本来可以预期对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。计算培训分数用于 了解不同的参数设置如何影响 过度拟合/不足的权衡。但是计算分数 培训集在计算上可能很昂贵,并且并非严格 选择最佳概括的参数需要 性能。