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

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

Оригинальный исходный код можно найти в [1].

Выбор данных

Вначале нам нужно было выбрать атрибуты, которые следует учитывать для задачи, и найти источники данных, чтобы предоставить нам соответствующие данные. Здесь было важно обратить внимание на атрибуты, которые могут быть результатом страны с низким уровнем дохода, а не атрибут, способствующий объяснению уровня дохода (например, низкие расходы на здравоохранение, скорее всего, будут результатом страны с низким доходом).

Поэтому мы решили использовать данные об импорте и экспорте, природных ресурсах, выбросах CO₂ и рабочих секторах и их вкладе в ВВП.

Кроме того, мы столкнулись с некоторыми трудностями при выборе подходящего года для учета. Поскольку в то время были доступны не все данные за 2021 год, а в 2020 году преобладал COVID, поэтому в данных могли быть некоторые аномалии, мы решили использовать данные за 2019 год.

Все данные можно было скачать из WorldBank [2] и Our World in Data [3].

Предварительная обработка данных

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

Оба источника данных включали как названия стран, так и коды стран (трехзначный код). Мы стандартизировали названия стран с помощью библиотеки dataprep [4]. После этого было легко объединить наборы данных, используя эти атрибуты.

После слияния фрейм данных состоял из 42 атрибутов. Кроме того, мы решили удалить строки, в которых было менее 20 значений, отличных от Nan. Остальные значения NaN были заполнены нулями.

Исследование данных

После предварительной обработки данных мы просмотрели соответствующие значения атрибутов и проверили наличие выбросов и значений, которые просто не имели смысла. Поэтому мы построили диаграммы для каждого атрибута и дополнительно изучили точки данных, превышающие Q3 + 1,5*IQR.

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

Мы продолжали смотреть на распределения переменных и обнаружили, что многие из них были очень асимметричными (пример см. ниже).

Затем мы рассмотрели выходную переменную (ВНД — валовой национальный доход — на душу населения), которая также была очень асимметричной. На этом этапе мы уже поняли, что прогнозы, скорее всего, будут неточными для высоких значений ВНД, поскольку точек данных всего несколько. На графике ниже показано распределение.

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

Машинное обучение

Изучив данные, мы попытались использовать линейную регрессию, чтобы предсказать значение ВНД страны. К сожалению, данные оказались неразделимыми линейно, и прогнозируемые значения были такими экстремальными, как -80 000.

Поэтому мы решили реализовать 5-кратную перекрестную проверку и сравнить регрессор случайного леса, регрессию опорных векторов, регрессию лассо и регрессор K-NN. Кроме того, мы масштабировали данные, используя Min-Max-Scaler и Standard-Scaler, чтобы проверить оптимальный метод масштабирования.

Для каждой из моделей мы запустили CV Grid Search, чтобы также рассмотреть различные значения гиперпараметров и оптимизировать их. В зависимости от модели (например, K-NN) значения гиперпараметров могут иметь огромное влияние на производительность модели в конкретном наборе данных.

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

Best Model: Random Forest Regressor
Final Hyper-Parameters: {'criterion': 'absolute_error', 'min_samples_leaf': 3, 'n_estimators': 75}
RMSE: 10473.221551759796
Explained Variance: 0.5597928858095078
Max Error: 34088.66666666667
Mean Absolute Error: 6195.449645390071
Median Absolute Error: 2092.533333333333

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

Это можно заметить и при просмотре результатов модели. Среднеквадратическое отклонение (которое сильно снижает высокие остатки) довольно высокое, как и максимальная и средняя ошибки. Тем не менее, средняя ошибка довольно низкая.

Важность функции

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

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

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

Во время оценки важности признаков мы выяснили, что, по крайней мере, согласно нашему набору данных, рабочие сектора и выбросы CO₂ были одними из наиболее прогностических и доминировали над переменными, связанными с торговлей (импорт, экспорт).

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

[1] https://github.com/sabrinaherbst/income_level_country

[2] Всемирный банк. Показатели мирового развития. Публикуется на сайте databank.worldbank.org. Получено с: https://databank.worldbank.org/source/world-development-indicators. [Онлайн-ресурс].

[3] Ханна Ричи и Макс Розер (2020). Выбросы CO₂ и парниковых газов. Опубликовано на сайте OurWorldInData.org. Получено с: https://ourworldindata.org/co2-and-other-greenhouse-gas-emissions [онлайн-ресурс].

[4] https://pypi.org/project/dataprep/