Введение

Машинное обучение (МО) широко используется в сфере здравоохранения в качестве инструмента диагностики. Среди нескольких доступных вариантов использования алгоритмы «обнаружения рака» очень популярны по нескольким причинам. Во-первых, это важность рака как болезни, а во-вторых, количество связанных с раком исследовательских проектов и средств диагностики. К этому можно также добавить новые инновации анализа изображений в ML, которые позволили точно проанализировать медицинское изображение и пометить некоторые опухоли как доброкачественные или злокачественные. В то время как такие модели имеют большое значение, потому что они просто могут спасти жизнь, часто мало внимания уделяется их ограничениям. Такие модели, хотя и являются очень предсказуемыми и мощными, не предлагают никакой объяснимости и анализа причинно-следственных связей. Кроме того, в ответственном ИИ часто недостаточно работы для анализа ошибок. В этой статье делается попытка выделить несколько простых подходов и лучших практик, когда речь идет о построении прогностической модели для обнаружения рака молочной железы, а также предоставить некоторые пояснительные инструменты для дальнейшего изучения процесса принятия решений модели ML.

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

Спасение жизни пациента является важнейшей задачей системы здравоохранения. Рак, среди прочих заболеваний, имеет более высокую смертность, его очень трудно выявить на ранних стадиях заболевания, а также является гетерогенным заболеванием. Машинное обучение предлагает решение этой проблемы. Вообще говоря, для прогнозирования рака используются три основных типа данных. В зависимости от типа рака и наличия данных для обнаружения рака можно использовать медицинские изображения, последовательности ДНК и табличные данные. Большинство недавних достижений в области машинного обучения используют один из этих типов данных в качестве входных данных для обучения модели, в то время как в некоторых более поздних исследованиях различные типы входных данных были объединены в поисках лучшей производительности в том, что часто называют мультимодальным обучением.

Я наблюдал модели в системе здравоохранения, которые не обязательно следуют передовым методам разработки моделей и часто полностью лишены какой-либо объяснительной силы. Итак, в этой работе я решил выбрать общедоступный набор данных о пациентах с раком молочной железы, который доступен в библиотеке sklearn Python. Цель состоит не в том, чтобы использовать большой набор данных, идеально подходящих для обнаружения рака, а в том, чтобы предложить «общие» решения, которые могут помочь построить лучшие модели. Я уверен, что выполнение этих простых фундаментальных шагов укрепит позиции машинного обучения, где одной из основных целей считается ответственное, продуманное и объяснимое моделирование.

Подготовка данных

Набор данных включает 569 наблюдений, а также 31 столбец. Целевой столбец идентифицируется с тем же именем, «цель». Данные включают 30 признаков, в основном описывающих физические свойства опухоли-мишени с точки зрения размера, текстуры, площади и т. д., как показано ниже:

Целевые значения сбалансированы примерно с 63% наблюдений класса 1 (злокачественные) и 37% наблюдений класса 0 (доброкачественные). Выбранные данные очень чистые и не требуют большой обработки. Однако представляется необходимым решить две задачи. Глядя на распределение признаков, кажется, что большинство из них либо асимметричны, либо сильно асимметричны.

Такие распределения часто усложняют процесс обучения, особенно если в выбранном алгоритме используется какая-либо версия оптимизаторов, например градиентный спуск, или линейный ученик. В таких случаях процесс обучения идет медленнее и имеет больше шансов застрять в каком-то локальном минимуме. Очень распространенным подходом к решению этой проблемы является «преобразование журнала». Таким образом, можно преобразовать все или некоторые искаженные объекты. Результирующее распределение часто больше похоже на распределение Гаусса, которое является идеальным распределением для подгонки. Перед применением преобразования журнала необходимо обратить внимание на функции, которые охватывают 0 или отрицательные значения, чтобы избежать получения значений -inf. После преобразования «средняя вогнутость» выглядит так:

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

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

Разработка модели

