Классификатор с несколькими выходами Scikit-learn с использованием: GridSearchCV, Pipeline, OneVsRestClassifier, SGDClassifier

Я пытаюсь построить модель с несколькими выходами с помощью GridSearchCV и Pipeline. Конвейер вызывает у меня проблемы, потому что в стандартных примерах классификатора нет OneVsRestClassifier (), обертывающего классификатор. Я использую scikit-learn 0.18 и python 3.5

## Pipeline: Train and Predict
## SGD: support vector machine (SVM) with gradient descent
from sklearn.multiclass import OneVsRestClassifier
from sklearn.pipeline import Pipeline
from sklearn.linear_model import SGDClassifier

clf = Pipeline([
               ('vect', CountVectorizer(ngram_range=(1,3), max_df=0.50 ) ),
               ('tfidf', TfidfTransformer() ),
               ('clf', SGDClassifier(loss='modified_huber', penalty='elasticnet',
                                          alpha=1e-4, n_iter=5, random_state=42,
                                          shuffle=True, n_jobs=-1) ),
                ])

ovr_clf = OneVsRestClassifier(clf ) 

from sklearn.model_selection import GridSearchCV
parameters = {'vect__ngram_range': [(1,1), (1,3)],
              'tfidf__norm': ('l1', 'l2', None),
              'estimator__loss': ('modified_huber', 'hinge',),
             }

gs_clf = GridSearchCV(estimator=pipeline, param_grid=parameters, 
                      scoring='f1_weighted', n_jobs=-1, verbose=1)
gs_clf = gs_clf.fit(X_train, y_train)

Но это дает ошибку: ....

ValueError: Недопустимая оценка параметра для конвейера оценки (steps = [('vect', CountVectorizer (analyzer = 'word', binary = False, decode_error = 'strict', dtype =, encoding = 'utf-8', input = 'content ', нижний регистр = True, max_df = 0.5, max_features = None, min_df = 1, ngram_range = (1, 3), препроцессор = None, stop_words = None, strip ... er_t = 0.5, random_state = 42, shuffle = True, verbose = 0, warm_start = False), n_jobs = -1))]). Проверьте список доступных параметров с помощью estimator.get_params().keys().

Итак, как правильно передавать параметры в clf через OneVsRestClassifier, используя param_grid и Pipeline? Нужно ли мне отделить векторизатор и tdidf от классификатора в конвейере?


person MyopicVisage    schedule 01.11.2016    source источник


Ответы (1)


Передайте OneVsRestClassifier () как шаг самого конвейера и SGDClassifier как средство оценки OneVsRestClassifier. Вы можете пойти вот так.

pipeline = Pipeline([
               ('vect', CountVectorizer(ngram_range=(1,3), max_df=0.50 ) ),
               ('tfidf', TfidfTransformer() ),
               ('clf', OneVsRestClassifier(SGDClassifier(loss='modified_huber', penalty='elasticnet',
                                          alpha=1e-4, n_iter=5, random_state=42,
                                          shuffle=True, n_jobs=-1) )),
                ])

Остальная часть кода может остаться прежней. OneVsRestClassifier действует как оболочка для других оценщиков.

person Ashok Choudhary    schedule 01.11.2016
comment
Это сработало! (1) Я переместил OneVsRestClassifier внутрь конвейера, чтобы обернуть SGDClassifier. (2) Я добавил префикс clf__ к параметрам оценки обработки param_grid, то есть clf__estimator__penalty. - person MyopicVisage; 01.11.2016
comment
получение ValueError: multiclass-multioutput не поддерживается для MultiOutputClassifier с использованием в качестве обертки и использования файла f1_weighted /opt/conda/lib/python3.7/site-packages/sklearn/metrics/_classification.py, строка 1250, в _check_set_wise_labels y_type, y_tru y_pred = _check_targets (y_true, y_pred) Файл /opt/conda/lib/python3.7/site-packages/sklearn/metrics/_classification.py, строка 98, в _check_targets вызывает ошибку ValueError ({0} не поддерживается. формат (y_type )) ValueError: multiclass-multioutput не поддерживается - person Harsh Gupta; 12.08.2020