libSVMで "Model supports probability estimates, but disabled in predicton." という警告が出る
libSVMのpythonモジュールで確率付き多値分類したときに詰まった話。
予測の時に各ラベルの確率が欲しい場合、オプション"-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]]
無事、各ラベルの確率が出てますね。
ちなみにこれをやるときは、訓練の時にラベルをソートして与える必要があるので注意。