Как вернуть вероятность top-n и связанные с ней классы?

#python #numpy #scikit-learn

#python #numpy #scikit-learn

Вопрос:

В методе sklearn predict_proba() обычно мы рассматриваем только тот, который имеет наибольшую вероятность. Как я могу вывести вероятность для верхних n классов (n> 1)?

Например, вывод из predict_proba() выглядит следующим образом, как я могу вернуть 2 наивысшие вероятности и связанные с ними классы?

 result_prob = clf.predict_proba(X_test)
  

Возврат:

 array([
   2.55420153e-02, 0.00000000e 00, 0.00000000e 00, 0.00000000e 00,
   3.41739673e-02, 0.00000000e 00, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 2.11688875e-05, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 8.02579585e-01, 0.00000000e 00,
   0.00000000e 00, 1.37978949e-02, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 1.15640553e-02, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 0.00000000e 00, 6.76391638e-02,
   9.06030431e-03, 0.00000000e 00, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 3.56218448e-02, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 0.00000000e 00])
  

В этом случае должны быть возвращены классы с вероятностью 8.02579585e-01 и 6.76391638e-02 .

Ответ №1:

На самом деле это простой вопрос; вы могли бы использовать np.argpartition :

 import numpy as np
x =np.array([
   2.55420153e-02, 0.00000000e 00, 0.00000000e 00, 0.00000000e 00,
   3.41739673e-02, 0.00000000e 00, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 2.11688875e-05, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 8.02579585e-01, 0.00000000e 00,
   0.00000000e 00, 1.37978949e-02, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 1.15640553e-02, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 0.00000000e 00, 6.76391638e-02,
   9.06030431e-03, 0.00000000e 00, 0.00000000e 00, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 3.56218448e-02, 0.00000000e 00,
   0.00000000e 00, 0.00000000e 00, 0.00000000e 00])

k = 2 # top-k
ind = np.argpartition(x, -k)[-k:]
x[ind]
  

Результат:

 array([0.06763916, 0.80257959])
  

согласно запросу, пока соответствующие классы находятся в ind :

 ind
# array([27, 14])
  

Комментарии:

1. Спасибо, тогда как я могу найти связанный класс из двух возвращаемых значений?