Шаг моделирования включает в себя выбор правильного алгоритма, а затем настройку гиперпараметров. На сегодняшний день существует множество алгоритмов классификатора, и всегда рекомендуется «попробовать» разные. В то же время, в зависимости от размера набора данных и сложности алгоритма, может быть невозможно попробовать слишком много алгоритмов. Я рекомендую включить в пробы и ошибки некоторые из «основных» известных алгоритмов разной сложности. К ним относятся логистическая регрессия и наивный байесовский анализ, модели на основе дерева и вплоть до глубоких нейронных сетей.

Хотелось бы, чтобы с самого начала было ясно, какой алгоритм превзойдет другие. Но, к сожалению, невозможно найти общее решение для всех наборов данных. Тем не менее, есть некоторые в целом верные тенденции, которые можно ожидать после работы с данными через некоторое время. Как правило, такие алгоритмы, как Naïve Bays, часто бывают слишком упрощенными. Модели глубокого обучения часто работают лучше, но не тогда, когда нет большого объема данных. Вопреки распространенному мнению, модели глубокого обучения часто даже не обеспечивают значительно более высокой производительности по сравнению с такими алгоритмами, как XGBoost, когда потребляемые данные представлены в табличном формате. Они просто более ресурсоемкие. Вместо этого модели глубокого обучения работают значительно лучше, когда входными данными являются изображения, текст, последовательность или голос. По этим причинам среди выбранных алгоритмов я не выбрал глубокое обучение. Здесь я выбираю «DecisionTreeClassifier», «RandomForestClassifier», «LGBMClassifier» и «XGBClassifier».

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

Еще одним важным шагом, которым часто пренебрегают, является включение перекрестной проверки K-кратности для оценки производительности каждой модели. Очень типично запускать каждый алгоритм от 5 до 10 раз с разными наборами обучающих и проверочных наборов. Это учитывает всю изменчивость данных и гарантирует, что сообщаемая производительность не определяется неравномерным распределением данных между обучающими и проверочными наборами. Очень часто устанавливается k = 10 для выполнения перекрестной проверки. Однако для больших наборов данных это означает, что каждый алгоритм нужно запускать 10 раз, что может занять много времени. Для таких случаев предлагаются два решения: во-первых, можно безопасно пропустить этот шаг, если набор данных достаточно велик и правильно рандомизирован. Во-вторых, можно рандомизировать данные и нарезать только небольшую часть данных для выполнения перекрестной проверки в K-кратном размере.

На приведенном ниже графике показана производительность (точность) каждого из четырех упомянутых алгоритмов. Средняя производительность модели XGBoost выше, чем у других алгоритмов, хотя она широко распространена.

Для этого обсуждения я выбираю XGBoost в качестве классификатора, чтобы также выделить несколько других важных тем. Следующим шагом обычно является оптимизация гиперпараметров. XGBoost имеет много гиперпараметров, которые можно оптимизировать, но это приведет к очень трудоемким вычислениям. Вместо этого можно сосредоточиться только на самых важных:

n_оценщиков = [100, 125]

максимальная_глубина = [6, 8]

подвыборка = [0,4, 0,5, 0,6]

colsample_bytree = [0,8, 0,9, 1,0]

colsample_bylevel = [0,4, 0,5, 0,6]

гамма = [0,05, 0,1, 0,15]

скорость_обучения = [0,25, 0,30, 0,35]

Выбранный диапазон для каждого гиперпараметра широко применяется в других местах. Полный набор гиперпараметров XGBoost и их типичные диапазоны см. в документации XGBoost. Я использовал класс GridSearchCV из sklearn для выполнения комбинации перекрестной проверки K-fold и поиска по гиперпараметрам. Другой популярный класс — RandomizedSearchCV. Сочетание вышеуказанных гиперпараметров и 10-кратной перекрестной проверки дает 9720 совпадений с классификатором XGBoost. Таким образом, если кто-то хочет просканировать большой диапазон для каждого гиперпараметра, это может занять много времени. Хитрость в том, что, по моему опыту, эти гиперпараметры часто ведут себя «почти» независимо. Это означает, что можно сканировать каждый гиперпараметр, скажем, с 10 различными значениями, находить лучшее значение для каждого, а затем объединять их все вместе и сканировать только уже оптимизированное значение для каждого гиперпараметра. Это быстрее и обычно одинаково хорошо.

