はじめに
本記事では、マルチクラス分類の効果的なアプローチであるOVO(One-Versus-One)とOVR(One-Versus-Rest)について解説します。それぞれの手法の特徴やメリット、どのようなデータに適しているのかを比較し、実際にマルチクラス分類を分析するとき、適切に利用できるようにしましょう。
OVO、OVRとは
OVO(One-Versus-One)とOVR(One-Versus-Rest)は、マルチクラス分類問題の分類器です。
OVO:全てのクラスのペアごとに分類器をトレーニングします。
例)目的変数のクラスが4つある場合は、6通りの分類器を作成します。
OVR:各クラスに対して「そのクラスとその他全てのクラス」の分類器を作成します。
例)目的変数のクラスが4つある場合は、4通りの分類器を作成します。
OVR、OVOを使う利点
OVOのメリット
・2つのクラス間の違いに特化して学習するため、クラス間であまり違いがないデータに効果的です。
・それぞれが二値分類になるため、アルゴリズムがシンプルです。
・一つのクラスに対して複数回学習を行うため、モデルの頑健性が向上することがあります。
・クラス数が少ない場合により有効です。
OVRのメリット
・各クラスで「そのクラスとその他全てのクラス」の分類器を作成するため、実装が簡単です。
・OVRは確率が最も高い予測を選ぶため、一貫した予測が可能です。
・クラス数が増えるほど、OVRはOVOに比べて計算リソースの効率が良くなります。
実装
今回使用するデータは、Wine Qualityです
これは、ワインの品質スコアに関するデータセットで、品質を1から10のスコアで評価しています。
以下の3パターンを実装していきます。
①SVCのみを使用した場合
②OVOとSVCを使用した場合
③OVRとSVCを使用した場合
では、実装していきます。
はじめに必要なライブラリをインポートしています。
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.multiclass import OneVsOneClassifier,OneVsRestClassifier
from sklearn.metrics import accuracy_score
次にWine Qualityデータセットを読み込んで訓練用とテスト用で分割します。
data = fetch_openml('wine-quality-red', version=1)
x,y = data.data,data.target
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2,random_state = 0)
①SVCのみを使用した場合
model = SVC()
model.fit(x_train,y_train)
ypred = model.predict(x_test)
accuracy = accuracy_score(y_test,ypred)
print(f"accuracy:{accuracy}")
[Out]
accuracy:0.53125
②OVOとSVCを使用した場合
model = OneVsOneClassifier(SVC())
model.fit(x_train,y_train)
ypred = model.predict(x_test)
accuracy = accuracy_score(y_test,ypred)
print(f"accuracy:{accuracy}")
[Out]
accuracy:0.528125
③OVRとSVCを使用した場合
model = OneVsRestClassifier(SVC())
model.fit(x_train,y_train)
ypred = model.predict(x_test)
accuracy = accuracy_score(y_test,ypred)
print(f"accuracy:{accuracy}")
[Out]
accuracy:0.625
以上の結果から目的変数のクラス数が多いときは、OVRの精度が一番高いことが分かった。
まとめ
本記事ではOVOとOVRの特徴やメリット、どのようなデータに適しているのかを記載した。目的変数のクラス数が多い場合はOVRが有効であり、データ間の違いが分かりにくい場合はOVOが有効であると分かった。