Разбор Отборочного этапа НТО Junior: Технологии и Искусственный интеллект
Решаемость задач
Процент решаемости показывает долю участников с верными решениями ко всем.
Цвет столбцов соответствует решаемости: самые красные - решили мало, самые зеленые - много.
Решаемость Задач, реализуемых на платформе Machine learning for kids. значительно выше, чем у других, что говорит о том, что новый инструмент был отлично усвоен.
- Задачи на Автопилот - разработка программного кода с помощью блоков на платформе Scratch. Требовалось в соответствии с алгоритмом действий выстроить правильную последовательность блоков.
- Сбор данных через API, баллов за нее начислялось больше всего и она требовала знание и понимание кода на языке Python и внимательности при соблюдении формата ввода.
- Разметка текста - задача для Асессоров на разделение отзывов по настроению: позитивному, негативному и нейтральному. Задача требовала внимательности участников и соблюдение формата ввода.
Задача №1. Задание для асессоров
1.1. Разметка отзывов по контексту настроения: позитивные, негативные и нейтральные
Разметка отзывов на отрицательные и позитивные на основе личного опыта. Цветом подсветили строки:
1.2. Количество ошибочных отзывов
vs 1.2. Автоматическая разметка
- Определить ключевые слова для формирования однозначного ответа:
- Первая попытка: каждый положительный отзыв снабжен фразой «отличный парк», каждый отрицательный ключевой подстрокой «разочарова»
- каждый положительный отзыв снабжен фразой «замечательное место», каждый отрицательный «отвратительный сервис»
- остальные отзывы нейтральные.
- Ошибочными считаются те, которые не имеют ключевые фразы и тогда, при автоматическом разделении отзывов, они будут отнесены к нейтральным
Я влюбился в это место! Прекрасные виды и уютные зоны отдыха.
Мы с детьми просто в восторге! Отличный парк, стал настоящим открытием.
Парк оставил только разочарование. Всё выглядело гораздо лучше на фото.
Средний уровень, без ярких впечатлений. Можно посетить один раз.
Действительно отличный парк. Заслуживает высокой оценки. Всё было прекрасно.
Парк не стоит потраченных на него денег. Сплошное разочарование.
Приятно удивлён уровнем: отличный парк! Впечатления незабываемые!
Парк оказался очень скучным. Никаких новых впечатлений. Ставлю дизлайк.
Вернусь сюда снова! Отличный парк, оставил самые лучшие впечатления.
Ощущение, что парк уже давно нуждается в обновлении. Разочарован.
Атмосфера в парке просто волшебная. Рекомендую всем друзьям.
Обычный парк, со стандартными развлечениями. Ничего особенного.
Отличный парк для любителей приключений. Нам очень понравилось!
Место совсем не соответствует ожиданиям. Разочарование на каждом шагу.
Количество ошибочно нейтральных: 3 (сами нейтральные считать не нужно, из них 2 позитивных и 1 негативный)
Ключи: отличный парк
и разочарова
Задача №2. Классификация дорожных знаков
1. Создаем модель "Распознавание изображения" на платформе Machine learning for kids.
2. Заполняем данные в обучении модели:
4. Создаём пустую сцену с блоком «Обучить модель» и скачиваем её
5. Переходим на сайт для создания тестовых сцен и создаём сцену
6. Загружаем эту сцену и запускаем.
7. Нажимаем на список ПКМ и нажимаем экспорт
8. Отправляем текстовый файл на проверку
Задача №3. Автопилот
Реагирование автопилота на знаки (сцена с машинкой):
Эффект паралакса (сцена со знаком):
Прежде чем его запустить, обучите свою модель распознавание знаков с изображений. Создайте из модели проект Scratch и уже в него загрузите файл с решением. Затем замените блоки с использованием модели - на блоки своей модели в спрайтах с машинкой и road75.
Задача №4. Сбой портала сбора данных
Первая попытка
#-------------------------------1-------------------------------- reviews.extend(requests.get(f'https://yupest2.pythonanywhere.com/api/v2.0/riviya/get_reviews_by_id/?id={loc["id"]}').json()) #-------------------------------2-------------------------------- for loc in locations['locations']: #-------------------------------3-------------------------------- with open('negative.txt', 'w') as file: #-------------------------------4-------------------------------- file.write(''.join(positive)) #-------------------------------5-------------------------------- with open('postitive.txt', 'w') as file: #-------------------------------6-------------------------------- file.write(''.join(negative)) #-------------------------------7-------------------------------- negative.append(r['review']) #-------------------------------8-------------------------------- else: #-------------------------------9-------------------------------- import <?> locations = requests.get('https://yupest2.pythonanywhere.com/api/v2.0/riviya/get_locations/').json() reviews = [] negative = [] positive = [] #-------------------------------10-------------------------------- for r in <?>: #-------------------------------11-------------------------------- <?>.append(r['review']) #-------------------------------12-------------------------------- if r['rating'] < 4:
- Загрузка нужных библиотек и объявление переменных, в которых будут хранится списки локаций и отзывов. (Блок 9 - требуется загрузка модуля
requests
) - Сбор локаций Ривии, чтобы узнать их идентификаторы (
id
) с помощью функции из API. (Блок 9) - Сбор отзывов по id каждой локации с помощью функции из API. (Блоки 2, 1)
- Проверка каждого отзыва (блок 10 - из списка reviews). Если оценка (
rating
) меньше 4 (блок 12), то отзыв относится к негативному списку (блок 7), а если 4 и выше - позитивному (блоки 8, 11 - добавление отзывов в списокpositive
). - Запись сначала негативных отзывов в файл
negative.txt
(блоки 3, 6), а затем позитивных -positive.txt
(блоки 5,4).
9 requests 2 1 10 reviews 12 7 8 11 positive 3 6 5 4
Вторая попытка
#-------------------------------1-------------------------------- rating = round(sum(stats['ratings'])/len(stats['ratings']), 2) category = loc['category'] #-------------------------------2-------------------------------- if category not in result: #-------------------------------3-------------------------------- file.write(cols+"\n".join(result[<?>])) #-------------------------------4-------------------------------- result[category].append(f"{stats['likes']},{round(visit['<?>'], 2)},{rating}") #-------------------------------5-------------------------------- for loc in locations['locations']: #-------------------------------6-------------------------------- with open(f'stats_by_{category}.csv', 'w') as file: #-------------------------------7-------------------------------- locations = requests.get('https://yupest2.pythonanywhere.com/api/v2.0/omegapolis/get_locations/').json() #-------------------------------8-------------------------------- stats = requests.get(f'https://yupest2.pythonanywhere.com/api/v2.0/omegapolis/get_stats_by_id/?id={loc["<?>"]}').json() visit = requests.get(f'https://yupest2.pythonanywhere.com/api/v2.0/omegapolis/get_average_visits_by_id/?id={loc["id"]}').json() #-------------------------------9-------------------------------- for category in result.keys(): #-------------------------------10-------------------------------- import requests cols = 'like,visits,rating\n' result = {} #-------------------------------11-------------------------------- result[category] = []
- Загрузка нужных библиотек и объявление переменных, для хранения и создания наборов данных. (Блок 10)
- Сбор локаций Омегаполиса, чтобы узнать их идентификаторы (
id
). (Блок 7) - Сбор количественных показателей по
id
каждой локации (блок 5), а именно: количество лайков, оценки пользователей из отзывов и среднее значение посещаемости (блок 8 - обращаемся кid
локации при составлении запроса). - Для оценок отзывов подсчитывается среднее значение, известно, что для каждой локации всегда три оценки (блок 1). После чего, значения записываются в список по категории локации: количество лайков, средний показатель посещаемости и средний рейтинг (блок 4 - получаем среднюю посещаемость по ключу
avg_visits
). При этом, если категория встречается впервые - создаетсяключ-значение
в форматекатегория-пустой список
(блоки 2 и 11, должны стоять перед записью). - Для каждой категории (блок 9) записывается отдельный файл формата
csv
со значениями:like
(количество лайков),visits
(среднее число посещений),rating
(средняя оценка отзывов) (блоки 6 и 3, обращаемся кcategory
, чтобы получить записи по ней).
10 7 5 8 id 1 2 11 4 avg_visits 9 6 3 category
Задачи на классификацию категорий
Почему задача могла быть решена неверно?
- Использовать платформу Machine learning for kids. нужно в Chrome - бразуере или Chromium.
- Регистрация не требуется, нужно заходить через кнопку "Попробовать сейчас".
- Были сделаны ошибки при загрузке экземпляров для обучения модели, так как требовалось разнести файлы по категориям.
- Хранилище при создания проекта было выбрано не Браузер.
Пример задачи из второй попытки:
- достопримечательности (landmarks) - то, что можно посмотреть бесплатно и познакомиться с городом во время прогулок: исторические памятники, парки, пляжи, сады, фонтаны
- и места развлечений (attractions) - помещения с платным входом и развлекательной программой: аквариумы, зоопарки, музеи, театры, торговые центры.
Помогите «Омегаполис» оценить популярность мест по категориям. Какая категория мест имеет высокие оценки и пользуется спросом, а к какой - администрации города стоит присмотреться и улучшить?
Создайте модель классификации («распознавание числа») на платформе Machine learning for kids (https://machinelearningforkids.co.uk/) по числовым признакам:like visits rating
{'like': 50, 'visits': 50, 'rating': 2}
Обучим модель на тренировочных данных. Легенда к изображению №1:
Пример создания проекта для первой попытки:
Нужно было задать параметры модели в точности также, как по условию задачи.
Задачи на вероятность
Модель машинного обучения, заложенная в виртуального помощника, распознает официальные письма с вероятностью 0,9. А иногда с вероятностью 0,01 она определяет тексты неформально переписки, как официальные. Известно, что официальные письма составляют всего 5% от всех писем, поступающих мэру. Найдите вероятность, что очередное письмо, отправленное в мэрию, будет распознано виртуальным секретарем, как официальное.
В случае не выявления брака в первом тесте, разработчики предусмотрели повторный тест изделия. при не выявлении брака в повторном тесте, изделие отправляется в продажу.
Вероятность ложного обнаружения брака моделью составляет 0,005. Найдите вероятность того, что при таком подходе качественное изделие будет забраковано и не попадет в продажу.
Задача №9. Оценка своих успехов
Precision & Recall
Precision = TP / (TP + FP)
и показывает долю объектов, названных нашей моделью положительными и при этом действительно являющимися положительными.
Recall = TP / (TP + FN)
и показывает нам какую долю объектов положительного класса из всех объектов положительного класса нашел алгоритм.