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

О, и я дал своему проекту официальное название: MeteoML. Не самое умное имя, но доменное имя было доступно. :)

Зная, что моим источником данных был Open Weather API, в основном из-за затрат, я импортировал список их городов, который дает мне их внутренний идентификатор города, а также широту и долготу. Текущий API погоды, который они предоставляют, предоставляет ряд данных от текущей температуры до облачного покрова, влажности, давления, скорости ветра и многого другого. Я решил импортировать все эти данные и нормализовал их в реляционную серию классов. Помните, что я использую InterSystems IRIS Data Platform, которая ведет себя совсем иначе, чем более традиционная база данных.

В IRIS я решил создать постоянные классы, которые позволяют мне создать класс или модель, имитирующую нужные мне данные. Для тех, кто не знаком с технологией, подумайте о классе как о таблице в базе данных на стероидах. Готовая функциональность позволяет мне создать класс, заполнить свойства данными, а затем просто вызвать %Save() для класса, который сохранит его на диске, так же, как и в SQL.

После этого краткого урока я решил создать классы, которые представляли бы каждый тип данных и связывали их все вместе в CityID. Классы: «Города», «Облака», «Температура», «Погода» и «Ветер». Если кому-то интересно, я буду рад поделиться конкретными подробностями, но для краткости я не буду рассказывать вам об этом здесь.

После того, как мои классы были готовы, я написал процедуру, которая выполняется ежечасно и импортирует текущие погодные условия для каждого города, который я отслеживаю. В настоящее время это 19 972 города, расположенных в Соединенных Штатах. Каждый час я обращаюсь к Open Weather API и запрашиваю текущие условия, а затем заполняю классы, описанные выше, данными и сохраняю их после проверки, чтобы убедиться, что это не повторяющаяся запись.

Поскольку я плачу за обновления только каждые два часа, это означает, что ежечасный запуск может означать, что я дублирую погоду и могу исказить свои результаты. Чтобы избежать этого, я гарантирую, что CityID и DateTime еще не существуют. Если да, то я пропускаю этот час и иду к следующему городу. Удивительно, но этот процесс занимает в среднем 45 минут.

Поскольку мне разрешено 600 вызовов API в минуту, а в настоящее время я использую только около 350, я решил начать включать и другие данные. Эти данные включают текущие уровни углекислого газа, двуокиси азота, двуокиси серы, озона и УФ-индекс для каждого города. В целом я получаю почти 1 Гб данных в день, если все работает, как задумано.

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

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

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