НТО Джуниор
October 23

Разбор Отборочного этапа НТО Junior: Технологии и Искусственный интеллект

Решаемость задач

Решаемость задач по двум попыткам

Процент решаемости показывает долю участников с верными решениями ко всем.

Цвет столбцов соответствует решаемости: самые красные - решили мало, самые зеленые - много.

Решаемость Задач, реализуемых на платформе Machine learning for kids. значительно выше, чем у других, что говорит о том, что новый инструмент был отлично усвоен.

Самыми сложными задачами оказались:

  • Задачи на Автопилот - разработка программного кода с помощью блоков на платформе Scratch. Требовалось в соответствии с алгоритмом действий выстроить правильную последовательность блоков.
  • Сбор данных через API, баллов за нее начислялось больше всего и она требовала знание и понимание кода на языке Python и внимательности при соблюдении формата ввода.
  • Разметка текста - задача для Асессоров на разделение отзывов по настроению: позитивному, негативному и нейтральному. Задача требовала внимательности участников и соблюдение формата ввода.

Задача  №1. Задание для асессоров

1.1. Разметка отзывов по контексту настроения: позитивные, негативные и нейтральные

Разметка отзывов на отрицательные и позитивные на основе личного опыта. Цветом подсветили строки:

  • зеленые - позитивные
  • красные - негативные
  • серые - нейтральные

1.2. Количество ошибочных отзывов vs 1.2. Автоматическая разметка

  1. Определить ключевые слова для формирования однозначного ответа:
    1. Первая попытка: каждый положительный отзыв снабжен фразой «отличный парк», каждый отрицательный ключевой подстрокой «разочарова»
    2. каждый положительный отзыв снабжен фразой «замечательное место», каждый отрицательный «отвратительный сервис»
    3. остальные отзывы нейтральные.
  2. Ошибочными считаются те, которые не имеют ключевые фразы и тогда, при автоматическом разделении отзывов, они будут отнесены к нейтральным

Пример входных данных:

Я влюбился в это место! Прекрасные виды и уютные зоны отдыха.

Мы с детьми просто в восторге! Отличный парк, стал настоящим открытием.

Парк оставил только разочарование. Всё выглядело гораздо лучше на фото.

Дети были в восторге! Отличный парк! просто фантастический!

Средний уровень, без ярких впечатлений. Можно посетить один раз.

Действительно отличный парк. Заслуживает высокой оценки. Всё было прекрасно.

Парк не стоит потраченных на него денег. Сплошное разочарование.

Приятно удивлён уровнем: отличный парк! Впечатления незабываемые!

Парк оказался очень скучным. Никаких новых впечатлений. Ставлю дизлайк.

Вернусь сюда снова! Отличный парк, оставил самые лучшие впечатления.

Ощущение, что парк уже давно нуждается в обновлении. Разочарован.

Атмосфера в парке просто волшебная. Рекомендую всем друзьям.

Обычный парк, со стандартными развлечениями. Ничего особенного.

Отличный парк для любителей приключений. Нам очень понравилось!

Место совсем не соответствует ожиданиям. Разочарование на каждом шагу.

Количество позитивных: 8

Количество негативных: 5

Количество нейтральных: 2

Количество ошибочно нейтральных: 3 (сами нейтральные считать не нужно, из них 2 позитивных и 1 негативный)

Ключи: отличный парк и разочарова

Задача  №2. Классификация дорожных знаков

1. Создаем модель "Распознавание изображения" на платформе Machine learning for kids.

2. Заполняем данные в обучении модели:

Рисунок №1 к решению Задачи №2

3. Обучаем модель

4. Создаём пустую сцену с блоком «Обучить модель» и скачиваем её

Рисунок №2 к решению Задачи №2

5. Переходим на сайт для создания тестовых сцен и создаём сцену

Рисунок №3 к решению Задачи №2

6. Загружаем эту сцену и запускаем.

Рисунок №4 к решению Задачи №2

7. Нажимаем на список ПКМ и нажимаем экспорт
8. Отправляем текстовый файл на проверку

