Пошаговое руководство по прогнозному моделированию в машинном обучении

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

Я написал статью на тему лесных пожаров, в которой показано, как создать интерактивную информационную панель с богатым содержанием о ежегодных лесных пожарах в США:



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

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

1. Подготовка набора данных

Набор данных, использованный для этой демонстрации, получен из NASA FIRMS (Система управления пожарной информацией для спасения), которая предоставляет ежегодные сводки активных записей о пожарах в каждой стране, обнаруженных спутниками и измеренных MODIS (спектрорадиометром среднего разрешения). Продукт данных об активном пожаре MODIS обнаруживает пожары в пикселях размером 1 км, которые горят во время эстакады в относительно безоблачных условиях, используя контекстный алгоритм.

Мы можем легко скачать zip-файл по годам с 2000 по 2021 год на их сайте бесплатно:



Каждый zip-файл содержит CSV-файлы практически для всех стран мира. Сегодня мы будем использовать данные по Австралии за 2021 год. Вот ссылка для скачивания на файл modis_2021_Australia.csv.

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

Во-первых, давайте импортируем Numpy и Pandas, а также модуль предупреждений, чтобы просмотреть данные о лесных пожарах в modis_2021_Australia.csv.

import warnings
warnings.filterwarnings('ignore')

import numpy as np
import pandas as pd
df = pd.read_csv("modis_2021_Australia.csv")

df.head()

С веб-сайта MODIS легко понять определения функций в этом наборе данных, поэтому мы поясним некоторые из них:

  • scan = разрешение сканирования
  • track = разрешение дорожки
  • confidence = достоверность возникновения пожара, от 0% до 100%
  • bright_t31 = цветовая температура в туннеле 31 в K (Кельвинах)
  • frp = мощность излучения огня в киловаттах
  • type = 0 предполагаемая растительность, 1 действующий вулкан, 2 других стационарных наземных источника, 3 прибрежных

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

Давайте углубимся.

а) Измерение данных

б) Информация о данных

в) Особенности

г) Проверьте, отсутствуют ли данные

e) Основная статистика функций

3. Анализ данных

Непрерывный анализ распределения полей значений

Мы анализируем и визуализируем данные, в основном, используя библиотеки Matplotlib и Seaborn.

import matplotlib.pyplot as plt
import seaborn as sns

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

sns.pairplot(df) 
plt.show()

Анализ распределения полей категории

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

plt.figure(figsize=(20, 12))
plt.subplot(2,2,1)
sns.boxplot(x = 'satellite', y = 'confidence', data = df)
plt.subplot(2,2,2)
sns.boxplot(x = 'daynight', y = 'confidence', data = df)

Корреляционный анализ

Мы можем использовать расчет корреляции и тепловую карту, сгенерированную Pandas, для выполнения корреляционного анализа данных, что особенно полезно для нас, чтобы понять корреляцию между целевыми переменными frp и другими функциями, как показано ниже:

Если мы хотим узнать подробную корреляцию между confidence и frp.

Или отсортировать по frp:

df_topaffected=df.sort_values(by='frp',ascending=False) 
df_topaffected.head(10)

4. Очистка данных

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

а) Очистка

Во-первых, мы подумали, что track, instrument и version бесполезны в нашем обучении, поэтому просто их отбрасываем:

df = df.drop(['track'], axis = 1)
df = df.drop(['instrument', 'version'], axis = 1)

Затем мы обнаружили, что функции satellite и daynight не являются числовыми данными, поэтому нам нужно преобразовать их в числовые данные:

df['satellite'] = df['satellite'].map({'Terra':0,'Aqua':1})
df['daynight'] = df['daynight'].map({'D':0,'N':1})

Мы также хотим извлечь acq_date, чтобы вместо этого создать month:

df['month'] = df['acq_date'].apply(lambda x:int(x.split('-')[1]))
df = df.drop(['acq_date'], axis = 1)

Посмотрите результат после чистки:

df = df.sample(frac=0.2)
df = df.reset_index().drop("index", axis=1)
df.head()

б) Очищенная тепловая карта

