LimeTextExplainer для мультклассовой классификации – Проблема с объяснением экземпляра с пользовательской функцией классификатора

Вопрос или проблема

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]])

Применение

Чтобы исправить ситуацию, нужно убедиться, что ваша функция возвращает данные в правильном формате. Это можно сделать, выполнив небольшие изменения в коде. Попробуйте следующее:

  1. Верните двумерный массив — Lime ожидает, что функции классификатора будут принимать на вход коллекцию тестовых данных и возвращать коллекцию массивов вероятностей. Даже если вы подаете на вход одно наблюдение, возвращаемую структуру данных следует оформить как массив массивов.
import numpy as np

def predproba_list(text_input):
    # Извлеките вероятность классов
    pred = learn_clf.predict(text_input)
    # Преобразуйте в двумерный массив
    return np.array(pred[2].reshape(1, -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), чтобы избежать дополнительных предупреждений и повысить производительность.

Управление интерпретацией моделей — сложный процесс, который требует тщательной настройки функций и форматирования данных, чтобы результаты были точными и значимыми.

Оцените материал
Добавить комментарий

Капча загружается...