Природные ресурсы играют важную роль в жизни, но природные опасности, такие как тропические циклоны, землетрясения, цунами, оползни и засухи в различных районах, препятствуют устойчивому развитию человека и живых существ. Увеличение глобального потепления увеличивает вероятность стихийных бедствий, связанных с климатом, таких как аномальная жара, засуха и лесные пожары.
Лесной пожар — это непредсказуемый, незапланированный и неконтролируемый пожар, который может быть вызван различными видами деятельности человека, такими как угольные пласты, разведение костров, курение, сжигание обломков и поджогов, несанкционированное сжигание, фейерверки, стрельба, взрывы целей или различные природные явления, такие как молния, метеорит, вулканическая деятельность, высокая температура, которые могут сжечь естественную растительность, такую как лес, саванна и другие природные экосистемы. В этом исследовании для эксперимента взят набор данных о лесных пожарах от НАСА.
Источник данных
Источник данных, используемый в этом исследовании, получен из спутниковых данных НАСА «Информация о пожарах для системы управления ресурсами» (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()
Возможности и описание набора данных
- широта
- долгота
- яркость = температура яркости огня в пикселях, измеренная в Кельвинах
- scan = размер пикселя сканирования
- track = размер трека в пикселях
- acq_date = дата приобретения
- acq_time = время получения
- спутник = спутник Acua и Terra как A и T
- прибор = МОДИС
- достоверность = набор промежуточных величин алгоритма, используемых в процессе обнаружения, и диапазон оценок от 0% до 100%.
- version = Версия определяет источник сбора и обработки данных.
- Bright_t31 = яркостная температура огня из канала 31, измеряемая в Кельвинах.
- frp = мощность излучения огня в мегаваттах
- день/ночь = D и N как день и ночь
- тип = 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
- Визуализация числовых переменных
Давайте сделаем парный график всех числовых переменных
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().
- Среднеквадратическая ошибка (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/
Нажмите на ссылку ниже, чтобы перейти к коду, описанному выше:
Набор данных