Мы также удалим целевую переменную предсказания frp из корреляционной тепловой карты признаков.

fire_df = df.drop(['confidence', 'frp'], axis = 1)
plt.figure(figsize=(10, 10))
sns.heatmap(fire_df.corr(),annot=True,cmap='viridis',linewidths=.5)

5. Разделение данных

Для эффективного моделирования и оценки модели мы разделили набор данных на обучающий набор (70% данных) и тестовый набор (30% данных). Мы определяем fire_df как набор X и определяем frp как набор y в процессе обучения и тестирования.

X = fire_df
y = df['frp']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

6. Метрики оценки

Мы используем frp в качестве целевой метки. На самом деле, существуют разные методы моделирования. Поскольку эта переменная является непрерывной, задача заключается в моделировании регрессии. У нас есть следующие оценочные показатели, которые можно использовать.

  • MSE — среднеквадратическая ошибка может быть рассчитана на основе среднеквадратичной разницы фактических и прогнозируемых значений набора данных.
  • MAE — Средняя абсолютная ошибка может быть рассчитана как средняя разница между фактическими и прогнозируемыми значениями набора данных.
  • RMSE — среднеквадратическая ошибка может быть рассчитана как квадратный корень из среднеквадратичной разницы между фактическими и прогнозируемыми значениями набора данных, или мы можем сказать, что это значение квадратного корня из MSE.
  • Оценка R-квадрата. Оценка R-квадрата может быть рассчитана по уравнению, приведенному ниже:

7. Моделирование и оценка

а) Регрессия с повышением градиента (GBR)

Мы используем GBR для настройки и можем легко получить доступ к классу GradientBoostingRegressor в Scikit-Learn, используя этот пакет с низким кодом, нам не требуется глубоко исследовать его принцип и реализацию для этого приложения. Для моделирования и прогнозирования GBR требуется всего несколько шагов:

Импортировать sklearn модулей:

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_absolute_error as mae
from sklearn.metrics import mean_squared_error as mse
from sklearn.metrics import r2_score

Создание модели, обучение и прогнозирование (y_pred):

model1 = GradientBoostingRegressor(n_estimators = 100, learning_rate=0.1,
                                  max_depth = 10, random_state = 0, loss = 'ls')
model1.fit(X_train, y_train)
y_pred = model1.predict(X_test)

Оценка y_pred производительности на тестовом наборе:

print ('MSE =',mse(y_pred, y_test))
print ('RSME =',np.sqrt(mse(y_pred, y_test)))
print ('MAE =',mae(y_pred, y_test))
print ('R2_score =',r2_score(y_pred, y_test))
print("GBR Accuracy, {:.5f}%".format(model1.score(X_test,y_test)*100))

Теперь у нас есть удобные результаты на выходе

MSE = 626.0060940209611
RSME = 25.02011378912896
MAE = 4.692727951792414
R2_score = 0.9215091371543757
Performance ofGBR Model R^2 metric 0.99948
GBR Accuracy, 93.67964%

б) Регрессия дерева решений

Мы также можем использовать метод регрессии дерева решений для моделирования, функция в Scikit-Learn определена в классе DecisionTreeRegressor.

Также требуется очень мало строк кода для прогнозирования, как описано выше. Ниже приведен код для реализации и оценки:

from sklearn.tree import DecisionTreeRegressor as dtr
reg = dtr(random_state = 42)
reg.fit(X_train,y_train)
Y_pred = reg.predict(X_test)
print("MSE = ",mse(Y_pred, y_test))
print ('RSME =',np.sqrt(mse(Y_pred, y_test)))
print("MAE =",mae(Y_pred,y_test))
print("R2 score =",r2_score(Y_pred,y_test))
print("Decision Tree Regressor Accuracy, {:.5f}%".format(reg.score(X_test,y_test)*100))

Результат оценки:

MSE =  672.7535572356306
RSME = 25.937493272011285
MAE = 7.482475525831152
R2 score = 0.9183171750707861
Decision Tree Regressor Accuracy, 93.20767%

Вот и все!

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

Повышение уровня кодирования

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

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу