Пошаговое руководство по прогнозному моделированию в машинном обучении
В последние годы в глобальном климате увеличилась частота экстремальных погодных явлений, а усиление глобального потепления увеличило вероятность стихийных бедствий, связанных с климатом, таких как аномальная жара, засухи и лесные пожары. С глобальной точки зрения, высокая температура в Испании и других странах в 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 и найдите прекрасную работу