Я присоединился к конкурсу CarrerCon 2019 менее чем за 2 недели до его окончания.

Задача состояла в том, чтобы классифицировать подстилающую поверхность на основе данных датчика инерционных единиц измерения (IMU) движущегося робота. В частности, у нас были: ориентация, угловая скорость и линейное ускорение. Ориентация задавалась в кватернионах, а угловая скорость и линейное ускорение в координатах X, Y, Z. Каждая серия содержит 128 образцов каждого параметра.

Это был довольно небольшой набор данных. Данные поезда составили всего 47 МБ из 3810 уникальных серий, тест проводился между образцами Public Leaderboard 3816 и Частная таблица лидеров 4664.

Счет

Оценка — это простая точность, — среднее количество наблюдений с правильной меткой. В результате мы можем игнорировать редкие классы.

Мой трубопровод был

1. Начать с исследовательского анализа данных
2. Выполнить проектирование признаков
3. Обучить простой случайный лес
4. Обучить более продвинутую модель LightGBM
5. Обучить CNN 1d
6. и, наконец, попробуйте RNN или LSTM

Но в конце концов у меня закончилось время посреди моделирования CNN, поэтому RNN и LSTM были оставлены для более сложных задач.

EDA (исследовательский анализ данных)

Есть некоторые свойства, которые я нашел в данных.

  • среднее значение linear_acceleration_Y положительное, поскольку робот движется в этом направлении
  • среднее значение linear_acceleration_Z близко к ускорению свободного падения -9,8.

Поверхность

Возьмем близкую к цели функцию. Он очень несбалансирован, у нас всего несколько жестких плиток и немного больше ковровой поверхности.

Group_id

Нам был предоставлен group_id, который отражает одно измерение. Таким образом, у нас, вероятно, есть корреляция внутри одной группы. Что намекнуло на то, что для получения чистого балла по стратегии перекрестной проверки k-fold мы должны поместить все образцы из одной группы в группу Train или Test и никогда не распределять между ними (sklearn.model_selection.GroupKFold). Я когда-либо использовал GroupKFold вместо sklearn.model_selection.train_test_split, потому что train_test_split не обращает внимания на группы. И это сработало блестяще и показало отличную корреляцию с общедоступной таблицей лидеров!

Группы также были несбалансированными, у нас были наборы из больших групп, а некоторые из них были очень маленькими.

Целевое распределение по группам.

Поскольку мы видим hard_tiles в одной группе, мы должны исключить hard_tiles из групповой стратегии k-fold. В противном случае у нас не будет его ни в поезде, ни в разложенном виде.

Серия инерциальных измерительных устройств

Давайте поближе познакомимся с сериалом. Изменения ориентации незначительные, гораздо больше изменений угловой скорости и линейного ускорения, наблюдаются даже некоторые периодические структуры.

Вот несколько других популярных ядер с разбором.

Разработка функций

Сила тяжести

Я решил начать с гравитации и вычесть ее из linear_acceleration.

Линейное ускорение показало большой выброс от -119 до 75 м/с, что может означать малую массу робота.

Кстати, кажется, что датчик MUI повернут на 180 градусов вокруг оси y, и в результате мы получаем отрицательные значения для (z, y).

Координаты Эйлера

Нам дали ориентацию в кватернионах из-за проблемы карданного замка.

Хорошее объяснение можно найти там у Гранта Сандерсона и Бена Итера.

Координаты Эйлера показали, что у нас есть джиттер от -pi до +pi для функции euler_gamma. Но поскольку я планировал использовать дельта-гамму Эйлера, исправить это было просто, но мы должны знать

Дополнительно я извлек:

  • альфа, бета линейного ускорения (без гравитации)
  • абс линейное ускорение (без гравитации)
  • абс угловая скорость

Был план получить крутящий момент, но у меня не было времени это сделать.

Увеличение данных

Так как у нас так мало данных, я решил попробовать немного увеличить его: уменьшить сторону окна до 80 сэмплов и слайд с сэмплами шага 4, что показывает довольно хороший результат.

ОТКРЫТЬ: сравнить скользящее окно и без скользящего окна

Случайный лес

Для случайного леса я рассчитал некоторые статистические свойства рядов, такие как минимум, максимум, среднее, стандартное значение и т. д.

Дополнительно я использовал вейвлет «мексиканская шляпа» шириной 2, 4, 8, 16, 32, который показывает отличный результат.

Важность функции для информации о «неровности»

Для базовой линии я попробовал все функции (с ориентацией), и они оказались на вершине важности.

Оценка CV: 0,49532072559815726 +- 0,09113435005814813

Но без ориентации я получил больше баллов:

Оценка CV: 0,5498988181637695 +- 0,11850449759261752

Как мы видим, наиболее важными характеристиками становятся всплески эйлеровой гаммы и линейного ускорения, дельта, бета-медиана и стандартное значение.

Без них остановка классификатора работала хорошо

В конце концов я отказываюсь от функции ориентации, потому что поверхность остается неизменной, несмотря на то, что вы двигаетесь по ней слева направо или справа налево. «Ковер есть ковер, если двигаться по нему на север или на запад». Кроме того, я думал, что ориентация может быть связана с идентификатором группы. Потому что очень вероятно, что робот двигался в одном направлении в одной группе.

