检测和删除异常值作为管道的步骤

Posted

技术标签:

【中文标题】检测和删除异常值作为管道的步骤【英文标题】:Detect and Remove Outliers as step of a Pipeline 【发布时间】:2020-10-30 07:52:48 【问题描述】:

我有一个问题,我正在尝试构建自己的类以放入 python 中的管道中,但它不起作用。

我要解决的问题是多类分类问题。

我想这样做是为了在管道中添加一个步骤来检测和删除异常值。 我发现这个detect and remove outliers in pipeline python 与我所做的非常相似。 这是我的课:

from sklearn.neighbors import LocalOutlierFactor
from sklearn.base import BaseEstimator, TransformerMixin
import numpy as np

class OutlierExtraction(BaseEstimator, TransformerMixin):
    def __init__(self, **kwargs ):
        self.kwargs = kwargs

    def transform(self, X, y):
        """
            X should be of shape (n_samples, n_features)
            y should be of shape (n_samples,)
        """

        lof = LocalOutlierFactor(**self.kwargs)
        lof.fit(X)
        nof = lof.negative_outlier_factor_
        return X[nof > np.quantile(nof, 0.95), :], y[nof > np.quantile(nof, 0.95)]

    def fit(self, X, y = None):
        return self

但我收到此错误in fit_transform return self.fit(X, y, **fit_params).transform(X) TypeError: transform() missing 1 required positional argument: 'y'

以下代码是我用来调用这个类的代码:

scaler = preprocessing.RobustScaler()
outlierExtractor = OutlierExtraction()
pca = PCA()
classfier = svm.SVC()

pipeline = [('scaler', scaler),
            ('outliers', outlierExtractor),
        ('reduce_dim', pca),
        ('classfier', classfier)]

pipe = Pipeline(pipeline)

params = 
    'reduce_dim__n_components': [5, 15],
    'classfier__kernel': ['rbf'],
    'classfier__gamma': [0.1],
    'classfier__C': [1],
    'classfier__decision_function_shape':['ovo']

my_scoring = 'f1_macro'
n_folds = 5
gscv = GridSearchCV(pipe, param_grid=params, scoring=my_scoring, n_jobs=-1, cv=n_folds, refit=True)
gscv.fit(train_x, train_y)

【问题讨论】:

【参考方案1】:

错误是因为转换方法def transform(self, X, y) 需要both Xy 被传入,但无论调用它什么都只传递X。 (我在你的代码中看不到它是从哪里调用的,所以假设它是由底层库调用的)。

我不知道使y 可选(def transform(self, X, y=None) 并修改您的方法在这种情况下是否可行。否则,您必须弄清楚如何让调用代码通过y,或者提供另一种方式。

我不熟悉该库,但查看source code 表明transform() 应该只采用单个参数X

        if y is None:
            # fit method of arity 1 (unsupervised transformation)
            return self.fit(X, **fit_params).transform(X)
        else:
            # fit method of arity 2 (supervised transformation)
            return self.fit(X, y, **fit_params).transform(X)

【讨论】:

使 y optional 出现错误,但我理解错误,谢谢【参考方案2】:

@TimCroydon 说得对:sklearn 目前假设转换器只转换它们的自变量。关于如何最好地放松这一点已经进行了一些长时间的讨论:

SLEP 001 (!) PR 13269,这是一个概念验证 Issue 3855

scikit-learn-contribimbalanced-learn 支持许多重采样器,它们的效果相似但上下文不同;您也许可以使用它,但在删除异常值时,fit_sampleing 可能看起来有点奇怪。无论如何,他们有一个自定义版本的 Pipeline 可以优雅地处理重采样。

最后,您也许可以在您的自定义类中重写fit_transform 方法。似乎它应该适用于这种情况,尽管它可能会在其他地方引起问题。

【讨论】:

以上是关于检测和删除异常值作为管道的步骤的主要内容,如果未能解决你的问题,请参考以下文章

R语言︱异常值检验离群点分析异常值处理

如何一次性检测和删除熊猫数据帧每一列的异常值? [复制]

深度学习异常值检测方法

MAD+异常检测

Novelty and Outlier Detection(奇异值和异常值检测)

对于异常值的检测