Phystech@DataScience¶
Домашнее задание 1. Простой анализ данных.¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@thetahat_pds_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
. Если вы строите интерактивные графики, их стоит прислать в формате html. - Следите за размером файлов. Бот не может принимать файлы весом более 20 Мб. Если файл получается больше, заранее разделите его на несколько.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Решение проверяется системой ИИ-проверки
ThetaGrader. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
Важно!!! Правила заполнения ноутбука:
- Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.
- Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.
- Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены
<...>
. - В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.
- При нарушении данных правил работа может получить 0 баллов.
Перед выполнением задания посмотрите презентацию по выполнению и оформлению домашних заданий с занятия 1.
Баллы за задание:
Легкая часть (достаточно на "хор"):
- Задача 1 — 30 баллов
- Задача 2 — 20 баллов
- Задача 3 — 90 баллов
Сложная часть (необходимо на "отл"):
- Задача 4 — 50 баллов
# Bot check
# HW_ID: phds_hw1
# Бот проверит этот ID и предупредит, если случайно сдать что-то не то
# Status: not final
# Перед отправкой в финальном решении удали "not" в строчке выше
# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную
Тренировочные задачи на библиотеки¶
Если вы неуверенно себя чувствуете в библиотеках numpy, pandas, matplotlib, seaborn, рекомендуем сначала
- посмотреть материалы по библиотекам на нашем сайте
- прорешать упражнения на библиотеки на странице курса
- прорешать два упражнения на numpy в системе Яндекс.Контест.
Легкая часть¶
Задача 1¶
В этой задаче вам предстоит визуализировать центральную предельную теорему.
a). Пусть $\xi_1, \xi_2,..., \xi_n$ — независимые случайные величины, имеющие распределение $Exp(\lambda)$. Согласно центральной предельной теореме, имеет место сходимость $$Z_n = \frac{X_n - \mathsf{E}X_n}{\sqrt{\mathsf{D}X_n}} \stackrel{d}{\longrightarrow} \mathcal{N}(0, 1),$$ где $X_n = \sum_{i=1}^n \xi_i$.
Чтобы убедиться в этом, вам необходимо сгенерировать множество наборов случайных величин и рассчитать значение $Z_n$ для каждого набора, в зависимости от его размера.
Сгенерируйте 1000 наборов случайных величин $\xi_1^j,..., \xi_{300}^j$ из распределения $Exp(1)$.
size = ... # размер выборки
samples_count = ... # количество выборок
sample = ...
По каждому из них посчитайте сумму $X_{jn} = \sum\limits_{i=1}^n \xi_i^j$ для $1 \leqslant n \leqslant 300$, то есть сумма первых $n$ величин $j$-го набора.
sums = ...
Для этого среднего посчитайте величину $Z_{jn} = \frac{X_{jn} - \mathsf{E}X_{jn}}{\sqrt{\mathsf{D}X_{jn}}}$.
Подсказка: можно воспользоваться возможностями библиотеки numpy
.
...
Для каждого $j$ нанесите на один график зависимость $Z_{jn}$ от $n$ с помощью plt.plot
. Каждая кривая должна быть нарисована одним цветом с прозрачностью alpha=0.05
. Сходятся ли значения $Z_{jn}$ к какой-либо константе?
...
Для $n=300$ по набору случайных величин $Z_{1,300}, ..., Z_{1000,300}$ постройте гистограмму. Похожа ли она на плотность распределения $\mathcal{N}(0, 1)$, которую тоже постройте на том же графике? Не забудьте сделать легенду (подписи на графиках, см. семинар и туториалы).
...
b). Выполните те же действия для распределения $Pois(1)$.
...
Сделайте вывод о смысле центральной предельной теоремы. Подтверждают ли сделанные эксперименты теоретические свойства?
...
Задача 2¶
Профиль физика
Время когерентности кубита подчиняется показательному распределению с математическим ожиданием 100 микросекунд. Найти вероятность того, что среднее время когерентности выборки из 100 кубитов составит не менее 90 микросекунд.
Профиль биология
Время жизни лейкоцита подчиняется показательному распределению с математическим ожиданием 200 часов. Найти вероятность того, что среднее время жизни выборки из 100 лейкоцитов окажется не менее 180 часов.
0. Подготовка данных¶
Выбор датасета для выполнения данного задания, зависит от вашего профиля. Выбрать профиль вы можете любой на свое усмотрение. Задания, не относящиеся к вашему профилю, выполнять не нужно.
Профиль биология
Анемия — это состояние, характеризующееся снижением уровня гемоглобина или количества эритроцитов, что приводит к недостаточному снабжению органов и тканей кислородом. Набор данных, который можно скачать с Kaggle, содержит информацию о пациентах, включая их пол, уровень гемоглобина и другие важные параметры крови, которые используются для диагностики анемии.
Загрузите данные с помощью pandas
.
anemia = ...
anemia.head()
Для лучшего понимания процесса работы с данными, уточним ключевые термины.
Объект — это единица данных, представленная набором признаков и используемая для обучения или предсказаний модели. В данной задаче являются пассажиры, им соответствуют строки таблицы данных.
Признаки (features) — это характеристики, которые описывают объекты в данных. В таблицах данных они обычно соответствуют колонкам. В данной задаче мы будем работать со следующими признаками
GENDER
— 0: Мужчина, 1: Женщина
Hemoglobin
— Уровень гемоглобина в крови. Гемоглобин — это белок, содержащийся в эритроцитах, который отвечает за перенос кислорода от легких к органам и тканям, а также за транспортировку углекислого газа обратно в легкие.
MCH
(Mean Corpuscular Hemoglobin) — Среднее содержание гемоглобина в эритроците. Этот показатель отражает количество гемоглобина в одном эритроците.
MCHC
(Mean Corpuscular Hemoglobin Concentration) — Средняя концентрация гемоглобина в эритроците. Показывает, насколько насыщены гемоглобином эритроциты.
MCV
(Mean Corpuscular Volume) — Средний объем эритроцита. Этот параметр измеряет средний размер эритроцитов.Таргет (target) — это целевая переменная, которую мы хотим предсказать. В данной задаче мы будем предсказывать
IDENTIFICATION
— бинарная переменная, указывающая, страдает ли пациент анемией (1) или нет (0). Значения этой переменной имеются для обучающего набора данных, а для тестого — нет.
Из каждой части оставим признаки, с которыми мы будем работать, а также отдельно — целевой признак, который мы хотим предсказать.
features_columns = ["GENDER", "Hemoglobin", "MCH", "MCHC", "MCV"]
target_column = "IDENTIFICATION" # Целевой признак
X, y = <...>
Профиль физика
Данное исследование посвящено разработке эффективного подхода к проектированию и адаптации шасси для электромобилей с использованием методов машинного обучения. Внедрение модели машинного обучения позволяет прогнозировать и находить наиболее подходящие материалы для изготовления шасси, что способствует оптимизации конструкции, снижению веса и повышению производительности электромобилей. Набор данных, который можно скачать с Kaggle, содержит информацию о различных материалах, их свойствах и характеристиках.
Загрузите данные с помощью pandas
.
material = ...
Для лучшего понимания процесса работы с данными, уточним ключевые термины.
Объект — это единица данных, представленная набором признаков и используемая для обучения или предсказаний модели. В данной задаче являются пассажиры, им соответствуют строки таблицы данных.
Признаки (features) — это характеристики, которые описывают объекты в данных. В таблицах данных они обычно соответствуют колонкам. В данной задаче мы будем работать со следующими признаками
Su
— Предел прочности при растяжении в МПа Максимальное напряжение, которое материал может выдержать перед разрушением при растяжении.
Sy
— Предел текучести в МПа. Напряжение, при котором материал начинает деформироваться пластически (необратимо).
E
— Модуль упругости в МПа Мера жесткости материала, которая показывает, как материал сопротивляется упругой деформации под нагрузкой.
G
— Модуль сдвига в МПа Параметр, который характеризует способность материала сопротивляться деформации при сдвиге.
mu
— Коэффициент Пуассона в безразмерных единицах
Ro
— Плотность в кг/м³Таргет (target) — это целевая переменная, которую мы хотим предсказать. В данной задаче мы будем предсказывать
Use
— бинарная переменная, указывающая, используется ли материал в машиностроении (1) или нет (0). Значения этой переменной имеются для обучающего набора данных, а для тестого — нет.
Из каждой части оставим признаки, с которыми мы будем работать, а также отдельно — целевой признак, который мы хотим предсказать.
features_columns = ["Su", "Sy", "E", "G", "mu", "Ro"]
target_column = "Use" # Целевой признак
X, y = <...>
Данная часть задания является общей для всех профилей
Разделите данные по строкам на две части случайным образом в соотношении 7:3. Первую часть мы будем называть обучающей, а вторую — тестовой.
1. Исследование¶
❗ Внимание. Эта часть задачи должна выполняться исключительно на обучающих данных. За использование тестовых данных решение не будет оценено.
Проведите визуальный анализ данных чтобы понять, как различные признаки влияют на целевой. Исследовать можно не целиком обучающие данные, а разделить их на две части по одному из признаков, а далее рассматривать каждую часть отдельно.
Не забывайте про информативность и эстетичность графиков, посмотрите презентацию про оформление домашних заданий.
...
❓ Вопрос ❓
По каким признакам можно различить эти классы?
Ваш ответ: ...
2. Классификация логическими правилами¶
На основе выше проведенного исследования предложите два разных правила в виде решающего дерева, пример которого можете посмотреть в презентации с первой лекции (классификация котиков). Никакие статистические методы использовать не требуется, только логику и графики. Любые решения "из коробки" использовать запрещено. Например, достаточно пояснения "по графику (описание графика) визуально я увидел, что при X > 100 большинство объектов относится к классу 0, поэтому использую правило (описание правила)".
В данной задаче достаточно, если первое дерево будет иметь максимальную глубину 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. Классификация методом ближайшего соседа¶
Постройте классификатор методом ближайшего соседа. Обучите его и оцените качество модели. Сравните с предыдущим методом.
Пока никаких преобразований данных делать не нужно.
...
Попробуем улучшить результаты предсказаний, для этого надо сначала посмотреть на сами данные. Выведите значение минимального и максимального объекта для каждого признака.
...
Как мы видим данные в каждом столбце распределены очень по-разному.
❓ Вопрос ❓
Как это может повлиять на работу 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) для обучающей и тестовой выборок.
...
Сделайте общий вывод по задаче
Вывод: ...
Профиль физика
Рассмотрим два атома в возбужденном состоянии, каждый из которых может спонтанно испустить фотон и перейти в основное состояние. Время жизни возбужденного состояния каждого атома $X_1$ и $X_2$ подчиняется экспоненциальному распределению с параметром $\lambda$, что характерно для процессов спонтанного испускания.
Обозначим:
- $m = \min(X_1, X_2)$ — время испускания первого фотона, соответствующее времени жизни менее устойчивого атома.
- $M = \max(X_1, X_2)$ — время испускания второго фотона, соответствующее времени жизни более устойчивого атома.
Найдите математическое ожидание и дисперсию $m$ и $M$.
Профиль биология
Рассмотрим два молекулярных белка в клетке, каждый из которых подвержен деградации под действием протеаз. Время жизни каждого белка $X_1$ и $X_2$ является случайной величиной, которая подчиняется экспоненциальному распределению с параметром $\lambda$, что соответствует характерному механизму распада белков в биологических системах.
Обозначим:
- $m = \min(X_1, X_2)$ — время деградации первого белка, что соответствует скорости разрушения менее стабильного белка.
- $M = \max(X_1, X_2)$ — время деградации второго белка, которое характеризует устойчивость более долговечного белка.
Найдите математическое ожидание и дисперсию $m$ и $M$.