libSVMで "Model supports probability estimates, but disabled in predicton." という警告が出る

libSVMpythonモジュールで確率付き多値分類したときに詰まった話。
予測の時に各ラベルの確率が欲しい場合、オプション"-b 1"を指定すれば良いとあったので、svm_problemのところに"-b 1"を加えた。

import svm
import svmutil

train_data = [[1,0,1], [-1,0,-1]]
train_labels = [1,-1]
prob = svm.svm_problem(train_labels, train_data)
param = svm.svm_parameter("-t 0 -b 1")
model = svmutil.svm_train(prob, param)

test_data = [[1,1,1], [0,0,1]]
test_labels = [-1,1]
p_labels, p_acc, p_vals = svmutil.svm_predict(test_labels, test_data, model)
print p_labels, p_acc, p_vals

実行結果は次の通り。

Model supports probability estimates, but disabled in predicton.
Accuracy = 50% (1/2) (classification)
[1.0, 1.0] (50.0, 2.0, nan) [[1.0], [0.5]]

出力は全然確率表記じゃないし、警告も出てる。


これは、モデルを作るときだけでなく、予測するときにも"-b 1"が必要ということらしく、svm_predictの4番目の引数(option)にもこれを追加。

p_labels, p_acc, p_vals = svmutil.svm_predict(test_labels, test_data, model, "-b 1")

結果は次の通り。

Accuracy = 50% (1/2) (classification)
[-1.0, -1.0] (50.0, 2.0, nan) [[0.33333332048410247, 0.6666666795158979], [0.413733107826529, 0.586266892173471]]

無事、各ラベルの確率が出てますね。


ちなみにこれをやるときは、訓練の時にラベルをソートして与える必要があるので注意。