python - 异构特征的featureUnion

标签 python machine-learning scikit-learn feature-extraction

对于一组给定的音频文件,我有 3 个不同的功能集。它们中的每一个都是存储为维度数组的特征矩阵,如下所示:

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

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

我想做的是将它们一起训练成一个给定的分类器。 (使用管道)。 我读过this , this和博客 link在链接 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'))
])

关于python - 异构特征的featureUnion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934267/

相关文章:

python - tkinter SpinBox : delay between updating displayed value and associated StringVar

python - 使用 agg 函数在 Pandas 中分组时进行回合

python - 如何安装与不同版本的Python关联的pip

machine-learning - 在 LDA 中应用 fit_transform 时输入形状错误

python - darkflow - 属性错误 : 'NoneType' object has no attribute 'find'

apache-spark - Spark集群中的任务是如何分布的?

python - 在python中初始化类内的子类

machine-learning - 与标签一对一匹配以进行文本分类

python - 如何找到组中两个事件之间的时间差

python - 值错误: activation is not a legal parameter