Задача  №3. Автопилот

Реагирование автопилота на знаки (сцена с машинкой):

Эффект паралакса (сцена со знаком):

Проект Scratch с решением

Прежде чем его запустить, обучите свою модель распознавание знаков с изображений. Создайте из модели проект 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:

Алгоритм:

  1. Загрузка нужных библиотек и объявление переменных, в которых будут хранится списки локаций и отзывов. (Блок 9 - требуется загрузка модуля requests)
  2. Сбор локаций Ривии, чтобы узнать их идентификаторы (id) с помощью функции из API. (Блок 9)
  3. Сбор отзывов по id каждой локации с помощью функции из API. (Блоки 2, 1)
  4. Проверка каждого отзыва (блок 10 - из списка reviews). Если оценка (rating) меньше 4 (блок 12), то отзыв относится к негативному списку (блок 7), а если 4 и выше - позитивному (блоки 8, 11 - добавление отзывов в список positive).
  5. Запись сначала негативных отзывов в файл negative.txt (блоки 3, 6), а затем позитивных - positive.txt (блоки 5,4).
Решение задачи №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] = []

Алгоритм:

  1. Загрузка нужных библиотек и объявление переменных, для хранения и создания наборов данных. (Блок 10)
  2. Сбор локаций Омегаполиса, чтобы узнать их идентификаторы (id). (Блок 7)
  3. Сбор количественных показателей по id каждой локации (блок 5), а именно: количество лайков, оценки пользователей из отзывов и среднее значение посещаемости (блок 8 - обращаемся к id локации при составлении запроса).
  4. Для оценок отзывов подсчитывается среднее значение, известно, что для каждой локации всегда три оценки (блок 1). После чего, значения записываются в список по категории локации: количество лайков, средний показатель посещаемости и средний рейтинг (блок 4 - получаем среднюю посещаемость по ключу avg_visits). При этом, если категория встречается впервые - создается ключ-значение в формате категория-пустой список(блоки 2 и 11, должны стоять перед записью).
  5. Для каждой категории (блок 9) записывается отдельный файл формата csv со значениями: like (количество лайков), visits (среднее число посещений), rating (средняя оценка отзывов) (блоки 6 и 3, обращаемся к category, чтобы получить записи по ней).
Решение задачи№4 второй попытки

Ответ для примера:

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:

  • sights - это attractions
  • walking - landmarks
Рисунок №1 к решению Задачи №5

Протестируем результат.

Рисунок №2 к решению Задачи №5

Ответ для примера:

landmarks 76

Пример создания проекта для первой попытки:

Нужно было задать параметры модели в точности также, как по условию задачи.

Задачи на вероятность

Первая попытка:

Модель машинного обучения, заложенная в виртуального помощника, распознает официальные письма с вероятностью 0,9. А иногда с вероятностью 0,01 она определяет тексты неформально переписки, как официальные. Известно, что официальные письма составляют всего 5% от всех писем, поступающих мэру. Найдите вероятность, что  очередное письмо, отправленное в мэрию, будет распознано виртуальным секретарем, как официальное.
Рисунок №1 к решению Задачи №7
Решение задачи №7 - первая попытка

Вторая попытка:

В случае не выявления брака в первом тесте, разработчики предусмотрели повторный тест изделия. при не выявлении брака в повторном тесте, изделие отправляется в продажу.

Вероятность ложного обнаружения брака моделью составляет 0,005. Найдите вероятность того, что при таком подходе качественное изделие будет забраковано и не попадет в продажу.
Решение задачи №7 - вторая попытка

Материалы для самоподготовки:

Задача  №9. Оценка своих успехов

Precision & Recall

Precision = TP / (TP + FP) и показывает долю объектов, названных нашей моделью положительными и при этом действительно являющимися положительными.

Recall = TP / (TP + FN) и показывает нам какую долю объектов положительного класса из всех объектов положительного класса нашел алгоритм.

Расчет recall и precision

Проект Scratch с решением