У меня есть фрейм данных, который содержит dtypes как категориальный, плавающий, int.
X - содержит функции всех трех заданных dtypes, а y - int.
Я создал трубопровод, как указано ниже.
get_imputer():
imputing function
get_encoder():
some encoder function
#model
pipeline = Pipeline(steps=[
('imputer', get_imputer()),
('encoder', get_encoder()),
('regressor', RandomForestRegressor())
])
Мне нужно было найти важность перестановки модели. ниже приведен код для этого.
import eli5
from eli5.sklearn import PermutationImportance
perm = PermutationImportance(pipeline.steps[2][1], random_state=1).fit(X, y)
eli5.show_weights(perm)
Но этот код выдает ошибку следующим образом:
ValueError: could not convert string to float: ''
Применим ли PermutationImportance только к числовым функциям?
Я не уверен в этом. я просто объяснил что за ошибка означает
Давайте вкратце разберемся с работой PermutationImportance.
После того, как вы обучили свою модель всем функциям, PermutationImportance перемешивает значения столбцов и проверяет влияние на функцию потерь.
Например.
Есть 5 функций (столбцов) и n строк:
f1 f2 f3 f4 f5
v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 . . . вт . . . .
Теперь, чтобы определить, важен столбец f3 или нет, он перемешивает значения в столбце f3. Например. Значение f3 в строке x заменяется значением f3 в строке y, затем проверяется влияние на функцию потерь. И, следовательно, определяет важность функции в модели.
Теперь, чтобы ответить на этот конкретный вопрос, я бы сказал, что любая модель обучается, когда все функции являются числовыми (поскольку модель ML не понимает текст напрямую). Итак, в вашем аргументе PermutionImportance вам нужно предоставить столбцы, которые являются числами. Поскольку вы обучили модель после преобразования категориальных/текстовых элементов в числа, вам необходимо применить ту же стратегию преобразования к новым входным данным.
Следовательно, PermuationImportance следует использовать только тогда, когда ваши данные предварительно обработаны, а ваш фрейм данных имеет все числовые значения.
Для следующей бедняжки...
Я наткнулся на этот пост, имея ту же проблему. Хотя принятый ответ имеет общий смысл - дело в том, что в конвейере ОП кажется, что он обрабатывает категориальные данные с помощью кодировщиков, которые преобразуют их в числовые.
Итак, похоже, что PermutationImportance слишком рано проверяет массив на наличие числовых значений (до того, как конвейер полностью). Вместо этого он должен проверять после шагов предварительной обработки и непосредственно перед подгонкой модели. Это расстраивает, потому что, если он не работает с конвейерами, его трудно использовать.
Я начал с некоторой удачи, используя вместо этого реализацию permutation_importance sklearn
... Но потом я понял это.
Вам нужно снова отделить конвейер, и вы сможете заставить его работать. Это раздражает, но это работает!
import eli5
from eli5.sklearn import PermutationImportance
estimator = pipeline.named_steps['regressor']
# I didnt have multiple steps when I did it, but maybe this is right?
preprocessor = pipeline.named_steps['imputer']['encoder']
X2 = preprocessor.transform(X)
perm = PermutationImportance(estimator, random_state=1).fit(X2.toarray(), y)
eli5.show_weights(perm)
сама ошибка говорит, что ожидаемый ввод
float
, но вы передаете строку альфа-ромеро.. убедитесь, что тип данных правильный..