Наилучшие параметры можно получить из атрибута best_params_ соответствующего поиска в экземпляре класса GridSearchCV. Лучший результат также можно извлечь из атрибута best_score_.

{'colsample_bylevel': 0,6,

«colsample_bytree»: 0,8,

«гамма»: 0,1,

«скорость обучения»: 0,35,

«макс_глубина»: 6,

«n_оценщиков»: 100,

«подвыборка»: 0,5}

Затем вышеуказанные параметры передаются в новый экземпляр XGBClasifer, и модель обучается как на обучающих, так и на проверочных наборах данных. Рекомендуется запустить выбор модели, а также этапы оптимизации гиперпараметров, используя «все данные», но выполнить разделение обучения и тестирования для точной настройки лучшей модели. XGBoost очень склонен к переоснащению, и чтобы избежать этого, необходимо либо использовать регуляризацию L1 или L2, либо использовать раннюю остановку. Я выбрал раннюю остановку, чтобы остановить процесс обучения, как только показатели производительности проверки перестанут увеличиваться после добавления 15 последовательных деревьев.

Распространенной ошибкой является использование на этом этапе обученного объекта модели. Следует отметить, что последняя обновленная модель не обязательно является лучшей и может быть моделью переобучения. Вместо использования экземпляра обученной модели нужно использовать «model.best_score», «model.best_iteration», «model.best_ntree_limit», чтобы получить лучший результат, найти лучшую эпоху и найти лучшее количество деревьев.

Следующим часто игнорируемым шагом является определение порога. Проще говоря, нет причин принимать значение по умолчанию 0,5 в качестве порога принятия решения. В зависимости от бизнес-цели модели необходимо оптимизировать порог принятия решения, чтобы получить наилучшую возможную метрику. Текущая настройка обеспечивает наилучшую точность, когда порог принятия решения имеет значение по умолчанию, равное 0,5. Но точность не всегда является желаемой метрикой. Давайте рассмотрим TPR на уровне 1% FPR в качестве желаемой бизнес-метрики (хотя это может показаться странным, но это очень распространено). В этом случае нужно просмотреть все возможные пороговые значения (от 0 до 1) и на каждом шаге вычислить TPR и FPR. Наилучшее пороговое значение — это когда FPR составляет 1% или очень близко к нему, и тогда можно сообщить о соответствующем TPR.

Анализ ошибок по значениям Шепли

Значения Шепли — отличный инструмент для изучения поведения модели. Они представляют собой средний ожидаемый предельный вклад одного признака после рассмотрения всех возможных комбинаций. Это дорогостоящие значения, связанные с каждым прогнозом моделей, которые определяют величину эффекта каждой функции в процессе принятия решений. Однако очень распространено заблуждение, что они «включают» ту же информацию, что и важность функции перестановки. Хотя это очень полезно, необходимо отметить, что важность функции или любая другая концепция, основанная на значениях Шепли, зависит от модели. Речь идет не о том, как данные, а о том, как модель использует данные. Тем не менее, они все же очень ценны, так как нужно выяснить, почему делается то или иное предсказание. Почему одну опухоль модель помечает как злокачественную, а другую — как доброкачественную. Ценности Шепли предлагают интерпретацию на двух уровнях: глобальном и локальном. Глобальность означает, что можно узнать, какие функции более важны при принятии решений по модели. Кроме того, можно увидеть, как разные значения признака играют роль в том, что опухоль может быть помечена как доброкачественная или злокачественная.