Ориентация против идентификатора группы k-fold

Таблица лидеров, ориентация и k-fold

За 2 дня до крайнего срока, когда я начал часто коммитить свои решения в Kaggle, я обнаружил, что почти все мои решения попали в середину общедоступной таблицы лидеров, и даже многие общедоступные ядра получили более высокие баллы.

Поэтому за день до последнего дня я решил изучить общедоступные решения и внимательно изучить обсуждения.

Интересных тем было немного: "The Orientation Sensor" или "Science vs. Alchemy" от Thomas Rohwer он делал почти то же самое, что и я: опускал ориентацию и использовал быстрое преобразование Фурье, в моем случае это были вейвлеты . Но в последней части он отметил, что увидел значительный успех ядер с ориентацией и обнаружил, что серии в группе можно склеивать, поэтому мы можем использовать более длинные серии (1000, кроме 128 образцов).

Другим был пост Маркуса с ядром Недостающее звено…, где он показал простое приложение, которое склеивает серии Train и отдельные серии Test в длинные прогоны с ровной поверхностью. И вся графика выглядела очень естественно.

Утечки ориентации

В тот момент я задумался об утечке данных, попытался воспроизвести результат Маркуса и даже склеил серии Train и Test. Но в нескольких местах у меня было небольшое дрожание между разными поверхностями.

Гипотеза: серии Sticked Train и Test имеют одинаковую поверхность.

Моя гипотеза заключалась в том, что, возможно, мы можем объединить тренировку и тест, и у нас должна быть ровная поверхность в одном прогоне, поэтому, если серия тестов находится в середине поезда, мы можем предположить, что серия тестов имеет одинаковую поверхность и тренировку в этом прогоне.

Я попытался проверить это предположение и получил очень низкий результат.

Это был первый признак того, что что-то не так с залипанием и, по крайней мере, мы можем объединить поезд и тест вместе.

Гипотеза: использовать набор застрявших поездов для увеличения данных.

Хорошо, осталось меньше дня, я решил использовать объединенные данные для создания своей собственной серии, сдвинув окно 128, таким образом, я получил около 18 тыс. серий. Что становится в 6 раз большим набором данных. Конечно, ближайшая серия получила корреляцию, что могло быть проблемой при оценке производительности и, возможно, было проблемой при обучении LGBM, потому что я получил еще более низкий балл, чем в исходном наборе данных.

В то же время я видел, что многие люди получили 1.0 в таблице лидеров, но моя позиция все еще была хуже, чем 50% общедоступной таблицы лидеров.

последние несколько часов я решил больше сосредоточиться на настройке своего решения без утечки ориентации и попробовал CNN1d, разветвленный из ядра Пола Нуссбаума, и он даже показал хорошие результаты на моем локальном тестовом наборе и публичной таблице лидеров. Но это все равно было хуже моего лучшего решения на LGBM.

Поэтому я решил остаться со своим решением LGBM, основанным на небольшом скользящем окне 80.

Встряхнуть, встряхнуть

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

Моя частная и общедоступная оценка для решения LGBM была довольно близкой с той лишь разницей, что модель с функциями ориентации получила меньшую оценку, а без функции ориентации - большую оценку.

Вещи для дальнейшего изучения

Другие решения

1 место Томас Роуэр (1,00 балла)

- ядро простого фурье-анализа

"частота дискретизации составляет около 400 Гц, поэтому на диаграммах вы видите частотный диапазон от 3 до 200 Гц"

- «Датчик ориентации или Наука против алхимии»

3 место @Prithvi дает описание, ядро

Функции

Я использовал функции ускорения и гироскопа без изменений. Использование необработанных функций ориентации не имело для меня смысла, поэтому я использовал разность функций ориентации первого порядка (после преобразования их в углы Эйлера), чтобы зафиксировать любые вибрации, вызванные различными поверхностями.

Также в качестве признаков использовалось БПФ измерений ускорения/гироскопа.

Я: то же, что и я, ожидаю БПФ.

КОММЕНТАРИИ: интересный комментарий от @mvaidhyg:

производная ориентации напрямую связана с угловой скоростью… Я на самом деле провел дифференцирование и увидел, что вычисленные производные очень хорошо совпадают с производными, полученными из угловой скорости, полученные данные немного более зашумлены.

CV

ГруппаKFold (k=3)

Я: то же, что и я, но k=5

Модель

CNN1D (1 слой) + Плотный?

29 место Раджаникант Тенгурия

- краткое описание идей

- БПФ Томаса (1 место)

- Модель: lgbm, случайный лес

– Утечка: связанное обучение и тестирование

Вывод

Ничего нового: не верьте общедоступной таблице лидеров, а сравните ее с результатами местных тестов и оценкой CV вне сгиба.

Попробуйте уменьшить корреляцию данных, чтобы получить более реалистичную оценку на частном тестовом наборе. Не ожидайте, что данные частного теста будут иметь такую ​​же корреляцию, как данные поезда и общедоступного теста.

Многие популярные публичные ядра использовали k-кратное смешивание разных групп наблюдения (так что у нас есть утечка между группами) и получили высокий результат, потому что значения ориентации одной группы обычно были очень компактными.