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

Лесной пожар — это непредсказуемый, незапланированный и неконтролируемый пожар, который может быть вызван различными видами деятельности человека, такими как угольные пласты, разведение костров, курение, сжигание обломков и поджогов, несанкционированное сжигание, фейерверки, стрельба, взрывы целей или различные природные явления, такие как молния, метеорит, вулканическая деятельность, высокая температура, которые могут сжечь естественную растительность, такую ​​как лес, саванна и другие природные экосистемы. В этом исследовании для эксперимента взят набор данных о лесных пожарах от НАСА.

Источник данных

Источник данных, используемый в этом исследовании, получен из спутниковых данных НАСА «Информация о пожарах для системы управления ресурсами» (FIRMS) и наблюдений за лесными пожарами в Индии в 2021 году с помощью прибора НАСА MODIS (спектрорадиометр с визуализацией среднего разрешения).

Чтение и понимание данных

Импортируйте NumPy и Pandas и прочитайте набор данных MODIS о лесных пожарах.

# Supress Warnings

import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
df = pd.read_csv("modis_2021_India.csv")
# Check the head of the dataset
df.head()

Возможности и описание набора данных

  1. широта
  2. долгота
  3. яркость = температура яркости огня в пикселях, измеренная в Кельвинах
  4. scan = размер пикселя сканирования
  5. track = размер трека в пикселях
  6. acq_date = дата приобретения
  7. acq_time = время получения
  8. спутник = спутник Acua и Terra как A и T
  9. прибор = МОДИС
  10. достоверность = набор промежуточных величин алгоритма, используемых в процессе обнаружения, и диапазон оценок от 0% до 100%.
  11. version = Версия определяет источник сбора и обработки данных.
  12. Bright_t31 = яркостная температура огня из канала 31, измеряемая в Кельвинах.
  13. frp = мощность излучения огня в мегаваттах
  14. день/ночь = D и N как день и ночь
  15. тип = 0 как предполагаемая растительность, 1 как действующий вулкан, 2 как статичный наземный источник 3 как обнаружение на море

df.shape
(111267, 15)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 111267 entries, 0 to 111266
Data columns (total 15 columns):
 #   Column      Non-Null Count   Dtype  
---  ------      --------------   -----  
 0   latitude    111267 non-null  float64
 1   longitude   111267 non-null  float64
 2   brightness  111267 non-null  float64
 3   scan        111267 non-null  float64
 4   track       111267 non-null  float64
 5   acq_date    111267 non-null  object 
 6   acq_time    111267 non-null  int64  
 7   satellite   111267 non-null  object 
 8   instrument  111267 non-null  object 
 9   confidence  111267 non-null  int64  
 10  version     111267 non-null  float64
 11  bright_t31  111267 non-null  float64
 12  frp         111267 non-null  float64
 13  daynight    111267 non-null  object 
 14  type        111267 non-null  int64  
dtypes: float64(8), int64(3), object(4)
memory usage: 12.7+ MB
df.columns
Index(['latitude', 'longitude', 'brightness', 'scan', 'track', 'acq_date',
       'acq_time', 'satellite', 'instrument', 'confidence', 'version',
       'bright_t31', 'frp', 'daynight', 'type'],
      dtype='object')
df.isnull().sum()
latitude      0
longitude     0
brightness    0
scan          0
track         0
acq_date      0
acq_time      0
satellite     0
instrument    0
confidence    0
version       0
bright_t31    0
frp           0
daynight      0
type          0
dtype: int64
df.describe()

Визуализация данных

Визуализируйте наши данные, используя matplotlib и seaborn

import matplotlib.pyplot as plt
import seaborn as sns
  1. Визуализация числовых переменных

Давайте сделаем парный график всех числовых переменных

Seaborn более интегрирован для работы с фреймами данных Pandas. Он расширяет библиотеку Matplotlib для создания красивой графики с помощью Python, используя более простой набор методов. Функция show() просто отображает результат серии операций. Благодаря этому мы можем постепенно дорабатывать множество деталей на рисунке.

sns.pairplot(df)
plt.show()

2. Визуализация категориальных переменных

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

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)
<AxesSubplot:xlabel='daynight', ylabel='confidence'>

Давайте проверим коэффициенты корреляции, чтобы увидеть, какие переменные сильно коррелированы.

plt.figure(figsize=(10, 10))
sns.heatmap(df.corr(),annot=True,cmap='viridis',linewidths=.5)
<AxesSubplot:>

sns.barplot(x='acq_date',y='frp',data=df)
<AxesSubplot:xlabel='acq_date', ylabel='frp'>

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

Подготовка данных

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

Очистка данных — это заполнение пропущенных значений, очистка ненужных данных и преобразование данных с использованием нормализации и выбора признаков.

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

df = df.drop(['instrument', 'version'], axis = 1)
df['satellite'] = df['satellite'].map({'Terra':0,'Aqua':1})
df['daynight'] = df['daynight'].map({'D':0,'N':1})
df['month'] = df['acq_date'].apply(lambda x:int(x.split('-')[1]))
df = df.sample(frac=0.2)
df = df.reset_index().drop("index", axis=1)
df.head()

