バイナリ分類子の予測に libSVM python ラッパーを使用していますが、「predict」メソッドと「predict_proba」メソッドから異なる結果が得られる場合があることに気付きました。「predict_proba」で返された行列から予測クラスを取得するには、各インスタンスに次のコードを使用します。
return 0 if probs[0]>0.5 else 1
たとえば、あるインスタンスでは、'predict_proba' が [[ 0.49179164, 0.50820836]] を返し、'predict' メソッドは例外として 1 を返しました。しかし、別のインスタンスでは、'predict' 関数は 1 を返し、'predict_proba' は [[ 0.50822999, 0.49177001]] を返しました。これは、予測されたクラスが 1 ではなく 0 であることを意味します。分離超平面からの距離を返す 'decision_function' メソッド。正の場合、クラスは 1 で、それ以外の場合は 0 です。'decision_function' は 0.024 を返しました。これは、'predict' メソッドが返したクラスが実際に 1 であることを意味します。これは、'predict_proba' メソッドにバグがあることを意味します。確率を計算するために、次のコードを使用しました。
dist = classifier.decision_function(instance)
class1_prob = np.exp(dist)/(np.exp(dist)+np.exp(-dist))
probs = [[1-class1_prob, class1_prob]]
最も反抗的なバグがあり、それが libSVM ライブラリにあるのか、それとも python ラッパーにあるのか疑問に思います。私の直感では、この疑わしい動作は、分離する超平面に近すぎるインスタンスによるものであることがわかります。