Введение в анализ данных¶
Домашнее задание 1. Простой анализ данных.¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@thetahat_ds25_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
. Если вы строите интерактивные графики, их стоит прислать в формате html. - Следите за размером файлов. Бот не может принимать файлы весом более 20 Мб. Если файл получается больше, заранее разделите его на несколько.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Решение проверяется системой ИИ-проверки
ThetaGrader. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
Важно!!! Правила заполнения ноутбука:
- Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.
- Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.
- Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены
<...>
. - В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.
- При нарушении данных правил работа может получить 0 баллов.
Перед выполнением задания посмотрите презентацию по выполнению и оформлению домашних заданий с занятия 2.
Баллы за задание:
Легкая часть (достаточно на "хор"):
- Задача 1 — 30 баллов
- Задача 2 — 90 баллов
Баллы учитываются в обязательной части курса и не влияют на оценку по факультативной части.
# Bot check
# HW_ID: fpmi_ad1
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную
Тренировочные задачи на библиотеки¶
Если вы неуверенно себя чувствуете в библиотеках numpy, pandas, matplotlib, seaborn, рекомендуем сначала
- посмотреть материалы по библиотекам на нашем сайте
- прорешать упражнения на библиотеки на странице курса
- прорешать два упражнения на numpy в системе Яндекс.Контест.
...
Число соседей в модели kNN является необучаемым параметром т.е. гиперпараметром который выставляется вручную. Как мы видели на лекции, выбор оптимального значения $k$ важен, так как слишком маленькое значение может привести к переобучению, а слишком большое — к недообучению.
Постройте график зависимости точности (accuracy_score
) предсказания kNN от значения $k$ (от 1 до 20) для обучающей и тестовой выборок.
...
❓ Вопрос ❓
Почему при $k = 1$ на тренировочной выборке метрика качества составляет 100%.
Ваш ответ: ...
Помимо числа соседей гиперпараметром модели также является метрика расстояния между объектами.
По умолчанию используется Евклидова метрика ($L_2$), согласно которой расстояние между двумя точками $x_1 =(x_{11}, …, x_{1d})$ и $x_2=(x_{21},…,x_{2n})$ в $d$-мерном пространстве определяется как: $$\rho(x_1, x_2) = \sqrt{\sum^d_{j=1}\left(x_{1j} - x_{2j}\right)^2}.$$
Иногда в kNN имеет смысл использовать другие метрики, например метрику Манхэттена ($L_1$). $$\rho(x_1, x_2) = \sum^d_{j=1} \left|x_{1j} - x_{2j}\right|.$$
Выбор одной из них зависит от особенностей задачи и данных. В частности,
метрика Манхэттена менее чувствительна к выбросам, чем евклидово расстояние, что делает её полезной для данных с сильным шумом или при наличии аномалий;
в задачах с разреженными данными (например, текстовые данные, представленные в виде векторов) метрика Манхэттена может работать лучше, чем евклидово расстояние.
Проведите аналогичный эксперимент используя в качестве гиперпараметра $L_1$-метрику (выясните сами, как ее задать). Выведите на одном графике зависимости точности (accuracy) от значения $k$ для обучающей и тестовой выборок для обоих метрик.
...
❔ Вопрос ❔
Как вы думаете почему смена метрики так сильно повлияла на характер кривых?
Ваш ответ: ...
Выводы: ...
Задача 2¶
Перед выполнением задачи рекомендуется посмотреть материал с семинара.
0. Подготовка данных¶
Титаник был крупнейшим пассажирским судном в 1912—1913 годах. Во время первого рейса затонул в северной Атлантике, столкнувшись с айсбергом в ночь с 14 на 15 апреля 1912 года, при этом погибло 1502 из 2224 пассажиров и членов экипажа. Данные о пассажирах были собраны в таблицы, которые можно скачать с Kaggle. Эти данные часто используются в качестве обучающих в анализе данных.
Загрузите данные с помощью pandas
.
titanic = pd.read_csv("train.csv").dropna()
titanic.head()
Для лучшего понимания процесса работы с данными, уточним ключевые термины.
Объект — это единица данных, представленная набором признаков и используемая для обучения или предсказаний модели. В данной задаче являются пассажиры, им соответствуют строки таблицы данных.
Признаки (features) — это характеристики, которые описывают объекты в данных. В таблицах данных они обычно соответствуют колонкам. В данной задаче мы будем работать со следующими признаками
Pclass
— класс билета (1 = первый класс, 2 = второй класс, 3 = третий класс);
Age
— возраст пассажира;
SibSp
— количество братьев, сестер или супругов на борту;
Parch
— количество родителей или детей на борту;
Fare
— стоимость билета.Таргет (target) — это целевая переменная, которую мы хотим предсказать. В данной задаче мы будем предсказывать
Survived
— бинарная переменная, указывающая, выжил ли пассажир (1) или нет (0). Значения этой переменной имеются для обучающего набора данных, а для тестого — нет.
Из каждой части оставим несколько признаков, с которыми мы будем работать, а также отдельно — целевой признак, который мы хотим предсказать.
features_columns = ["Pclass", "Age", "Sex", "SibSp", "Parch", "Fare"]
target_column = "Survived" # Целевой признак
X, y = titanic[features_columns], titanic[target_column]
В данных могут присутствовать пропуски. Пока что мы не умеем с ними работать, так что исключим из данных.
Посмотрите, сколько объектов имеют хотя бы один пропуск. Удалите их из данных.
...
Разделите данные по строкам на две части случайным образом в соотношении 7:3. Первую часть мы будем называть обучающей, а вторую — тестовой.
...
1. Исследование¶
❗ Внимание. Эта часть задачи должна выполняться исключительно на обучающих данных. За использование тестовых данных решение не будет оценено.
Проведите визуальный анализ данных чтобы понять, как различные признаки влияют на целевой. Исследовать можно не целиком обучающие данные, а разделить их на две части по одному из признаков, а далее рассматривать каждую часть отдельно.
Не забывайте про информативность и эстетичность графиков, посмотрите презентацию про оформление домашних заданий.
...
2. Классификация логическими правилами¶
На основе выше проведенного исследования предложите два разных правила в виде решающего дерева, пример которого можете посмотреть в презентации с первой лекции (классификация котиков). Никакие статистические методы использовать не требуется, только логику и графики. Любые решения "из коробки" использовать запрещено. Например, достаточно пояснения "по графику (описание графика) визуально я увидел, что при X > 100 большинство пассажиров выжило, поэтому использую правило (описание правила)".
В данной задаче достаточно, если первое дерево будет иметь максимальную глубину 2, а второе — глубину 1, и при этом не является поддеревом первого. Дерево из одного листа имеет глубину 0.
Указание. Попросите ИИ красиво оформить описание дерева и его пояснение.
Дерево 1:
...
Дерево 2:
...
Реализуйте полученные деревья по шаблону
def tree(features: pd.DataFrame) -> pd.Series:
"""
Предсказание целевого признака для данных features -- pandas-таблица данных.
Возвращает pandas.Series с теми же индексами, что и у features.
"""
...
return predicted
Проверьте работоспособность данных моделей на тестовой выборке и оцените качество модели по метрике accuracy
.
❕ Примечание. Полученные значения не влияют на оценку по заданию. Оценивается только корректность и обоснованность решения, а также графики и выводы.
def accuracy(target: pd.Series, predicted: pd.Series) -> float:
"""
Вычисление критерия качества для предсказания predicted,
если истинные значения -- target.
Возвращает одно вещественное число.
"""
...
...
3. Классификация методом ближайшего соседа¶
В данной части задачи оставим только признаки 'Pclass'
, 'Age'
, 'Sex'
,'Fare'
.
❓ Вопрос ❓
Какие могли бы возникнуть проблемы при использовании признаков
'SibSp'
,'Parch'
? Имеется ли подобная проблема для признака'Pclass'
?
Ваш ответ: ...
Постройте классификатор методом ближайшего соседа. Обучите его и оцените качество модели. Сравните с предыдущим методом.
Пока никаких преобразований данных делать не нужно.
...
Попробуем улучшить результаты предсказаний, для этого надо сначала посмотреть на сами данные. Выведите значение минимального и максимального объекта для каждого признака.
...
Как мы видим данные в каждом столбце распределены очень по-разному.
❓ Вопрос ❓
Как это может повлиять на работу kNN, почему?
Ваш ответ: ...
Для решения этой проблемы нужно привести признаки к единому масштабу. Существует много методов масштабирования рассмотрим работу одного из них — минимаксная нормализация
Минимакс — линейное преобразование данных в диапазоне $[0, 1]$, где минимальное и максимальное масштабируемые значения соответствуют 0 и 1 соответственно. Реализуется оно по следующей формуле:
$$\widetilde{x}_{ij} = \frac{x_{ij} - m_j}{M_j - m_j}$$
где $x_{ij}$ — значение признака $j$ для объекта $i$, а $m_j$ и $M_j$ — минимальное и максимальное значения признака $j$ в обучающем наборе данных.
В модулеsklearn.preprocessing
есть классMinMaxScaler
, который реализует эту операцию. Давайте рассмотрим методы этого класса подробнее:
fit(X)
: вычисляет минимальные и максимальные значения для каждого признака.
transform(X)
: применяет масштабирование к данным.
fit_transform(X)
: объединяет оба метода, сначала подгоняя модель, а затем трансформируя данные.
inverse_transform(X)
: восстанавливает исходные данные из масштабированных.
Стоит отметить что существуют и другие методы масштабирования данных.
❓ Вопрос ❓
В чем может быть недостаток такого метода масштабирования?
Ваш ответ: ...
Отмасштабируйте данные
...
Теперь выведите значения максимума и минимума нормализованных признаков. Обратите внимание MinMaxScaler
возвращается объект в виде np.ndarray
.
...
Обучите модель и сравните результат предсказаний со стандартизацией и без.
...
Вывод: ...
А можем ли мы как-то еще повысить точность модели?
Как мы видели, параметр $k$ числа соседей является необучаемым т.е. гиперпараметром, который выставляется вручную. Выбор оптимального значения $k$ важен, так как слишком маленькое значение может привести к переобучению, а слишком большое — к недообучению.
Постройте график зависимости точности (accuracy_score
) от значения $k$ (от 1 до 20) для обучающей и тестовой выборок.
...
Вывод: ...