假设您想要处理独立模型中的一组特征,然后将它们的结果合并在一起,我将在下面写下答案.但是,如果您只想在单个模型中使用来自所有3种特征提取技术的特征,那么只需将它们一起附加到单个数据集中并将其用于训练.
我认为在Pipeline中最简单的方法是创建一个包含所有三种技术特征的单个(978 * 965)pandas DataFrame.然后在您的管道中,您可以定义一个选择功能组的自定义类,例如,这应该工作:
class VarSelect(BaseEstimator, TransformerMixin):
def __init__(self, keys):
self.keys = keys
def fit(self, x, y=None):
return self
def transform(self, df):
return df[self.keys].values
然后,您将需要一个适合模型的简单类,然后将其转换为提供预测(将模型堆叠在一起所需).这样的事情应该有效(取决于你的问题是回归还是分类):
class ModelClassTransformer(BaseEstimator, TransformerMixin):
def __init__(self, model):
self.model = model
def fit(self, *args, **kwargs):
self.model.fit(*args, **kwargs)
return self
def transform(self, X, **transform_params):
return DataFrame(self.model.predict_proba(X))
class ModelRegTransformer(BaseEstimator, TransformerMixin):
def __init__(self, model):
self.model = model
def fit(self, *args, **kwargs):
self.model.fit(*args, **kwargs)
return self
def transform(self, X, **transform_params):
return DataFrame(self.model.predict(X))
现在您拥有了所有这些东西,您可以创建一个管道,在数据集的子集上训练单个模型,然后将它们堆叠在最终的整体模型中.使用一堆SVM(如您所请求的)的示例管道可能如下所示:
Pipeline([
('union', FeatureUnion([
('modelA', Pipeline([
('var', VarSelect(keys=vars_a)),
('scl', StandardScaler(copy=True, with_mean=True, with_std=True)),
('svm', ModelRegTransformer(SVC(kernel='rbf')))),
])),
('modelB', Pipeline([
('var', VarSelect(keys=vars_b)),
('scl', StandardScaler(copy=True, with_mean=True, with_std=True)),
('svm', ModelRegTransformer(SVC(kernel='rbf'))),
])),
('modelC', Pipeline([
('var', VarSelect(keys=vars_c)),
('scl', StandardScaler(copy=True, with_mean=True, with_std=True)),
('svm', ModelRegTransformer(SVC(kernel='rbf'))),
]))
])),
('scl', StandardScaler(copy=True, with_mean=True, with_std=True)),
('svm', SVC(kernel='rbf'))
])