Использует ли scikit-learn по умолчанию One-Vs-Rest в мультиклассовой классификации? - PullRequest
0 голосов
/ 28 августа 2018

Я имею дело с проблемой нескольких классов (4 класса) и пытаюсь решить ее с помощью scikit-learn в Python.

Я видел, что у меня есть три варианта:

  1. Я просто создаю экземпляр классификатора, затем подхожу к поезду и оцениваю с помощью теста;

    classifier = sv.LinearSVC(random_state=123)
    classifier.fit(Xtrain, ytrain)
    classifier.score(Xtest, ytest)
    
  2. Я "инкапсулирую" созданный экземпляр классификатора в объекте OneVsRest, генерируя новый классификатор, который я использую для обучения и тестирования;

    classifier = OneVsRestClassifier(svm.LinearSVC(random_state=123))
    classifier.fit(Xtrain, ytrain)
    classifier.score(Xtest, ytest)
    
  3. Я «инкапсулирую» созданный экземпляр классификатора в объекте OneVsOne, генерируя новый классификатор, который я использую для обучения и тестирования.

    classifier = OneVsOneClassifier(svm.LinearSVC(random_state=123))
    classifier.fit(Xtrain, ytrain)
    classifier.score(Xtest, ytest)
    

Я понимаю разницу между OneVsRest и OneVsOne, но я не могу понять, что я делаю в первом сценарии, где я явно не выбираю ни один из этих двух вариантов. Что делает Scikit-Learn в этом случае? Неявно ли он использует OneVsRest?

Любые разъяснения по этому вопросу будут высоко оценены.

Лучший, MR

Редактировать : Просто чтобы прояснить ситуацию, я не особо заинтересован в случае с SVM. Например, как насчет RandomForest?

1 Ответ

0 голосов
/ 28 августа 2018

Обновленный ответ : Как пояснено в комментариях и изменениях, вопрос больше касается общих настроек sklearn, а не конкретного случая LinearSVC, который поясняется ниже.

Основным отличием здесь является то, что некоторые из классификаторов, которые вы можете использовать, имеют «встроенную поддержку мультиклассовой классификации», то есть этот алгоритм может различать более двух классов по умолчанию . Одним из примеров этого может быть, например, Случайный лес или Многослойный персептрон (MLP) с несколькими выходными узлами.

В этих случаях наличие OneVs объекта вовсе не требуется, поскольку вы уже решаете свою задачу. Фактически, использование такой стратегии может даже снизить вашу производительность, поскольку вы «скрываете» потенциальные корреляции от алгоритма, позволяя ему выбирать только между отдельными двоичными экземплярами.

С другой стороны, алгоритмы типа SVC или LinearSVC поддерживают только двоичную классификацию. Таким образом, чтобы расширить эти классы (высокопроизводительных) алгоритмов, мы вместо этого должны полагаться на редукцию к задаче двоичной классификации, от нашей первоначальной задачи классификации мультикласса.

Насколько мне известно, наиболее полный обзор можно найти здесь : Если вы прокрутите немного вниз, вы увидите, какой из алгоритмов является мультиклассовым или использует одну из стратегий по умолчанию.
Обратите внимание, что все перечисленные алгоритмы в OVO на самом деле теперь используют стратегию OVR по умолчанию! В этом отношении информация выглядит несколько устаревшей.

Первоначальный ответ :

На этот вопрос легко ответить, посмотрев соответствующую документацию scikit-learn .
Как правило, в Stackoverflow ожидается, что вы хотя бы самостоятельно провели какое-то исследование, поэтому сначала изучите существующую документацию.

multi_class : строка, «ovr» или «crammer_singer» (по умолчанию = «ovr»)

Определяет мультиклассовую стратегию, если у содержит более двух классов. "ovr" обучает n_classes один-против-остальных классификаторов, в то время как "crammer_singer" оптимизирует общую цель по всем классам. В то время как crammer_singer интересен с теоретической точки зрения как таковой последовательный, он редко используется на практике, так как редко приводит к улучшению точность и дороже для вычисления. Если "crammer_singer" Выбранные параметры проигрыша, пенальти и двойного будут игнорироваться.

Итак, ясно, что он использует один против остальных.

То же самое относится и к "обычному" SVC .

...