df.shape
(22253, 13)
y = df['confidence']
firedf = df.drop(['confidence', 'acq_date'], axis = 1)
plt.figure(figsize=(10, 10))
sns.heatmap(firedf.corr(),annot=True,cmap='viridis',linewidths=.5)
<AxesSubplot:>

firedf.head()

Разделение данных на наборы для обучения и тестирования

Разделение набора данных на две части обучающего набора (т.е. 70% данных) и тестового набора (т.е. 30% данных)

X = df[['latitude','longitude','month','brightness','scan','acq_time','bright_t31','daynight']]
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)

Матрица оценки

Чтобы измерить производительность модели с использованием обучающего набора модели машинного обучения, некоторые функции потерь, используемые для оценки, такие как MSE и MAE среди фактических значений и прогнозируемых значений, можно рассчитать, импортировав библиотеку Python scikit-learn как он состоит из предопределенных функций, таких как функция mean_squared_error() и функция mean_absolute_error(). Он также предоставляет предопределенный процесс для оценки R в квадрате как r2_score().

  1. Среднеквадратическая ошибка (MSE)

MSE можно рассчитать математически из среднего квадрата разности фактических значений из набора данных и прогнозируемых значений.

у = фактическое значение у

ŷ = прогнозируемое значение y

п = нет. наблюдений

2. Средняя абсолютная ошибка (MAE)

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

yi = фактическое значение y

ŷi = предсказанное значение y

п = нет. наблюдений

3. Среднеквадратическая ошибка (RMSE)

Математически RMSE можно рассчитать как квадратный корень из средней квадратичной разницы предсказанных значений и фактического значения из данных, или мы можем сказать, что это значение квадратного корня из MSE.

yi = фактическое значение y

ŷi = предсказанное значение y

п = нет. наблюдений

4. Оценка R в квадрате

Оценка R в квадрате может быть рассчитана по уравнению, приведенному ниже:

yi = фактическое значение y

ŷi = предсказанное значение y

ӯ = среднее значение y

Н = нет. наблюдений

Используемый алгоритм

1. Регрессор повышения градиента

Регрессия с повышением градиента вычисляет разницу между текущим прогнозом и известным правильным целевым значением. Чтобы обучить модель, импортируйте класс GradientBoostingRegressor. Мы можем использовать функцию fit(), с помощью которой мы можем подобрать значения для Xtrain и значения для ytrain.

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
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)
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("Performance ofGBR Model R^2 metric {:.5f}".format(model1.score(X_train,y_train)))
print("GBR Accuracy, {:.5f}%".format(model1.score(X_test,y_test)*100))
MSE = 449.63478569897046
RSME = 21.20459350468597
MAE = 3.2932809652939343
R2_score = 0.9227647882671393
Performance ofGBR Model R^2 metric 0.99982
GBR Accuracy, 92.86853%

2. Регрессор дерева решений

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

Чтобы обучить модель, импортируйте класс DecisionTreeRegressor. Мы можем использовать функцию fit(), с помощью которой мы можем подобрать значения для Xtrain и значения для ytrain.

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("Performance of Decision Tree Regressor Model R^2 metric {:.5f}".format(reg.score(X_train,y_train)))
print("Decision Tree Regressor Accuracy, {:.5f}%".format(reg.score(X_test,y_test)*100))
MSE =  362.66616536848414
RSME = 19.043795981066488
MAE = 4.693229478729778
R2 score = 0.9316181035003857
Performance of Decision Tree Regressor Model R^2 metric 1.00000
Decision Tree Regressor Accuracy, 94.24790%

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

categories = ['Training score', 'Testing score', 'RMSE', 'MAE','r2','_']



Decision_Tree_Regressor = [100,94.24, 19.4,4.69, 0.93,0]


Gradient_Boosting_Regressor = [99.97, 92.86, 21.20,3.29, 0.92,0]

label_loc = np.linspace(start=0, stop=2 * np.pi, num=len(Decision_Tree_Regressor))

plt.figure(figsize=(8, 8))
plt.subplot(polar=True)

plt.plot(label_loc, Decision_Tree_Regressor , label='Decision Tree Regression')


plt.plot(label_loc, Gradient_Boosting_Regressor, label='Gradient Boosting Regressor')

plt.title('Algorithms comparison for MODIS dataset', size=20)
lines, labels = plt.thetagrids(np.degrees(label_loc), labels=categories)

plt.legend()
plt.show()

Заключение

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

Предлагаемый подход достиг высокой точности прогнозирования с помощью алгоритмов машинного обучения, таких как регрессор повышения градиента, т. е. 93%, и регрессор дерева решений, т. е. 94%, для набора данных NASA FIRMS. В будущем, учитывая НАСА FIRMS, оперативные данные, используемые для исследования, и предлагаемый метод могут создать среду обучения в реальном времени для эффективного прогнозирования риска лесных пожаров.

Профиль

https://www.linkedin.com/in/monika-singh-b022951b8/

Нажмите на ссылку ниже, чтобы перейти к коду, описанному выше:



Набор данных