Сводные графики Shap охватывают все заданные строки набора данных и показывают среднее ожидаемое поведение каждой функции. Верхняя функция является наиболее важной, а нижняя — наименее важной. Ось X представляет величину влияния функции на модель. Отрицательное значение подталкивает прогнозы модели к 0, а положительное значение означает, что оно подталкивает прогнозы модели к 1. Цветовой код по умолчанию также очень интересен. Синий цвет представляет меньшие значения для данной функции, а красный — более высокие значения. Например, можно упомянуть, что малые значения «наихудшего радиуса», который является наиболее важным признаком этой модели, благоприятствуют злокачественной опухоли, а большие значения этого признака благоприятствуют доброкачественной опухоли. Этот уровень детализации важности признаков отсутствует в других методах и очень полезен для интерпретации модели. Кроме того, можно утверждать, что есть много случаев, когда малые значения «наихудшего радиуса» приводили к обнаружению рака, в то время как более высокие значения этого признака приводили к доброкачественной опухоли.

Но как это связано с анализом ошибок? Для задачи бинарной классификации, подобной этой, возможны четыре сценария прогнозирования: TP, FP, TN и FN. Для каждого из этих сценариев можно построить четыре набора данных. Например, набор данных FP содержит наблюдения, в которых модель предсказывала рак, но опухоль была доброкачественной. Что, если построить сводную диаграмму для этого набора данных? Что, если построить сводную диаграмму для ТП? Потенциально можно узнать, какие функции и какие значения этих конкретных функций помогают модели делать правильный прогноз или подталкивают модель к ошибкам.

Давайте предположим, что кто-то запускает важность функции, как это реализовано в алгоритме XGBoost. Это покажет, что функция «А» является наиболее важной, поскольку ее влияние является наибольшим при определении выходных данных модели. Но обязательно ли это означает, что это положительный вклад? Некоторые функции могут вносить больший вклад в неправильные прогнозы, чем в правильные прогнозы, и их влияние все равно может быть большим. Сводные сюжеты могут очень легко изобразить это. Тогда порядок действий будет таким: что, если я уберу эту функцию и создам другую модель? Другой распространенный сценарий — это когда чрезвычайно высокие или низкие значения признака в значительной степени способствуют неправильному прогнозу. Можно выполнить определенное преобразование данных, чтобы уменьшить диапазон разброса признаков и «приблизить точки данных» друг к другу, чтобы экстремальные эффекты таких значений были менее очевидными. Это также способствует снижению частоты ошибок.

Помимо глобальной интерпретации, значения Шепли также дают представление об индивидуальных прогнозах с помощью графиков силы. Результатом выполнения force_plot для определенного наблюдения будет график, подобный приведенному ниже:

Это краткое изложение влияния различных функций на один прогноз. Это пример случая TP, и можно утверждать, что это рак, потому что есть три основных признака, указывающих на рак: наихудший периметр, наихудшие вогнутые точки и наихудший радиус. Ширина каждой секции на силовом графике соответствует важности этой конкретной функции, которая заставляет прогнозы равняться 1 (красный цвет) или 0 (синий цвет). После этого момента, если кто-то спросит, почему определенное наблюдение считается доброкачественным или злокачественным, мы получим несколько убедительных объяснений.

Я хотел бы еще раз подчеркнуть распространенное неверное толкование вышеприведенного сценария. Нужно быть очень осторожным, поскольку приведенный выше анализ не означает, что наихудшие значения периметра около 0,4 являются сильными признаками рака. Они ТОЛЬКО означают, что являются признаками рака для этой модели. Это большая разница. Пожалуйста, используйте Ценности Шепли ответственно.

Анализ ошибок и ответственный ИИ

