One-versus-one (OvO)

En esta segunda estrategia, one-versus-one, entrenaríamos un clasificador para cada combinación posible de especie de flores: uno para setosa-versicolor, otro para setosa-virginica y un tercero para versicolor-virginica. A la hora de clasificar una flor, se ejecutarían todos los clasificadores para ver qué clase "gana" la mayor parte de las confrontaciones (si la flor es, por ejemplo, de la clase setosa, uno esperaría que fuese así detectada tanto por el clasificador setosa-versicolor como por el clasificador setosa-virginica).

En esta estrategia, si tenemos N clases, harán falta N x (N-1) / 2 clasificadores. Si N es 10, serían 47 clasificadores los necesarios...

Cuando Scikit-Learn detecta que estamos utilizando un clasificador en un entorno multiclase, aplica automáticamente la estrategia OvA (preferida generalmente) salvo para Support Vector Machines, para el que se aplica OvO. En cualquier caso podemos forzar a Scikit-Learn a que aplique una estrategia u otra con las clases sklearn.multiclass.OneVsOneClassifier y sklearn.multiclass.OneVsRestClassifier. Ambas clases aceptan como argumento un modelo, y lo entrenarán (y realizarán predicciones) con la estrategia que hayamos indicado. Por ejemplo, para crear un modelo basado en el algoritmo DecisionTreeClassifier con la estrategia de OvO podemos recurrir al siguiente código:

from sklearn.multiclass import OneVsOneClassifier
from sklearn.tree import DecisionTreeClassifier

model = OneVsOneClassifier(DecisionTreeClassifier)