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

Введение

Недавно я работал над потенциальным набором данных классификации инсульта и подумал, почему бы не указать свои данные, чтобы увидеть, какой прогноз я собираюсь получить, для забавы и, к моему смятению, меня классифицировали как человека, который является потенциальным кандидатом на инсульт.

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

В моей предыдущей статье мы обсуждали Объяснимый ИИ (XAI) и то, что он дает. Посмотрите эту статью здесь:



Сегодня мы рассмотрим один из апостериорныхметодов XAI под названием LIME, который объясняет локальные прогнозы и помогает нам понять обоснование решения, принятого нашей моделью.

LIME (объяснения, не зависящие от локальной интерпретируемой модели) -

По мере увеличения сложности наших моделей искусственного интеллекта даже профессионалам часто становится трудно сделать вывод о том, как решение было принято алгоритмом, поэтому мы называем их черным ящиком. > модели. XAI занимается интерпретируемостью и объяснимостью модели.

LIME работает путем обучения более простой, интерпретируемой модели в локальной окрестности прогноза, которая приближается сложное поведение модели черного ящика. Он генерирует объяснения, взвешивая функции, на которые интерпретируемая модель опирается при составлении прогноза, что помогает определить ключевые факторы, которые привели к решению.

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

Предположим, что это граница решения, созданная моделью черного ящика (например, случайный лес), чтобы предсказать, является ли человек потенциальным кандидатом на инсульт.

Как мы можем объяснить этому человеку,почемуу него может случиться инсульт? Основная идея LIME заключается в том, что мы приближаем локальную областьотдельных прогнозов, что может упростить их объяснение.

Здесь мы можем сказать, что прогноз был сделан, потому что значение признака 2 было достаточно мало, чтобы попасть в левую часть этой пунктирной линии, мы также можем сказать что-то о важности наших переменных, безусловно, признака 2. здесь в основном определяется наш выходной класс, и изменения в функции 1 почти не влияют.

Эта локальная аппроксимация нашей сложной модели (часто называемая суррогатной) теперь интерпретируема, и это в основном то, что делает LIME.

Набор данных об инсульте-

Давайте взглянем на набор данных об инсульте, с помощью EDA мы можем увидеть тип отношений, существующих в наборе данных:

Я очистил данные и обработал их, чтобы получить наш поезд и тестовые образцы:

def data_process(df):

  #handle missing values
  df= df.dropna()

  #dropping the id column which serves no purpose
  df.drop('id', axis=1, inplace=True)

  #print the head and shape of the data
  print(df.head())
  print(df.shape)

  #splitting the data into train and test samples
  X_train, X_test, y_train, y_test= train_test_split(df.drop('stroke', axis=1), df['stroke'], test_size=0.2, random_state=42)

  #encoding all the categorical columns
  trans= ColumnTransformer([
    ('trf1', OneHotEncoder(sparse_output=False, drop='first'),
     ['gender','ever_married', 'work_type',  'Residence_type', 'smoking_status'])], remainder='passthrough')
  X_train= trans.fit_transform(X_train)
  X_test= trans.transform(X_test)

  #oversampling
  smote= SMOTE(k_neighbors=4)

  X_train, y_train= smote.fit_resample(X_train, y_train)
  X_test, y_test= smote.fit_resample(X_test, y_test)

  #Scaling the data
  scale= StandardScaler()
  X_train= scale.fit_transform(X_train)
  X_test= scale.transform(X_test)

  return X_train, X_test, y_train, y_test

Я попробовал несколько разных моделей, но наилучший результат был получен с помощью классификатора случайного леса, поэтому я продолжил его и выполнил настройку гиперпараметров, прежде чем подгонять модель к данным:

Настройка гиперпараметров на наиболее эффективной модели:

# Define the model
rf = RandomForestClassifier()

# Define the hyperparameter grid
param_grid = {
    'n_estimators': [100, 200, 500],
    'max_depth': [3, 5, None],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'max_features': ['sqrt', 'log2', None]
}

# Define the GridSearchCV object
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, n_jobs=-1)

# Fit the GridSearchCV object to the data
grid_search.fit(X_train, y_train)

# Print the best parameters and best score
print("Best parameters: ", grid_search.best_params_)
print("Best score: ", grid_search.best_score_)

# Get the best estimator and make predictions on the test set
best_rf = grid_search.best_estimator_
y_pred = best_rf.predict(X_test)

# Print the classification report
print(classification_report(y_test, y_pred))

Предоставление модели моих входных данных и просмотр предсказанного:

my_data= np.array([[0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 26, 0, 0, 99, 33]])

scale= StandardScaler()
my_data= scale.fit_transform(my_data)

# Get the best estimator and make predictions on the test set
best_rf = grid_search.best_estimator_
y_pred_mydata = best_rf.predict(my_data)
y_pred_mydata

На данный момент неудивительно, что прогнозируемое значение было array([1]), что указывает на штрих.

ЛАЙМ:

Теперь, когда модель обучена и протестирована, начинается самое интересное. Должен ли я жить в отрицании и не признавать, что я попал в категорию инсульта, или просто использовать нашего верного маленького друга XAI, чтобы увидеть, не является ли необходимость изменений моими жизненными привычками.

Я использовал interpret библиотеку для анализа LIME, которая дает нам довольно интерактивный график, чтобы увидеть, как функция больше всего влияет на наши результаты.

cols=['gender', 'hypertension', 'heart disease', 'ever married', 'private', 'self-employed', 
      'children', 'govt job', 'Residence_type', 'never smoked', 'age', 'unknown smoke status', 'formerly smoked', 'avg_gluscose level', 'bmi']
lime= LimeTabular(model= grid_search,
                  feature_names=cols,
                  data=X_train,
                  random_state=42)

explain= lime.explain_local(my_data,
                            y_pred_mydata,
                            name='LIME')

show(explain)

Библиотека Interpret дает этот интерактивный график с выпадающим меню, в котором указаны фактическое значение, прогнозируемое значение и разница между ними.

На следующем графике четко показано, какие особенности повлияли на то, что человек НЕ был классифицирован как потенциальный кандидат на инсульт:

Понятно, что больше всего на результат повлияли такие факторы, как возраст и отсутствие сердечно-сосудистых заболеваний.

Тестирование моих данных:

Таким образом, согласно данным обучения, функция, которая больше всего влияет на мой прогноз, — это мой возраст, наряду с другими факторами, такими как частная работа, проживание в городской местности и средний уровень глюкозы и т. д.

Заключение

В заключение следует отметить, что локальные интерпретируемые объяснения, не зависящие от модели (LIME), — это мощный инструмент для понимания прогнозов сложных моделей машинного обучения.

Это позволяет нам исследовать основные факторы, влияющие на прогнозы модели на локальном уровне, что упрощает выявление потенциальных отклонений и ошибок. Благодаря удобному интерфейсу и способности работать с различными моделями машинного обучения это ценный инструмент для специалистов по данным, исследователей и компаний, стремящихся получить более глубокое понимание своих моделей.

Заключительные мысли и заключительные комментарии

Результат всего этого упражнения так же хорош, как и обучающие данные, используемые для построения модели. Я использовал данные из открытых источников без четких оснований для их точности и, по этой причине мой возраст влиял на результат больше, чем мой высокий показатель ИМТ, хотя модель работала довольно хорошо.

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

Используя LIME, мы можем повысить прозрачность, надежность и точность моделей машинного обучения, тем самым сделав ИИ более доступным и полезным для общества.

Блокнот для последовательного и подробного доступа ко всему коду: блокнот