对于一组给定的音频文件,我有3个不同的功能集。每一个都是特征矩阵,存储为维数数组,如下所示:
- 特性1:(978*153)
- 特性2:(978*800)
- 特性3:(978*12)
这些特征都是使用不同的技术从音频文件中提取出来的。
我想做的是把它们一起训练成一个给定的分类器。(使用管道)。我读过这个,这个和链接2中的博客链接,但它涉及不同的提取方法,然后使用分类器。因为我已经提取的数据如上所述,我想知道下一步该做什么,即如何将它们组合成一个管道。
我知道这里不能要求直接的代码-我只想要指针如何组合从不同方法中提取的数据(可能使用管道),例如使用SVM对它们进行分类
假设您想要处理独立模型中的一组特征,然后将它们的结果集成在一起,我将在下面写下答案。然而,如果你想在单个模型中简单地使用所有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'))
])