GridSearchCV для мультикласса SVM в python - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь узнать, как найти лучшие параметры для классификатора.Итак, я использую GridSearchCV для задачи классификации нескольких классов.Фиктивный код был сгенерирован на Разве GridSearchCV не поддерживает мультикласс? Я просто использую этот код с n_classes = 3.

import numpy as np
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler,label_binarize
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, make_scorer

X, y = make_classification(n_samples=3000, n_features=10, weights=[0.1, 0.9, 0.3],n_classes=3, n_clusters_per_class=1,n_informative=2)

pipe = make_pipeline(StandardScaler(), SVC(kernel='rbf', class_weight='auto'))

param_space = dict(svc__C=np.logspace(-5,0,5), svc__gamma=np.logspace(-2, 2, 10))

f1_score
my_scorer = make_scorer(f1_score, greater_is_better=True)

gscv = GridSearchCV(pipe, param_space, scoring=my_scorer)

Я пытаюсь выполнить Однократное кодирование , как указано здесь Scikit-learn GridSearch с сообщением «ValueError: мультиклассовый формат не поддерживается» ошибка .Кроме того, иногда будет набор данных, такой как Toxic Comment Classification dataset on Kaggle, который даст вам двоичные метки.

y = label_binarize(y, classes=[0, 1, 2])
for i in classes:    
gscv.fit(X, y[i])

print gscv.best_params_

Я получаю:

ValueError: bad input shape (2000L, 3L)

Я не уверен, почему я получаю эту ошибку.Моя цель - найти наилучшие параметры для задачи классификации нескольких классов.

1 Ответ

0 голосов
/ 08 июня 2018

В двух частях вашего кода есть две проблемы.

1) Начнем с первой части, когда вы не закодировали метки в горячем виде.Видите ли, SVC прекрасно поддерживает случаи с несколькими классами.Но f1_score в сочетании с (внутри) GridSearchCV не имеет значения.

f1_score по умолчанию возвращает оценки положительной метки в случае двоичной классификации, поэтому в вашем случае возникнет ошибка.

ИЛИ Он также может возвращать массив баллов (по одному для каждого класса), но GridSearchCV принимает только одно значение в качестве балла, потому что это необходимо для нахождения лучшего балла и лучшей комбинациигипер-параметры.Поэтому вам нужно передать метод усреднения в f1_score, чтобы получить единственное значение из массива.

В соответствии с f1_score документацией разрешены следующие методы усреднения:

среднее: строка, [Нет, двоичный (по умолчанию), «микро», «макрос», «сэмплы», «взвешенный»]

Так что измените ваш make_scorer следующим образомэто:

my_scorer = make_scorer(f1_score, greater_is_better=True, average='micro')

Измените параметр 'average' выше, как вам удобно.

2) Теперь перейдем ко второй части: когда вы кодируете ярлыки в горячем виде, формаy становится 2-й, но SVC поддерживает только 1-й массив как y, как указано в документации:

fit(X, y, sample_weight=None)[source]

    X : {array-like, sparse matrix}, shape (n_samples, n_features)
    y : array-like, shape (n_samples,)

Но даже если вы закодируете метки и используете классификатор, который поддерживает двумерные метки, то первую ошибку придется устранить.Поэтому я бы посоветовал вам не кодировать ярлыки одним щелчком, а просто изменить f1_score.

...