У меня есть набор данных, который можно пометить либо как классы 1-4, либо как выбросы / выбросы, например,
- класс 1 (выброс)
- класс 2 (вклад)
- Класс 3 (выброс)
- Класс 4 (выброс)
Я использую LDA()
как часть конвейера, чтобы найти размеры, которые максимизируют расстояние между четырьмя классы, но позже я sh буду использовать метки outlier / inlier (-1/1) в качестве входных данных для OneClassSVM()
.
Цель состоит в том, чтобы выполнить GridSearch, поэтому, если я не ошибаюсь Мне понадобятся шаги предварительной обработки и классификатор вместе в одном конвейере?
Вот воспроизводимый пример:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.svm import OneClassSVM as OCSVM
import pandas as pd
# create four different clusters
X, y1 = make_blobs(centers = 4, cluster_std=2, n_samples=1000, n_features=10, random_state=2)
class_dict = {0:-1, 1:1, 2:-1, 3:-1} # define a dictionary to map original class labels to inlier / outlier
y2 = list(map(class_dict.get, y1)) # use dictionary
pipe = Pipeline([('scaler', StandardScaler()),
('lda', LDA(n_components=3, solver="eigen", shrinkage="auto")),
('lda_scaler', StandardScaler()),
('ocsvm', OCSVM(kernel="rbf", nu=0.1, gamma="auto"))
])
pipe.fit(X, y2, ocsvm__y=y1)
, который дает следующую ошибку:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
24 ])
25
---> 26 pipe.fit(X, y2, ocsvm__y=y1)
27
28
~\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\pipeline.py in fit(self, X, y, **fit_params)
352 self._log_message(len(self.steps) - 1)):
353 if self._final_estimator != 'passthrough':
--> 354 self._final_estimator.fit(Xt, y, **fit_params)
355 return self
356
TypeError: fit() got multiple values for argument 'y'
Я думаю, что происходит, когда у определяется дважды в функции подгонки, т.е. clf.fit(X=X, y=y2, y=y1)
, но я понятия не имею, как обойти это. Есть идеи?