Разбор кейсов на платформе SMILE
Решение задачи предсказания заболеваемости диабетом
Контекст задачи
Данный пример рассказывает о решении задачи предсказания заболеваемости диабетом среди представителей Индийского племени Пима, на основе 8 медицинских показателей (предикторов). Задача представляет собой бинарную классификацию, так как можно разделить конечный целевой столбец на два класса "Болен" и "Здоров".
Загрузим на компьютер исходный датасет Pima Indians Diabetes, который был размещен на портале для проведения соревнований по исследованию данных.
Загрузка датасета в рабочее пространство
В начале работы необходимо создать Проект, в котором будут проводиться исследования и Модуль внутри него.
Подробнее о создании Проектов и Модулей
После создания Модуля внутри Проекта, откроем его, чтобы перейти в рабочее пространство платформы SMILE. Для загрузки на платформу предверительно подготовленного датасета, необходимо перейти во вкладку "Данные" рабочего пространства.
Подробнее о загрузке данных для построения графа
Затем, после добавления файла на платформу, нужно убедиться, что возле файла стоит отметка "Выбрано"
Наличие отметки "Выбрано" говорит о том, что датасет может быть использован в рамках данного Модуля и Проекта. По умолчанию каждый новый загруженный датасет считается выбранным.
Загруженные данные можно просмотреть во вкладке "Данные" в виде таблицы.
Анализ данных в редакторе платформы SMILE
После добавления данных в Модуле можно перейти к построению графа для решения данной задачи. Нажмем на кнопку "Новый узел" и затем выберем место на графе, куда добавить узел. По умолчанию редактор добавляет узел типа "Признак", который используется для работы с данными.
Нажмем на добавленный узел, чтобы настроить используемые данные. В поле "Признаки" в выпадающем списке будут отображаться столбцы исходного датасета, которые необходимо добавить для проведения дальнейшего исследованияи и нажать на кнопку "Сохранить".
После этого, в панели управления узлом нажмем на кнопку "Данные". Внизу под Редактором появится подробное отображение данных в виде таблицы исходных данных и "Описания таблицы".
Описание таблицы содержит следующую информацию: * Общее количество признаков * Количество уникальных значений для каждого признака * Среднее значение для каждого из признаков * Стандартное отклонение для каждого из признаков * Минимальное и максимальное значения каждого признака * Количество отсутствующих значений типа NaN (Not a Number) для каждого из признаков
После анализа данных в табличном виде, можно рассмотреть график, для этого в модальном окне нужно включить переключатель "График".
В типе графика выберем "Box Plot" ("ящик с усами") для компактного отображения распределения данных. Такой вид графика позволяет рассмотреть медиану, верхний и нижний квартили, минимальное и максимальное значения выборки, а также выбросы.
График типа "Box Plot" строится для каждого из признаков, на основе выбранных в поле "Columns".
В результате подобного отображения данных можно заметить, что некоторые физиологические показатели обладают некорректным значением, например, диастолическое давление, как и индекс массы тела вряд ли могут быть равны нулю.
Исходя из этого, можем предположить, что часть значений в процессе формирования датасета не были зафиксированы или были утрачены, а как следствие были заменены на ноль.
Предварительная обработка данных
Попробуем заменить все не физиологичные нулевые значения на тип NaN и сравним их количество по каждому из столбцов с исходным. Для этого добавим узел "Модели" DataFrameReplace и подадим на него данные из узла "Признака" с помощью ребра.
Подробнее о добавлении узлов "Модели" и использовании Ребер
После создания узла DataFrameReplace и передачи на него данных необходимо в расширенных настройках указать признаки (столбцы) для которых необходимо произвести замену. После этого необходимо запустить узел с помощью соответствующей кнопки в боковой панели управления.
После расчета, в данном узле отобразиться обновленный датасет, в описании которого мы сможем увидеть количество NaN значений для каждого из признаков. Можем отметить, что наибольшее количество таких значений будет у инсулина.
Для дальнейшей обработки данных необходимо с помощью ребра передать данные из модели DataFrameReplace в новый узел "Признак"
Для решения проблемы отсутствующих значений существует несколько способов, например удаление строк с пустыми значениями, заполнение пропусков средним, медианой или константным значением.
Подробнее о предварительной обработке отсутствующих значений
Для данного датасета воспользуемся моделью, которая заменяет отсутствующие значения средним из ближайших значений соседей (n_neighbours), найденных в обучающем наборе.
Для этого добавим на граф узел "Модели" KNNImputer и направим на него данные, которые были отправлены в новый узел "Признак" из предыдущей модели.
После выполнения расчета, необходимо будет аналогичным способом добавить узел "Признак", в который в данном случае с помощью ребра будут подаваться признаки с пометкой "transformed", а не изначальные признаки.
Для фильтрации передаваемых из модели признаков необходимо нажать на ребро и в панели управления справа выбрать нужные столбцы.
После замены значений воспользуемся моделью LocalOutlierFactor, которая позволит избавиться от выбросов, ввиду отсутствия референсных значений предикторов.
Для этого добавим на граф узел "Модели" LocalOutlierFactor и направим на него данные, которые были отправлены в новый узел "Признак" из предыдущей модели.
После завершения предварительной обработки данных, направим из узла LocalOutlierFactor данные на новый узел "Признак" для дальнейшего обучения алгоритмов.
Машинное обучение
В начале разделим исходную выборку данных на тренировочную и тестовую подвыборки.
Для этого воспользуемся узлом модели "TrainAndTest" и направим на него данные из "Признака" с предобработанными данными. Далее нужно будет передать данные в новые узлы "Признаков" разделяя с помощью фильтра в ребре на признаки тренировочной подвыборки (с пометкой train) и тестовой подвыборки (с пометкой test).
Подробнее о разделении выборки на тренировочную и тестовую
Для решения данной задачи попробуем применить модель "RandomForestClassifier", которая обладает высокой степенью интерпретируемости, что важно в такой отрасли, как медицина.
Для избежания переобучения модели "RandomForest" и получения максимально валидной оценки добавим алгоритм кросс-валидации "CrossValScore".
Подробнее о кросс-валдиации
После добавления узла "CrossValScore" подадим на него данные из "Признака" с тренировочными данными, а от узла кросс-валидации добавим ребро к тестовой подвыборке.
Добавим узел модели "RandomForestClassifier", в расширенных настройках которого ограничим максимальную длину дерева в параметре "max_depth".
Далее к узлу "CrossValScore" добавим ребро от узла "RandomForestClassifier", а к узлу тестовой подвыборки добавим блок оценки моделей классификации "ClassificationScorer".
В узле модели "CrossValScore" будет также отображаться оценка модели, но она будет основана на тренировочной подвыборке
В качестве альтернативного решения попробуем получить решающее правило с помощью модели "DecisionTreeClassifier". Добавим узел с данной моделью на граф, а также продублируем два новых узла "Признака" с тренировочной и тестовой подвыборками.
На узел модели DecisionTreeClassifier подадим данные из нового узла "Признак" с тестовой выборкой и добавим огранчиение на длину дерева в параметре "max_depth" после чего запустим узел.
После расчета, в модальном окне, рассмотрим график типа "Graph Visualizer". Данный тип графика наглядно показывает влияние признаков на результат предсказания (чем выше признак, тем большее влияние он оказывает на конечный результат).