В двух частях вашего кода есть две проблемы.
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
.