Многопоточные целевые данные не поддерживаются с бинаризацией меток - PullRequest
0 голосов
/ 30 сентября 2019

Я соответствую своей модели MultinomialNB с K-кратным разделением.

Я пытался сбалансировать данные с SMOTE (imblearn.over_sampling, lib)

NB_pipeline = Pipeline([
                ('tfidf', TfidfVectorizer(stop_words=stop_words)),
                ('clf', OneVsRestClassifier(MultinomialNB(
                    fit_prior=True, class_prior=None))),
            ])

for train_indices, test_indices in k_fold.split(train_data):

    train_sequencies = train_data.iloc[train_indices]['NAME']
    label_train = train_data.iloc[train_indices][['SEARCH','OPTIONS_VOLUME', 'OPTIONS_QUANTITY', 'OPTIONS_PORTION', 
                                                      'OPTIONS_WEIGHT', 'OPTIONS_SIZE', 'OPTIONS_CONCENTRATION', 
                                                      'OPTIONS_CONTENT', 'OPTIONS_MANUFACTURER']]

    test_sequencies = train_data.iloc[test_indices]['NAME']
    label_test = train_data.iloc[test_indices][['SEARCH','OPTIONS_VOLUME', 'OPTIONS_QUANTITY', 'OPTIONS_PORTION',
                                                'OPTIONS_WEIGHT', 'OPTIONS_SIZE', 'OPTIONS_CONCENTRATION', 
                                                'OPTIONS_CONTENT', 'OPTIONS_MANUFACTURER']]


    NB_pipeline.fit(train_sequencies, label_train)
    predictions = pipeline.predict(test_sequencies)

    confusion += confusion_matrics(test_sequencies, label_test)
    score = f1_score(test_sequencies, label_test)

    score.append(score)

Я ожидаю кросс-проверка многокомпонентной классификации

1 Ответ

0 голосов
/ 30 сентября 2019

OneVsRestClassifier состоит в подборе одного классификатора на класс, а не на цель.

Поскольку MultinomialNB не поддерживает целевые данные с несколькими выходами, вы можете установить один MultinomialNB на цель с помощью MultiOutputClassifier . Это простая стратегия для расширения классификаторов, которые изначально не поддерживают многоцелевую классификацию.

NB_pipeline = Pipeline([
                ('tfidf', TfidfVectorizer(stop_words=stop_words)),
                ('clf', MultiOutputClassifier(MultinomialNB( fit_prior=True, class_prior=None))),])

Если вы хотите подогнать по одному классификатору на класс (класс подгоняется ко всем остальным классам) ицель:

NB_pipeline = Pipeline([
                ('tfidf', TfidfVectorizer(stop_words=stop_words)),
                ('clf', MultiOutputClassifier(OneVsRestClassifier(MultinomialNB( fit_prior=True, class_prior=None)))),])
...