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