Ответственный ИИ — это новая интересная область в мире ИИ. Он предоставляет множество интересных тем и функций и помогает ML стать более ответственным инструментом. Microsoft raiwidgets — пример такого замечательного инструмента. Он предоставляет HTML-файл flask, который можно загрузить на ваш локальный компьютер, и вы можете поиграть с его многочисленными функциями, чтобы понять, случаются ли ошибки прогнозирования модели чаще для определенных типов наблюдений или нет. Например, модель может делать более неверные прогнозы для пожилых людей, поскольку, возможно, они обладают другими свойствами медицинского изображения. Если такую ​​взаимосвязь можно обнаружить, то будет намного проще работать над уточнением модели, чтобы получить лучшую производительность модели. Инструмент предлагает несколько замечательных возможностей для дальнейшего объяснения и интерпретации данных, которые выходят за рамки этой статьи, и я хотел бы направить вас на веб-сайт https://github.com/microsoft/responsible-ai-toolbox. больше информации об этом. Чтобы точно следовать шагам, которые я объясняю здесь, я рекомендую изучить https://github.com/microsoft/responsible-ai-toolbox/tree/main/notebooks/individual-dashboards/erroranalysis-dashboard о том, как построить информационная панель для анализа ошибок. Создание класса ErrorAnalysisDashboard откроет интерактивную среду на вашем локальном компьютере, где вы сможете узнать, почему ваша модель допускает определенные ошибки. Первым шагом является идентификация ошибок в двух режимах. Одним из них является режим карты дерева, который группирует данные в интересные, но интерпретируемые подгруппы с разной частотой ошибок. Это интерактивный инструмент, поэтому, нажимая на разные части, можно получить разную информацию.

Приведенный выше объяснитель дерева предоставляет информацию о том, как ошибки распределяются между различными подгруппами в наборе данных. Таким образом, можно легко определить, какие когорты в наборе данных демонстрируют большинство или наименьшее количество ошибок. «Список функций» в правом верхнем углу дает вам сводку о том, какие функции являются сильными индикаторами ошибок в модели. В этом случае «средние вогнутые точки» являются наиболее важным признаком, влияющим на ошибки. Интересно, что можно удалить некоторые функции из списка функций и повторно обучить дерево, чтобы увидеть влияние удаления функции на распределение ошибок.

Режим тепловой карты также очень полезен. Он позволяет выбрать один или два признака и изучить распределение ошибок между ними. Выбор одной функции покажет, связаны ли низкие, средние или высокие значения этой функции с большим количеством ошибок или нет, например, в приведенном ниже примере средние значения функции «средний радиус» связаны с большим количеством ошибок.

Выбор второй функции позволяет сравнить две функции вместе:

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

Вкладка глобального объяснения также предлагает интересную информацию. Он может отображать важность признаков для разных когорт в данных. Локальное объяснение может также сосредотачиваться на каждой когорте за раз и выбирать конкретное наблюдение, изучая его, чтобы увидеть, какие особенности положительно или отрицательно повлияли на определенное решение. Однако наиболее интересной функцией является набор инструментов «что, если». Можно удобно выбрать конкретный прогноз, который может принадлежать к определенному классу прогнозов, такому как FP или TP, и начать изменять значения, связанные с этим конкретным наблюдением, чтобы лучше понять, как изменение состояния пациента может напрямую повлиять на прогнозы модели.

Заключение

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

1. Старайтесь делать с вашими данными столько же, сколько EDA: никогда не недооценивайте силу преобразования распределения признаков.

2- Начните с нескольких известных алгоритмов и выберите один или два лучших.

3- Используйте K-кратную перекрестную проверку.

4. Выполните оптимизацию гиперпараметров для одного или двух наиболее эффективных алгоритмов.

5- Для шагов 3 и 4 используйте весь набор данных, разбиение тестов на поезд не требуется.

6- Включите меры, чтобы избежать чрезмерной подгонки. В зависимости от алгоритма вы можете использовать регуляризацию L1/L2 или раннюю остановку.

7- Определите пользовательскую функцию потерь и пользовательские показатели в соответствии с бизнес-целью. Не придерживайтесь только точности или аккуратности.

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

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

10. Область объяснимого/ответственного ОД очень молода по сравнению с ОД. Эта область часто не рассматривается и не обсуждается в достаточной степени для тех, кто изучает машинное обучение. Потратьте некоторое время на изучение новых инструментов. Я лично рекомендую Shapley Values, Lime (здесь не обсуждается) и raiwidgets как очень хорошие отправные точки.

11- Всегда имейте в виду, что информация, которую вы получаете на шаге 10, касается МОДЕЛИ, а не ДАННЫХ.

12- Найдите свой путь к каузальному ОД. Это будет темой другой статьи, но было бы замечательно, если бы конкретно в контексте здравоохранения можно было перейти от ассоциаций к причинно-следственным связям.