Вопрос или проблема
exp = explainer.explain_instance(df_val_final.Description[idx],predproba_list,num_features=5, top_labels=2)
При выполнении объяснения экземпляра LimeTextExplainer, указанное выше выражение продолжает выполняться непрерывно с предупреждающим сообщением ниже. Выполнение останавливается только если я прерываю ядро
C:\ProgramData\Anaconda3\lib\site-packages\fastai\torch_core.py:83: UserWarning: Tensor is int32: upgrading to int64; for better performance use int64 input
warn('Tensor is int32: upgrading to int64; for better performance use int64 input')
C:\ProgramData\Anaconda3\lib\site-packages\fastai\torch_core.py:83: UserWarning: Tensor is int32: upgrading to int64; for better performance use int64 input
warn('Tensor is int32: upgrading to int64; for better performance use int64 input')
C:\ProgramData\Anaconda3\lib\site-packages\fastai\torch_core.py:83: UserWarning: Tensor is int32: upgrading to int64; for better performance use int64 input
warn('Tensor is int32: upgrading to int64; for better performance use int64 input')
Я хочу использовать свою собственную модель классификатора, поэтому я написал функцию классификатора – predproba_list, которая возвращает numpy массив предсказанных вероятностей для классов Ниже представлен код функции
def predproba_list(test1) :
pred = learn_clf.predict(test1)
return np.array(pred[2])
Значение pred[2] — это tensor([0.1423, 0.2133, 0.6444]), которое я затем преобразую в numpy массив
Не могли бы вы посоветовать, соответствует ли возвращаемое значение функции ожидаемому для функции классификатора explain instance, и что может вызывать то, что код продолжает выполняться без результатов?
Я также сталкиваюсь с проблемами с LimeTextExplainer и наткнулся на ваш вопрос. Возвращаемое значение вашей predproba_list
должно быть массивом массивов чисел с плавающей точкой. Например:
predproba_list('a')
возвращает:
array([[0.07965168, 0.07578776, 0.2927914 , 0.06609259, 0.03115178]])
Надеюсь, это поможет.
Ответ или решение
Ваша проблема с LimeTextExplainer связана с интеграцией пользовательской функции классификатора для много-классовой классификации. В данном случае, когда вы пытаетесь объяснить экземпляр при помощи метода explain_instance
, выполнение продолжается безрезультатно, что может быть связано с рядом факторов, включая неправильно сформатированный вывод вашей функции классификатора.
Теория
LimeTextExplainer — это инструмент для интерпретации моделей машинного обучения, который помогает понять, какие характеристики входных данных влияют на результаты классификации. Для работы Lime требует, чтобы пользовательская функция классификатора возвращала предсказания в определенном формате, то есть массив вероятностей для каждого класса.
Проблемы с возвратом данных: В вашем случае, если функция возвращает данные в неправильной форме, объяснение невозможно, и это может привести к зацикливанию кода. Очень важно, чтобы возвращаемые данные были правильно структурированы. По умолчанию, predproba_list
должна возвращать двумерный массив, где каждая строка представляет собой вероятности принадлежности входного текста каждому классу.
Пример
Ваш код функции predproba_list
выглядит следующим образом:
def predproba_list(test1):
pred = learn_clf.predict(test1)
return np.array(pred[2])
На первый взгляд, функция возвращает одномерный массив numpy, полученный из tensor, что может быть не тем, что ожидает Lime. Lime предполагает, что вы передаете вход в виде одного или нескольких текстов, и получает массив массивов вероятностей как на выходе.
Текущая структура вывода:
array([0.1423, 0.2133, 0.6444])
Однако Lime ожидает структуру:
Ожидаемая структура вывода:
array([[0.1423, 0.2133, 0.6444]])
Применение
Чтобы исправить ситуацию, нужно убедиться, что ваша функция возвращает данные в правильном формате. Это можно сделать, выполнив небольшие изменения в коде. Попробуйте следующее:
- Верните двумерный массив — Lime ожидает, что функции классификатора будут принимать на вход коллекцию тестовых данных и возвращать коллекцию массивов вероятностей. Даже если вы подаете на вход одно наблюдение, возвращаемую структуру данных следует оформить как массив массивов.
import numpy as np
def predproba_list(text_input):
# Извлеките вероятность классов
pred = learn_clf.predict(text_input)
# Преобразуйте в двумерный массив
return np.array(pred[2].reshape(1, -1))
- Убедитесь, что ваша функция способна принимать как один, так и несколько текстов одновременно:
def predproba_list(text_inputs):
# Генерируем вероятности для каждой строки в text_inputs
proba_list = []
for text in text_inputs:
# Получаем предсказания для каждого отдельного текста
pred = learn_clf.predict(text)
# Добавляем вероятности в общий список
proba_list.append(pred[2].numpy())
# Возвращаем как двумерный массив
return np.array(proba_list)
Заключение
После внесения этих изменений убедитесь, что все входные данные и выходные данные имеют совместимые размеры и форматы. Это должно помочь устранить проблему, вызывающую зависание программы. Если проблема сохраняется, проверьте, как ваш классификатор взаимодействует с библиотеками, такими как Torch, особенно в том, что касается типов данных (например, преобразование типов int32
в int64
), чтобы избежать дополнительных предупреждений и повысить производительность.
Управление интерпретацией моделей — сложный процесс, который требует тщательной настройки функций и форматирования данных, чтобы результаты были точными и значимыми.