检测和删除异常值作为管道的一个步骤
Detect and Remove Outliers as step of a Pipeline
我有问题,我正在尝试构建自己的 class 以放入 python 中的管道,但它不起作用。
我要解决的问题是多class class化问题。
我想做的是在管道中添加一个步骤来检测和删除异常值。
我发现这个 与我所做的非常相似。
这是我的 class:
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'
下面的代码是我用来调用这个的代码 class:
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)
错误是因为转换方法def transform(self, X, y)
需要同时X
和y
被传入,但是调用它的是什么仅通过 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)
@TimCroydon 说得对:sklearn
目前假设转换器只转换它们的自变量。关于如何最好地放松这一点已经进行了长时间的讨论:
- SLEP 001 (!)
- PR 13269,
的概念验证
- Issue 3855
scikit-learn-contrib
包imbalanced-learn
支持多种重采样器,效果相似但上下文不同;你也许可以使用它,但在删除异常值时 fit_sample
ing 可能看起来有点奇怪。无论如何,他们有一个自定义版本的 Pipeline
可以优雅地处理重采样。
最后,您可能 能够在您的自定义 class 中覆盖 fit_transform
方法。它似乎适用于这种情况,尽管它可能会在其他地方引起问题。
我有问题,我正在尝试构建自己的 class 以放入 python 中的管道,但它不起作用。
我要解决的问题是多class class化问题。
我想做的是在管道中添加一个步骤来检测和删除异常值。
我发现这个
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'
下面的代码是我用来调用这个的代码 class:
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)
错误是因为转换方法def transform(self, X, y)
需要同时X
和y
被传入,但是调用它的是什么仅通过 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)
@TimCroydon 说得对:sklearn
目前假设转换器只转换它们的自变量。关于如何最好地放松这一点已经进行了长时间的讨论:
- SLEP 001 (!)
- PR 13269, 的概念验证
- Issue 3855
scikit-learn-contrib
包imbalanced-learn
支持多种重采样器,效果相似但上下文不同;你也许可以使用它,但在删除异常值时 fit_sample
ing 可能看起来有点奇怪。无论如何,他们有一个自定义版本的 Pipeline
可以优雅地处理重采样。
最后,您可能 能够在您的自定义 class 中覆盖 fit_transform
方法。它似乎适用于这种情况,尽管它可能会在其他地方引起问题。