Введение в анализ данных¶
Домашнее задание 2. Простой анализ данных и ИИ-инструменты.¶
Правила, прочитайте внимательно:
- Выполненную работу нужно отправить телеграм-боту
@thetahat_ds25_bot
. Для начала работы с ботом каждый раз отправляйте/start
. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. Работы, присланные иным способом, не принимаются. - Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.
- Прислать нужно ноутбук в формате
ipynb
. Если вы строите интерактивные графики, их стоит прислать в формате html. - Следите за размером файлов. Бот не может принимать файлы весом более 20 Мб. Если файл получается больше, заранее разделите его на несколько.
- Выполнять задание необходимо полностью самостоятельно. При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.
- Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.
- Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.
- Код из рассказанных на занятиях ноутбуков можно использовать без ограничений.
- Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.
- Комментарии к решению пишите в markdown-ячейках.
- Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.
- Решение проверяется системой ИИ-проверки
ThetaGrader. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.
- Если код будет не понятен проверяющему, оценка может быть снижена.
- Никакой код из данного задания при проверке запускаться не будет. Если код студента не выполнен, недописан и т.д., то он не оценивается.
Важно!!! Правила заполнения ноутбука:
- Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.
- Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.
- Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены
<...>
. - В markdown-ячейка, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.
- При нарушении данных правил работа может получить 0 баллов.
Перед выполнением задания посмотрите презентацию по выполнению и оформлению домашних заданий с занятия 2.
Баллы за задание:
Легкая часть (достаточно на "хор"):
- Задача 1 — 5 баллов
- Задача 2 — 25 баллов
Сложная часть (необходимо на "отл"):
- Задача 3 — 80 баллов
- Задача 4 — 50 баллов
Баллы учитываются в обязательной части курса и не влияют на оценку по факультативной части.
# Bot check
# HW_ID: fpmi_ad2
# Бот проверит этот 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', palette='Set2')
На лекции мы рассмотрели, как можно использовать инструменты искусственного интеллекта в нашем курсе, чтобы повысить личную эффективность. В этом домашнем задании мы предлагаем вам две технические задачи, которые можно полностью доверить ИИ. Они относятся к легкой части задания. Бывает работа, которую делать просто не хочется: она долгая, рутинная, несодержательная, не несет какой-либо интеллектуальной ценности. Такую работу по возможности стоит спихнуть искусственному интеллекту.
Также в сложной части вы найдёте задачу по работе с библиотеками и небольшой анализ научной статьи из списка на ваш выбор. Все эти задания можно выполнить самостоятельно, но мы рекомендуем воспользоваться помощью ИИ, чтобы облегчить процесс 😊
Легкая часть¶
Задача 1.¶
Это задача для разминки всего на 5 баллов. Возможно, она покажется вам забавной, но это действительно так 😃
Ниже представлен код на языке C++. Перепишите его на Python и запустите без ошибок. Поясните, что делает этот код?
Если код не работает, обсудите проблему с моделью или используйте другую, эта задача гарантированно решается.
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#define 😃 int
#define 🎉 void
#define 🍎 std::vector<int>
#define 🖨️ std::cout
#define 🔢 rand()
#define ⏰ time(0)
#define 🔀 srand
#define 🔁 for
#define 🔄 while
#define 🎲 if
#define 🎈 else
#define 🚀 return
#define 🎯 main
#define 🖥️ std::endl
🎉 🎭(🍎& 🍏, 😃 🍌, 😃 🍍, 😃 🍇) {
😃 🍒 = 🍍 - 🍌 + 1;
😃 🍓 = 🍇 - 🍍;
🍎 🍑(🍒), 🍐(🍓);
🔁 (😃 🍔 = 0; 🍔 < 🍒; 🍔++)
🍑[🍔] = 🍏[🍌 + 🍔];
🔁 (😃 🍔 = 0; 🍔 < 🍓; 🍔++)
🍐[🍔] = 🍏[🍍 + 1 + 🍔];
😃 🍔 = 0, 🍕 = 0, 🍖 = 🍌;
🔄 (🍔 < 🍒 && 🍕 < 🍓) {
🎲 (🍑[🍔] <= 🍐[🍕]) {
🍏[🍖] = 🍑[🍔];
🍔++;
} 🎈 {
🍏[🍖] = 🍐[🍕];
🍕++;
}
🍖++;
}
🔄 (🍔 < 🍒) {
🍏[🍖] = 🍑[🍔];
🍔++;
🍖++;
}
🔄 (🍕 < 🍓) {
🍏[🍖] = 🍐[🍕];
🍕++;
🍖++;
}
}
🎉 🍿(🍎& 🍏, 😃 🍌, 😃 🍇) {
🎲 (🍌 < 🍇) {
😃 🍍 = 🍌 + (🍇 - 🍌) / 2;
🍿(🍏, 🍌, 🍍);
🍿(🍏, 🍍 + 1, 🍇);
🎭(🍏, 🍌, 🍍, 🍇);
}
}
🍎 🎲(😃 🎯, 😃 🎰, 😃 🎳) {
🍎 🎨(🎯);
🔁 (😃 🍔 = 0; 🍔 < 🎯; 🍔++) {
🎨[🍔] = 🔢 % (🎳 - 🎰 + 1) + 🎰;
}
🚀 🎨;
}
🎉 🖨️(const 🍎& 🍏) {
🔁 (😃 🍔 : 🍏) {
🖨️ << 🍔 << " ";
}
🖨️ << 🖥️;
}
😃 🎯() {
🔀(⏰);
😃 🎯 = 20;
😃 🎰 = 0;
😃 🎳 = 100;
🍎 🍏 = 🎲(🎯, 🎰, 🎳);
🖨️ << "?: ";
🖨️(🍏);
🍿(🍏, 0, 🍏.size() - 1);
🖨️ << "??: ";
🖨️(🍏);
🚀 0;
}
...
Пояснение к коду: ...
Задача 2.¶
При использовании ИИ в этой задаче необходимо прислать файл task_2_ai_promt.txt
с копией вашего диалога с ИИ-инструментом
В этой задаче вам предстоит поработать с библиотекой Plotly. Это полезный инструмент для создания привлекательных и удобных графиков, который вы наверняка будете использовать в своей работе. Мы рекомендуем заранее изучить его функции и возможности, чтобы вы могли уверенно использовать его в дальнейшем.
Одна из главных особенностей этой библиотеки — возможность настраивать и украшать графики по своему вкусу. Именно этим мы и предлагаем вам заняться в рамках данной задачи.
Ниже приведен код для построения 3D-графика функции с помощью Plotly.
import plotly.graph_objects as go
def plot_3d_surface():
x = np.linspace(-10, 10, 200)
y = np.linspace(-10, 10, 200)
x, y = np.meshgrid(x, y)
z = np.cos(np.sqrt(x**2 + y**2))
fig = go.Figure(data=[go.Surface(z=z, x=x, y=y)])
fig.update_layout(
title='Cosine Function 3D Surface Plot',
scene=dict(
xaxis_title='X Axis',
yaxis_title='Y Axis',
zaxis_title='Z Axis',
aspectmode='cube',
),
margin=dict(l=0, r=0, b=0, t=0)
)
fig.show()
plot_3d_surface()
Выполните следующие действия в ячейках ниже.
- Задокументируйте функцию и добавьте комментариев. Необходимо это сделать так, чтобы любой человек мог понять, какая у нее задача и что делают отдельные части кода.
...
- Напишите, что делают следующие функции и опции:
meshgrid
Figure
Surface
update_layout
scene
margin
...
- Выясните, какой параметр отвечает за настройку цветовой палитры графика? Измените код так, чтобы палитра была от светло-розового до светло-голубого.
...
- Измените функцию так, чтобы она могла получать любые параметры настройки графиков через
kwargs
. Это позволит пользователям гибко настраивать параметры графика.
...И напишите подробную инструкцию для пользователя этой функции😃
...
Инструкция:
...
Сложная часть¶
Задача 3.¶
Эта задача предназначена для развития навыков работы с библиотекой pandas и простого анализа табличных данных. В ней детально описаны все шаги, которые необходимо выполнить. Если что-то не понятно, спросите ИИ или в чате курса.
Yelp — веб-сайт для поиска на местном рынке услуг, например ресторанов или парикмахерских, с возможностью добавлять и просматривать рейтинги и обзоры этих услуг. Для популярных бизнесов имеются сотни обзоров. Для обозревателей на сайте предусмотрены элементы социальной сети.
Вам предоставляется следующая информация о компаниях на Yelp:
Файл yelp_business.csv
:
business_id
— уникальный идентификатор компании;name
— имя компании;address
,city
,state
— месторасположении компании;latitude
,longitude
— географические координаты;categories
— категории услуг компании.
Файл yelp_review.csv
, содержащий оценки пользователей:
business_id
— идентификатор компании, соответствующий файлуyelp_business.csv
;stars
— поставленная пользователем оценка от 1 до 5.
В целях сокращения объема файла, текстовые отзывы пользователей не были включены.
Оригинальную версию датасета в формате json
можно посмотреть по ссылке, но использовать нужно выданные данные.
Что нужно сделать:
- Найти город с наибольшим количеством компаний;
- Для этого города определить районы с наиболее качественными услугами. Пример с несколько другой задачей.
- А также найти рестораны с наилучшими отзывами.
Далее в условии встречаются различные подсказки, как можно выполнить определенные части задачи. Вы можете их игнорировать и делать иным способом для получения того же самого промежуточного результата. Однако, если ваше решение окажется значительно менее эффективным (по скорости, количеству и красоте кода) по сравнению с предполагаемым, баллы могут быть снижены.
1. Город с наибольшим количеством компаний¶
Загрузите данные из файла yelp_business.csv
с помощью функции pd.read_csv
. Посмотрите на первые несколько строк с помощью метода head
.
...
Найдите пять городов, по которым присутствует информация о наибольшем количестве компаний. В таблице должен быть указан город (название) и количество компаний в этом городе.
Подсказка. Для выполнения стоит воспользоваться методами groupby
, count
, sort_values
, head
.
...
Пусть N
— город с наибольшим количеством компаний. Оставьте в таблице только записи, соответствующие городу N
. Нанесите все эти компании на график, в котором по оси $x$ отметьте долготу, а по оси $y$ — широту.
...
Сам город находится в сгустке точек. Есть какие-то компании, которые приписаны к этому городу, но находятся далеко от него. Избавьтесь от них, подобрав некоторые границы значений широты и долготы. Изобразите все компании на новом графике. На этом графике должны выделяться некоторые улицы.
...
Разберитесь с тем, как подгрузить интерактивную карту города в качестве фона графика. Можно пойти двумя следующими способами.
- Изучить материалы по библиотеке Plotly. Возможно, потребуется также заглянуть в документацию.
- Поразбираться с библиотекой Folium. Посмотрите множество примеров, может также помочь статья на русском.
Внимание! Интерактивная карта может не сохраниться в ноутбуке, а если сохранится, то вес ноутбука может превзойти 20 Мб, и его не получится отправить боту. В любом случае необходимо сохранить карту в html и отправить ее отдельным файлом в бот. При этом каждый файл html должен не превышать 20 Мб, присылать файлы в архиве нельзя. Аналогично со всеми следующими интерактивными графиками в этом задании.
...
Если все получилось, вы молодцы! Далее в этой задаче тоже стройте интерактивные карты. Если нет желания разбираться с интерактивными графиками, можно построить статичные, но баллы будут снижены.
2. Оценки компаний¶
Для выполнения задания нужно посчитать среднюю оценку каждой компании, а также количество выставленных оценок.
Загрузите таблицу оценок yelp_review.csv
.
...
В подгруженной таблице оценок оставьте только компании города N
. Для этого установите значения business_id
в качестве индекса у таблицы оценок и воспользуйтесь методом loc
.
Подсказка. Чтобы индекс снова сделать полем таблицы, можно воспользоваться методом reset_index
.
...
Теперь посчитайте среднюю оценку каждой компании, а также количество выставленных компании оценок.
Подсказка. Помочь в этом могут функции groupby
и aggregate([np.mean, np.size])
.
...
Назовите колонки таблицы красивыми именами, изменив <имя таблицы>.columns
, после чего напечатайте несколько строк полученной таблицы. Красивые имена — то, что будет понятно простому человеку при чтении ваших результатов. Как именно их назвать — задача аналитика, то есть в данном случае ваша :)
...
Соедините две полученные ранее таблицы по компаниям города N
в одну.
Для этого сначала установите поле business_id
в качестве индекса в обеих таблицах с помощью set_index
. В одной из них это уже должно было быть сделано.
В полученной таблице должны получится поля latitude
, longitude
, categories
, name
, а также две колонки со средней оценкой компаний и количеством оценок, которые вы посчитали выше.
Подсказка. Соединение таблиц можно выполнить с помощью join
.
Индексы у этих таблиц одинаковые, так что тип джойна не имеет значения.
...
Изобразите все компании на графике, раскрасив точку в цвет, оттенок которого соответствует средней оценке компании. Прозрачность точки выставляйте не более $0.3$. Если у одной компании несколько филиалов с разными адресами, наносите на график все адреса.
...
Чтобы получить районы города, то есть разделить город на "клетки", округлите значения широты и долготы, подобрав оптимальный размер района.
Подсказка. Например, можно сделать так
np.round(долгота*4, decimals=1)*0.25
.
...
Для получения средней оценки компаний по району постройте сводную таблицу при помощи pd.pivot_table
, взяв в качестве индексов и колонок округленные широту и долготу, а в качестве значений — оценки. Аггрегирующей функцией является среднее.
Изобразите полученную таблицу при помощи sns.heatmap
.
Замечание. В качестве среднего можно было бы посчитать как общее среднее по всем оценкам всех компаний, так и среднее по компаниям их средних оценок. В чем разница этих подходов? Какой из них необходимо использовать в данном случае?
...
Полученный график имеет ряд недостатков. Во-первых, не очень правильно судить о районе, если в нем мало компаний. Во-вторых, на графике цветовая гамма автоматически подстроилась под минимальное и максимальное значения оценки.
Почему эти недостатки могут быть существенными?
Ответ: <...>
Оставьте районы, в которых имеется информация о не менее $30$ компаний. Постройте новый график районов, использовав параметры vmin
и vmax
у функции sns.heatmap
.
...
Сравните полученный график с предыдущим и сделайте вывод.
Вывод: <...>
3. Рестораны¶
Будем считать компанию рестораном, если в поле categories
содержится слово restaurant
. Обратите внимание, что в анализе данных часто нет четкого формата данных. Например, данное слово может быть написано как с большой буквы, так и с маленькой; может как разделяться ;
, так и не разделяться. При возникновении недопонимания стоит посмотреть данные.
Составьте таблицу, в которой будет информация о всех ресторанах города N
, для которых имеется не менее $5$ отзывов. Далее постройте heatmap-график районов, в котором каждому району сопоставьте среднюю оценку по ресторанам этого района. Рассматривайте только те районы, в которых есть не менее $10$ ресторанов, для каждого из которых есть не менее $5$ отзывов.
...
Чем полезны ограничения снизу на количество отзывов для ресторана и количество ресторанов в районе?
Ответ: <...>
Кот Василий из города N
очень придирчив к выбору ресторана. Он доверяет только ресторанам с высоким рейтингом, который основывается на большом количестве отзывов. Напечатайте в виде таблицы информацию $10$ ресторанах с самым большим рейтингом в порядке убывания рейтинга. Для каждого из этих ресторанов должно быть не менее $50$ отзывов. По каждому ресторану необходимо вывести следующую информации: название ресторана, средняя оценка, количество отзывов, географические координаты, категории.
...
Нанесите на карту все рестораны со средней оценкой не менее $4.7$, которая посчитана по не менее $50$ отзывам. Отдельным цветом отметьте 10 ресторанов, которые вы получили ранее.
...
Охарактеризуйте кота Василия, а также сделайте общий вывод по задаче.
Вывод: <...>
Задача 4.¶
При использовании ИИ в этой задаче необходимо прислать файл task_4_ai_promt.txt
с копией вашего диалога с ИИ-инструментом
Представьте ситуацию, вы занимаетесь своей научной работой, и вам попалась одна интересная статья. Прежде чем глубоко погружаться в решение авторов вам хотелось бы понять, какую задачу решают авторы, насколько успешно, какие у них данные, какие навыки нужны для понимания. Например, было бы очень не оптимально последовательно глубоко разбирать все статьи, на это нужно потратить очень много времени. Предварительный анализ позволяет понять, какие решения в статьях существуют, выделить для себя наиболее интересные. Благодаря изобретению ИИ вы можете ускорить анализ статьей, быстрее разбираться в научных статьях, которые вам действительно интересны.
Выполните следующие действия
Выберите одну научную статью из списка ниже.
Опишите постановку задачи: 1). на простом языке, чтобы ее могли понять люди без технического образования, 2). на математическом языке. Возможно, некоторые моменты окажутся сложными, тем не менее, попробуйте выделить ключевые элементы, используя ИИ.
Разберите структуру входных данных, которые использует решение авторов. Опишите их тип, например, таблица признаков, изображения с метками, текстовые данные с категориями, а также формат представления. Например, случае метода KNN это матрица признаков размером $n \times d$ и вектор меток размером $n$.
Определите ограничения на данные. Уточните, есть ли требования к их балансу, наличию пропущенных значений, допустимым диапазонам чисел и другим характеристикам.
Выясните, решает ли предложенная модель поставленную задачу по мнению авторов. Обратите внимание на используемые метрики и проанализируйте, насколько они подтверждают успешность решения. Погружаться в работу метрик не требуется, достаточно лишь кратко изложить основные результаты.
Опишите, какими знаниями необходимо обладать для понимания работы модели. Это могут быть основы математики, такие как линейная алгебра и теория вероятностей, а также навыки программирования, например, владение Python и библиотеками машинного обучения.
Примечание.
- Ожидаемый объем работы: 200-300 слов.
- Расчетное время выполнения: 1 час.
Трансформеры и языковые модели¶
Attention is All You Need
Vaswani et al., NeurIPS 2017
arXiv:1706.03762BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Devlin et al., NAACL 2019
arXiv:1810.04805Language Models are Few-Shot Learners
Brown et al., NeurIPS 2020
arXiv:2005.14165Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
Raffel et al., JMLR 2020
arXiv:1910.10683Scaling Laws for Neural Language Models
Kaplan et al., NeurIPS 2020
arXiv:2001.08361Llama 2: Open Foundation and Fine-Tuned Chat Models
Meta AI, 2023
arXiv:2307.09288GPT-4 Technical Report
OpenAI, 2023
arXiv:2303.08774Gemini: A Family of Highly Capable Multimodal Models
Google DeepMind, 2023
arXiv:2312.11805
Компьютерное зрение и визуальные модели¶
An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
Dosovitskiy et al., ICLR 2021
arXiv:2010.11929Learning Transferable Visual Models From Natural Language Supervision
Radford et al., ICML 2021
arXiv:2103.00020Segment Anything
Kirillov et al., Meta AI, 2023
arXiv:2304.02643Scaling Vision Transformers to 22 Billion Parameters
Dehghani et al., Google DeepMind, 2023
arXiv:2302.05442
Self-Supervised and Contrastive Learning¶
A Simple Framework for Contrastive Learning of Visual Representations
Chen et al., CVPR 2020
arXiv:2002.05709Self-Supervised Learning of Pretext-Invariant Representations
Misra and Maaten, CVPR 2020
arXiv:1912.01991Big Self-Supervised Models are Strong Semi-Supervised Learners
Chen et al., NeurIPS 2020
arXiv:2006.10029Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
Caron et al., NeurIPS 2020
arXiv:2006.09882
Обучение с подкреплением¶
Reinforcement Learning with Augmented Data
Laskin et al., NeurIPS 2020
arXiv:2004.14990Neural Architecture Search with Reinforcement Learning
Zoph and Le, ICLR 2017
arXiv:1611.01578
Архитектуры нейросетей и их масштабирование¶
EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
Tan and Le, ICML 2019
arXiv:1905.11946Emergent Abilities of Large Language Models
Wei et al., 2023
arXiv:2206.07682Scaling Data-Constrained Language Models
Muennighoff et al., 2023
arXiv:2305.16264
Математика, байесовские методы и причинно-следственный анализ¶
Deep Learning for Symbolic Mathematics
Lample and Charton, ICLR 2020
arXiv:1912.01412Causal Inference with a Functional Outcome
Ecker et al., 2023
arXiv:2304.07113General Bayesian Inference for Causal Effects Using Covariate Balancing Procedure
Orihara et al., 2024
arXiv:2404.09414A Deep-Learning Based Bayesian Approach to Seismic Imaging and Uncertainty Quantification
Siahkoohi et al., 2020
arXiv:2001.04567Robust Inference for High-Dimensional Linear Models
Wang et al., 2021
arXiv:2106.07717
Выбранная статья: ...
Анализ статьи:
...