Трубопровод: несколько классификаторов? - PullRequest
0 голосов
/ 11 мая 2018

Я прочитал следующий пример на Pipelines и GridSearchCV в Python: http://www.davidsbatista.net/blog/2017/04/01/document_classification/

Логистическая регрессия:

pipeline = Pipeline([
    ('tfidf', TfidfVectorizer(stop_words=stop_words)),
    ('clf', OneVsRestClassifier(LogisticRegression(solver='sag')),
])
parameters = {
    'tfidf__max_df': (0.25, 0.5, 0.75),
    'tfidf__ngram_range': [(1, 1), (1, 2), (1, 3)],
    "clf__estimator__C": [0.01, 0.1, 1],
    "clf__estimator__class_weight": ['balanced', None],
}

SVM:

pipeline = Pipeline([
    ('tfidf', TfidfVectorizer(stop_words=stop_words)),
    ('clf', OneVsRestClassifier(LinearSVC()),
])
parameters = {
    'tfidf__max_df': (0.25, 0.5, 0.75),
    'tfidf__ngram_range': [(1, 1), (1, 2), (1, 3)],
    "clf__estimator__C": [0.01, 0.1, 1],
    "clf__estimator__class_weight": ['balanced', None],
}

Есть ли способ объединить логистическую регрессию и SVM в один конвейер?Скажем, у меня есть TfidfVectorizer, и мне нравится тестировать несколько классификаторов, каждый из которых затем выводит лучшую модель / параметры.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вот простой способ оптимизировать для любого классификатора и для каждого классификатора любые настройки параметров.

Создать класс переключателя, который работает для любого оценщика

from sklearn.base import BaseEstimator
class ClfSwitcher(BaseEstimator):

def __init__(
    self, 
    estimator = SGDClassifier(),
):
    """
    A Custom BaseEstimator that can switch between classifiers.
    :param estimator: sklearn object - The classifier
    """ 

    self.estimator = estimator


def fit(self, X, y=None, **kwargs):
    self.estimator.fit(X, y)
    return self


def predict(self, X, y=None):
    return self.estimator.predict(X)


def predict_proba(self, X):
    return self.estimator.predict_proba(X)


def score(self, X, y):
    return self.estimator.score(X, y)

Теперь вы можете передатьв любом случае для параметра оценки.И вы можете оптимизировать любой параметр для любого оценщика, который вы передаете, следующим образом:

Выполнить оптимизацию гиперпараметров

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('clf', ClfSwitcher()),
])

parameters = [
    {
        'clf__estimator': [SGDClassifier()], # SVM if hinge loss / logreg if log loss
        'tfidf__max_df': (0.25, 0.5, 0.75, 1.0),
        'tfidf__stop_words': ['english', None],
        'clf__estimator__penalty': ('l2', 'elasticnet', 'l1'),
        'clf__estimator__max_iter': [50, 80],
        'clf__estimator__tol': [1e-4],
        'clf__estimator__loss': ['hinge', 'log', 'modified_huber'],
    },
    {
        'clf__estimator': [MultinomialNB()],
        'tfidf__max_df': (0.25, 0.5, 0.75, 1.0),
        'tfidf__stop_words': [None],
        'clf__estimator__alpha': (1e-2, 1e-3, 1e-1),
    },
]

gscv = GridSearchCV(pipeline, parameters, cv=5, n_jobs=12, return_train_score=False, verbose=3)
gscv.fit(train_data, train_labels)

Как интерпретировать clf__estimator__loss

clf__estimator__lossинтерпретируется как параметр loss для любого значения estimator, где estimator = SGDClassifier() в самом верхнем примере и сам является параметром clf, который является ClfSwitcher объектом.

0 голосов
/ 12 мая 2018

Да, вы можете сделать это, создав функцию-обертку. Идея состоит в том, чтобы передать ему два словаря: модели и параметры;

Затем вы итеративно вызываете модели со всеми параметрами для тестирования, используя для этого GridSearchCV.

Проверьте этот пример, добавлена ​​дополнительная функциональность, так что в конце вы выводите фрейм данных со сводкой различных моделей / параметров и разных показателей производительности.

РЕДАКТИРОВАТЬ: здесь слишком много кода для вставки, полный рабочий пример можно посмотреть здесь:

http://www.davidsbatista.net/blog/2018/02/23/model_optimization/

...