Можете ли вы использовать многоклассовый классификатор объекта (объектов) при обработке / проектировании объектов поверх (сложенного) классификатора?

#python #scikit-learn #pipeline #feature-engineering

#python #scikit-learn #конвейер #разработка объектов

Вопрос:

Можете ли вы использовать многоклассовый классификатор объекта (объектов) при обработке / проектировании объектов поверх сложенного классификатора?

Пример использования: у вас есть 10 функций для использования в задаче многоклассовой классификации. 1 из этих объектов — текст, остальные и категориальные, числовые и временные.

9 функций проходят типичные этапы конвейера:

Аналогично преобразователю столбцов sklearn с примером смешанных типов:

 numeric_features = ['age', 'fare']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])

categorical_features = ['embarked', 'sex', 'pclass']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])
  

Текстовый объект «предварительно обрабатывается» или проектируется путем передачи его через текстовый конвейер, который содержит обученную векторную модель, специфичную для конкретной области. Результатом которого является 100-мерный вектор / массив, переданный в многоклассовый классификатор, который выводит вероятности классификации («predict_proba»).

Затем эти вероятности будут объединены с функциями из вышеупомянутого препроцессора перед передачей в классификатор / классификатор стекирования:

 text_features = ['domain text']
text_transformer = Pipeline(steps=[
    ('text_vectors', (TextVectorizer() ),
    ('predict_prob',  DecisionTreeClassifier(params='awesome'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('text', text_transformer, text_features),
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])


clf = Pipeline(steps=[('preprocessor', preprocessor),
                      ('classifier', LogisticRegression(solver='lbfgs'))])
  

Несколькими различными способами я использовал sklearn mixins (BaseEstimator, TransformerMixin, ClassifierMixin) для создания пользовательского класса или классов для этого, но я потерпел неудачу. Много ошибок. Похоже, я не могу заставить классификатор работать внутри класса transformer.

Вот пример одной из моих многочисленных попыток

 class TextVectorClassifierProba(ClassifierMixin,BaseEstimator, TransformerMixin):
    """ """

    def __init__(self):


        pass

    def transform(self, df, y=None):
        """The workhorse of this feature extractor"""
        vector = Pipeline(steps=[('word_vectorizer', TextVectorTransformer())
                         ,('classifier',DecisionTreeClassifier())])


        return vector.fit(df).predict_proba(df)

    def fit(self, df, y=None):
        """Returns `self` unless something different happens in train and test"""
        return self

  

Реальный вопрос:
Можете ли вы затем предсказать, как часть преобразования подмножества ваших данных в сложенном ансамбле?

Несколькими различными способами я использовал sklearn mixins (BaseEstimator, TransformerMixin, ClassifierMixin) для создания пользовательских классов для этого, но я потерпел неудачу.

Будет ли это действительно работать? Кто-нибудь когда-нибудь видел что-нибудь подобное или я просто придумываю сумасшедшие вещи?

Любое понимание или мысли будут оценены.

Спасибо!