Физтех.Статистика
Скачать ipynb
Введение в анализ данных¶
Домашнее задание 1. Простой анализ данных.¶
Правила, прочитайте внимательно:
- Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины. Правила переноса дедлайнов определены в презентации с первого занятия.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания все участники списывания будут сдавать устный зачет.
- Задачи 1 и 2 сдаются в систему Яндекс.Контест. Ссылка на контест в телеграм-боте.
Сдача задачи 3:
- Выполненную работу нужно отправить телеграм-боту
@miptstats_ds24_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются. - Прислать нужно ноутбук в формате
ipynb
. - Телеграм не разрешает боту получать файлы более 20 Мб. Если ваше решение весит больше, заранее разделите ноутбук на несколько.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
Перед выполнением задания посмотрите презентацию по выполнению и оформлению домашних заданий с занятия 1.
Баллы за задание:
Легкая часть (достаточно на "хор"):
- Задача 1 — 10 баллов
- Задача 2 — 10 баллов
- Задача 3 — 80 баллов
Баллы учитываются в обязательной части курса и не влияют на оценку по факультативной части.
# Bot check
# HW_ID: fpmi_ad1
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='whitegrid', font_scale=1.3, palette='Set2')
Задача 3.¶
Титаник был крупнейшим пассажирским судном в 1912—1913 годах. Во время первого рейса затонул в северной Атлантике, столкнувшись с айсбергом в ночь с 14 на 15 апреля 1912 года, при этом погибло 1502 из 2224 пассажиров и членов экипажа. Данные о пассажирах были собраны в таблицы, которые можно скачать с Kaggle. Эти данные часто используются в качестве обучающих в анализе данных.
На дополнительном занятии 10 февраля будет показан простой пример работы с датасетом Титаник. Сейчас ваша задача — на основе простого анализа предоставленных данных обучить несколько классификаторов для определения выживших, иначе говоря, получить некоторые приближенные правила определения, выжил пассажир или нет, а также сравнить эти правила по качеству приближения.
1. Подготовка данных¶
Загрузите данные с помощью pandas
.
Разделите данные по строкам на две части случайным образом в соотношении 7:3. Первую часть мы будем называть обучающей, а вторую — тестовой.
Из каждой части оставим несколько признаков, с которыми мы будем работать, а также отдельно — целевой признак. Примените к обеим частям таблицы функцию ниже
features_columns = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']
target_column = 'Survived' # Целевой признак
def get_features_and_target(data):
features = data[features_columns]
target = data[target_column]
return features, target
2. Исследование¶
Внимание. Эта часть задачи должна выполняться исключительно на обучающих данных. За использование тестовых данных решение не будет оценено.
Проведите визуальный анализ данных чтобы понять, как различные признаки влияют на целевой. Исследовать можно не целиком обучающие данные, а разделить их на две части по одному из признаков, а далее рассматривать каждую часть отдельно.
Не забывайте про информативность и эстетичность графиков.
3. Классификация методом ближайшего соседа¶
Ранее в контесте вы уже реализовали функцию поиска ближайших соседей. Теперь давайте применим ее для решения нашей текущей задачи.
Реализуйте функцию, которая для каждого объекта тестового набора данных найдет $k$ ближайших соседей из обучающего набора данных, и в качестве ответа возьмет наиболее часто встречающееся значение целевого признака среди найденных соседей. Обратите внимание, что соседей необходимо искать только среди объектов обучающего набора данных.
def knn(features, train_features, train_target, k=1):
'''
Предсказание целевого признака для данных features -- pandas-таблица данных.
на основе обучающего набора данных train_features, train_target.
Возвращает pandas.Series с теми же индексами, что и у features.
Число k -- количество соседей.
'''
...
return predicted
Постройте классификатор методом ближайшего соседа, используя только признаки Age
и Fare
.
Какую метрику (функцию расстояния) вы при этом используете? Нужно ли предварительно что-то сделать с признаками?
Как меняется результат классификации при другом количестве соседей? Рассмотрите хотя бы три различных нечетных значения количества соседей.
Как можно было бы учесть другие признаки? Какие при этом могут возникнуть проблемы?
...
Строить классификатор с другими признаками при этом не нужно.
4. Классификация логическими правилами¶
На основе выше проведенного исследования предложите два разных правила в виде решающего дерева, пример которого можете посмотреть в презентации с первой лекции (классификация котиков). Никакие статистические методы использовать не требуется, только логику и графики.
В данной задаче достаточно, если первое дерево будет иметь максимальную глубину 2, а второе — глубину 1, и при этом не является поддеревом первого. Примечание: дерево из одного листа имеет глубину 0.
Дерево 1:
...
Дерево 2:
...
Реализуйте полученные деревья по шаблону
def tree(features):
'''
Предсказание целевого признака для данных features -- pandas-таблица данных.
Возвращает pandas.Series с теми же индексами, что и у features.
'''
...
return predicted
5. Качество¶
Вспомним, что у нас имеется тестовая часть выборки. Самое время ее использовать для того, чтобы оценить, насколько хорошими получились деревья. Предложите какой-нибудь критерий качества.
Замечание. Не стоит пытаться искать, какие критерии существуют. В данном случае легко предложить адекватный критерий. Стандартные критерии мы разберем позже, но для начала лучше подумать самостоятельно.
Критерий:
...
Реализуйте данный критерий по шаблону
def criteria(target, predicted):
'''
Вычисление критерия качества для предсказания predicted,
если истинные значения -- target.
Возвращает одно вещественное число.
'''
...
Оцените качество построенных ранее моделей (два дерева, kNN), используя предложенный критерий.
Примечание. Полученные значения не влияют на оценку по задание. Оценивается только корректность и обоснованность решения, а также графики и выводы.
Посчитайте значение предложенного ранее критерия качества для метода ближайшего соседа для значений $k$ от 1 до 10. Постройте график зависимости критерия качества от $k$. Как вы можете пояснить полученные результаты?
6. Выводы¶
...