Недавно я участвовал в конкурсе машинного обучения по устойчивому развитию от компании MachineHack Wipro и занял 2-е место среди 1900 участников. Это само по себе было сюрреалистичным опытом. Особенно учитывая подход, который я использовал для взлома этого хакатона прогнозирование временных рядов.

Набор обучающих данных был довольно небольшим (~ 175 тыс. записей) и содержал всего 15 признаков. Задача состояла в том, чтобы построить модель прогнозирования для прогнозирования «Clearsky DHI», «Clearsky DNI», «Clearsky GHI» на следующий год, используя данные за последние 10 лет (с интервалом каждые 30 минут).

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

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

Ниже приведены некоторые идеи, которые действительно помогли мне повысить мой балл.

Вывод-1

Все целевые переменные равны 0 между 1:00 и 9:00 (незадолго до восхода солнца). Это было захватывающее открытие, а это означало, что я могу исключить все такие записи, так как для них уже известно целевое значение.

Находка-2

Все целевые переменные равны 0 для солнечного зенитного угла ›= 93 градуса. Еще одно интересное открытие, которое помогло еще больше уменьшить размер обучающего набора данных.

Находка-3

Все целевые переменные сильно коррелированы, и значения DNI и GHI равны 0, когда DHI = 0. Я использовал это в качестве шага постобработки, когда каждый раз, когда модель предсказывала DHI как 0, я по умолчанию устанавливал DNI и GHI также как 0.

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

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

Функции даты и времени

Я начал с получения ниже функций даты и времени.

  • Четверть
  • Неделя
  • День недели
  • Выходные
  • Время года
  • Прошедшее время (с начала месяца)

Также я преобразовал их в циклические функции, используя преобразования синуса и косинуса.

Взаимодействующие функции

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

Функции опережения/отставания

Наконец, я сгенерировал функции опережения-запаздывания, сдвинув различные входные функции на разные временные интервалы.

Используемые модели машинного обучения

EDA и разработка функций, если все сделано правильно, равносильны победе в 75% битвы. Остальное — это выбор и обучение моделей, а гиперпараметры ищут лучшую модель.

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

  • CatBoost (моя лучшая модель)
  • XGBoost
  • СветGBM

Я взял средневзвешенное значение предсказаний модели и занял 2-е место в таблице лидеров.

О, но я забыл упомянуть один важный момент.

Я никогда не делал предсказания временных рядов здесь. Но исключив записи с уже известными целевыми значениями, я по существу преобразовал это в простую задачу регрессии. И в этом прелесть машинного обучения. Бесплатных обедов не бывает, и всегда есть несколько способов содрать с кошки шкуру. Ржу не могу!

Заключение

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

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



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



Продолжайте ML-ing!!