特征联盟的异质性特征

Vya*_*yas 5 python machine-learning feature-extraction scikit-learn

我为一组给定的音频文件提供了3种不同的功能集.它们中的每一个都是以维度数组存储的特征矩阵,如下所示:

  • 特色1:(978*153)
  • 特写2:(978*800)
  • 特写3:(978*12)

已使用不同技术从音频文件中提取这些特征中的每一个.

我想做的是将它们一起训练成一个给定的分类器.(使用管道).我看了这个,这个和博客链接中的链接2,但它与不同的提取方法,然后使用分类交易.由于我已经提取了上面提到的数据,我想知道下一步该做什么,即如何将它们组合成一个管道.

我知道在这里不能要求直接代码 - 我只是想要指针如何组合从不同方法中提取的数据(可能使用管道),例如使用SVM对它们进行分类.

Dav*_*vid 7

假设您想要处理独立模型中的一组特征,然后将它们的结果合并在一起,我将在下面写下答案.但是,如果您只想在单个模型中使用来自所有3种特征提取技术的特征,那么只需将它们一起附加到单个数据集中并将其用于训练.

我认为在a中最简单的方法Pipeline是创建一个pandas DataFrame包含所有三种技术特征的单个(978*965).然后在您的管道中,您可以定义一个选择功能组的自定义类,例如,这应该工作:

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
Run Code Online (Sandbox Code Playgroud)

然后,您将需要一个适合模型的简单类,然后将其转换为提供预测(将模型堆叠在一起所需).这样的事情应该有效(取决于你的问题是回归还是分类):

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))
Run Code Online (Sandbox Code Playgroud)

现在您拥有了所有这些东西,您可以创建一个管道,在数据集的子集上训练单个模型,然后将它们堆叠在最终的整体模型中.使用一堆SV​​M(如您所请求的)的示例管道可能如下所示:

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'))
])
Run Code Online (Sandbox Code Playgroud)