结合自定义转换,我很难理解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。我希望这样。
但是为什么我的Scaling类有这么多调用? 如何解释此日志顺序? 为什么最后的完整序列会被转换?
答案 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。计算训练分数用于 了解不同的参数设置如何影响 过拟合/欠拟合权衡。但是计算分数 训练集在计算上可能是昂贵的,并且并不严格 需要选择产生最佳概括的参数 性能。