
lab4_analysis
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Ассистент |
|
|
|
В.В. Боженко |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4 |
ПРИМЕНЕНИЕ МЕТОДОВ КЛАССИФИКАЦИИ |
по курсу: ВВЕДЕНИЕ В АНАЛИЗ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
М.О. Жовтяк |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Цель работы
Цель: изучить алгоритмы и методы классификации на практике
Вариант задания
Вариант 14. Так как преподаватель выдал только 5 вариантов, то будет выполняться 4 вариант работы.
Записи о болезнях сердца
Столбцы
1. возраст: возраст пациента (лет)
2. анемия: снижение количества эритроцитов или гемоглобина (логическое значение)
3. высокое кровяное давление: если у пациента гипертония (логическое значение)
4. креатининфосфокиназа (КФК): уровень фермента КФК в крови (мкг/л)
5. диабет: если у пациента диабет (логическое значение)
6. фракция выброса: процент крови, покидающей сердце при каждом сокращении (в процентах)
7. тромбоциты: тромбоциты в крови (килотромбоциты/ мл)
8. пол: женщина или мужчина (бинарный)
9. креатинин сыворотки: уровень креатинина сыворотки в крови (мг/дл)
10. натрий сыворотки: уровень натрия сыворотки в крови (мэкв/л)
11.курение: если пациент курит или нет (логическое)
12.время: период наблюдения (дни)
13. событие смерти: если пациент умер в течение периода наблюдения (логическое значение)
Предварительный анализ данных
Загружается датасет с помощью библиотеки pandas в Jupyter-ноутбук, использую Google Colab. Результат на рисунке 1.
Рисунок 1 – Загрузка датасета
Выполняется загрузка библиотек, настройка csv-файла. Выводятся первые 20 строк с помощью команды head(). Результат работы можно увидеть на рисунке 2.
Рисунок 2 – Вывод таблицы
Записи о болезнях сердца:
возраст: возраст пациента (лет)
анемия: снижение количества эритроцитов или гемоглобина (логическое значение)
высокое кровяное давление: если у пациента гипертония (логическое значение)
креатининфосфокиназа (КФК): уровень фермента КФК в крови (мкг/л)
диабет: если у пациента диабет (логическое значение)
фракция выброса: процент крови, покидающей сердце при каждом сокращении (в процентах)
тромбоциты: тромбоциты в крови (килотромбоциты/ мл)
пол: женщина или мужчина (бинарный)
креатинин сыворотки: уровень креатинина сыворотки в крови (мг/дл)
натрий сыворотки: уровень натрия сыворотки в крови (мэкв/л)
курение: если пациент курит или нет (логическое)
время: период наблюдения (дни)
событие смерти: если пациент умер в течение периода наблюдения (логическое значение)
С помощью команды info() оцениваются столбцы датасета. Результат на рисунке 3.
Рисунок 3 – Информация о датасете
Проанализировав данные, можно сделать следующие выводы:
Всего 299 объектов, пустых строк нет
Все столбцы имеют правильный тип данных
Все столбцы имеют правильное название
Будет выполнена проверка на явные дубликаты, проверки на неявные дубликаты не предвидится, так как нет столбцов с строковым значением
В датасете удаляются дубликаты данных с помощью команды drop_duplicates(), так как необходимы только уникальные значения. После этого выполняется обновления индексации с помощью команды drop_duplicates().reset_index(), чтобы не существовало пустых строк. После этого выполняется проверка датасета на дубликаты с помощью команды duplicated().sum(). Дубликатов, судя по рисунку 4 не было.
Рисунок 4 – Удаление дубликатов данных
В поиске неявных дубликатов, удалении пустых строк, смене названий столбцов и их типов нет никакой необходимости, поэтому предварительная обработка данных завершена.
Применение методов классификации
Целевым признаком в датасете является DEATH-EVENT. Перед разделением датасета на тестовую и обучающую выборку, целевой признак идентифицируется в одной переменной, остальные признаки в другой. Отделение целевого признака от датасета показано на рисунке 5.
Рисунок 5 – Разделение целевого признака с данными
После разделения датасета производится стандартизация данных. Это показано на рисунке 6.
Рисунок 6 – Стандартизация данных
Набор данных разделяется на обучающую и тестовую выборку. Это показано на рисунке 7.
Рисунок 7 – Разделение датасета на обучающую и тестовую выборку
Метод k-ближайших соседей
Импортируется модуль KNeighborsClassifier и метрики классификации из sklearn. Создается экземпляр класса KNeighborsClassifier. С помощью метода fit экземпляр обучается на обучающей выборке. Задается параметр n_neighbors, который высчитывается из алгоритма для определения лучшего значения по метрике "Recall". Это показано на рисунке 8-8.1.
Рисунок 8 – Расчет лучшего количества соседей для KNeighbors
Рисунок 8.1 – Создание экземпляра класса KNeighborsClassifier
С помощью метода predict модель выведет предсказания. Это показано на рисунке 9.
Рисунок 9 – Модель предсказания
Создается функция, которая высчитывает ошибку классификации, а именно метрики "Accuracy", "Precision", "Recall", "Balanced accuracy", 'F1 score'. Высчитываются метрики методом k-ближайших соседей. Результат на рисунке 10.
Рисунок 10 – Метрики k-ближайших соседей
Из полученных результатов видно, что ближе к 1 только метрики доля правильных ответов (accuracy) и полнота (recall).
Случайный лес и логистическая регрессия
Аналогично обучаются модели "случайный лес" и "логистическая регрессия", составляется их ошибка классификации. В "случайном лесе" вручную устанвливается параметр, который увеличивает "глубину дерева" по модели. Результаты метрик на рисунке 11.
Рисунок 11 – Метрики «случайного леса» и «логистической регрессии»
Лучший результат показал метод "случайный лес", так как его метрики максимально приближены к 1.
После этого строится график ROC-кривой, который позволяет сравнить эффективности всех классификаторов. Результат на рисунке 12.
Рисунок 12 – График ROC-кривой
Исходя из графика можно увидеть, что лучшим методом является метод RandomTree, потому что его прогноз ближе других приблежен к True Positive. Худшим является K-nearest.
Ссылка на Google Colab:
https://colab.research.google.com/drive/1CfmvNqd4bZtRHhxH0jMDY0P7nwgLq8Hi?usp=sharing
Вывод
В результате работы было создано три классификатора, из которых лучшее предсказание было дано методом RandomTree, у которого полнота (Recall) приближеннее равна 1, т.е. способность записывать правильно все объекты в один класс максимально.
Справедливости ради стоит сказать, что не существует идеального способа для поиска необходимой классификации, который покажет все метрики, равные единице. В данном случае необходимо подчеркнуть самую важную метрику, которая жизненно необходима в определенном контексте. В моем же случае исследования заболеваний требуют точное определение класса: болен/здоров, ведь лучше отправить человека на повторное обследование, чем пропустить болезнь, поэтому фокус должен быть на метрике Recall. Вручную подбирая параметры для каждой модели, я старался найти максимальный результат для Recall, где в итоге лучшим стал именно RandomTree, у которого качество метрик чуть лучше LogisticRegression, хотя Recall при этом равны.