我正在嘗試為一個自定義案例運行網格搜索,該案例涉及一個包含pipeline作為其構造函數輸入之一的估算器。class DefaultEstimator(BaseEstimator, TransformerMixin): def __init__(self, preprocessor, pipelines): self.pipelines = pipelines def fit(self, X, y=None): for idx, each_pipeline in enumerate(self.pipelines): each_pipeline.fit(X[idx], y) return self def transform(self, X): transformed_data = [] for idx, each_pipeline in enumerate(self.pipelines): transformed_data.append(each_pipeline.transform(X[idx)) return sp.hstack(transformed_data)我的管道看起來像這樣:pipeline1 = trainer.create_pipeline(num_features=100)pipeline2 = trainer.create_pipeline(num_features=50)復合管道看起來像:aggregated_pipeline = Pipeline([('contextual', DefaultEstimator([pipeline1, pipeline2])), ('classifier', Pipeline([('clf', SVM(random_state=1234, probability=True)])) ])輸入數據有兩列,每列都有一個各自的管道(pipeline1和pipeline2)。對于按鍵grid_params的clf可寫成classifier__clf__C,classifier__clf__gamma等等?,F在的問題是:如何編寫grid_params用于GridSearchCV(...)作為管道的步驟之一是不是一個管道對象,而定制估計對象?
1 回答

LEATH
TA貢獻1936條經驗 獲得超7個贊
GridSearchCV并Pipeline使用估計器set_params設置要測試的參數。所以,你必須在你的 中實現這一點DefaultEstimator,并適當地設置管道參數。scikit 中的一個常見模式是使用雙下劃線來分隔嵌套對象的參數,例如:
class DefaultEstimator:
def set_params(self, **kwargs):
for k, v in kwargs.items():
parts = k.split('__')
if parts[0].startswith('pipeline'):
pipe_num = int(parts[0].split('_')[1])
param_name = '__'.join(parts[1:])
self.pipelines[pipe_num].set_params(*{param_name: v})
else:
# other logic
這將允許您使用諸如contextual__pipeline_1__num_features(contextual__將被網格搜索剝離,因此無需處理它) 之類的參數。
添加回答
舉報
0/150
提交
取消