Использование нескольких целей в конвейере - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть набор данных, который можно пометить либо как классы 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), но я понятия не имею, как обойти это. Есть идеи?

...