Как преобразовать eli5.show_weights в массив / список в python

#python #numpy #scikit-learn #permutation #logistic-regression

#python #numpy #scikit-learn #перестановка #логистическая регрессия

Вопрос:

У меня есть обученная модель, и все работает нормально. И я вычисляю важность перестановки каждого веса объекта. Я использую eli5.show_weights() , но он отображает выходные данные как html , но мне нужно, чтобы он преобразовывался в какой-то список или массив, чтобы я мог получить доступ к значениям.

вот мой пример кода, исключая estimator's часть кода, чтобы упростить его:

 import eli5
from eli5.sklearn import PermutationImportance

perm = PermutationImportance(estimator, random_state=1).fit(X_testdf, y_testdf)
eli5.show_weights(perm, feature_names = X_testdf.columns.tolist())
  

Это работает нормально, но мне нужно получить значения, выводимые eli5.show_weights(..) в массив или любую переменную, чтобы я мог получить доступ к этим значениям.

Я тоже пытался, но безуспешно

 np.array(eli5.show_weights(perm, feature_names=X.columns.tolist()))
  

Может кто-нибудь мне помочь?

Ответ №1:

Веса или значения функций хранятся в объекте permutation, так что вы можете извлечь их напрямую:

 perm.feature_importances_ 
  

Например, это может возвращать массив типа

 array([0.   , 0.008, 0.584, 0.172]) # Only the mean, not the Std.Dev.
  

Если они вам нужны вместе с именами функций, вы можете сжать имена и значения функций:

  list(zip(X_test.columns.tolist(), perm.feature_importances_))
  

Кроме того, вы также можете преобразовать отображение HTML обратно в необработанный HTML, а затем прочитать его с помощью Pandas. Пример:

 w = eli5.show_weights(perm, feature_names=feature_names)
result = pd.read_html(w.data)[0]
result
  

(пример вывода с iris набором данных)

 Weight          Feature
0.5840 ± 0.1170 petal_length
0.1720 ± 0.0697 petal_width
0.0080 ± 0.0196 sepal_width
0 ± 0.0000      sepal_length
  

Хотя обратите внимание, что Weight столбец здесь является строкой, поэтому вам придется выполнить некоторые дополнительные манипуляции.

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

1. Если это строка, как установить точность?

Ответ №2:

Я ссылаюсь на сообщение Тани и получаю список со следующим кодом.

 result = [(x[0], x[1], x[2]) for x in zip(perm_import.feature_importances_, perm_import.feature_importances_std_, X_train.columns)]
result.sort(key=lambda x: x[0], reverse=True)

print(result)