【深度学习】使用Python+PyTorch预测野外火灾
作者 | Aishwarya Srinivasan?
編譯 | VK?
來源 | Towards Data Science
聯合國在實現其可持續發展目標方面面臨的主要障礙之一是與自然災害作斗爭,而造成巨大破壞的首要障礙是野外火災。
作為一名數據科學家,我真的希望為社會帶來積極的變化。在讀到最近在美國科羅拉多州和澳大利亞各地發生的野外火災之后,我開始想知道是否有一種方法可以利用我的技能提前預測這些災難,以便采取一些保護措施。
我在Kaggle上找到了這個數據集,它包含了美國188萬場野外火災,我開始使用PyTorch Lightning建立一個模型。繼續閱讀,看看我是如何使用這個數據集建立一個可以預測野外火災強度的模型的。
氣候變化與野外火災
聯合國可持續發展目標的重點是到2030年實現具體目標,其中涉及教育、貧困、氣候變化和海洋生物等問題。聯合國環境規劃署負責協調聯合國的環境活動,并協助發展中國家制定有利于環境的政策和做法。
我們有10年時間來實現聯合國可持續發展倡議取得成功的目標和指標。
一個繁榮的環境直接影響到聯合國制定的17個可持續發展目標,因此保護和保護環境免受自然和人為災害是聯合國的主要議程之一。根據聯合國的各種報告,野外火災確實影響了氣候變化。隨著全球氣溫的升高,野外火災發生的可能性越來越大,它們對氣候變化產生了重大影響。
2019年,澳大利亞遭遇了歷史上最嚴重的火災之一,由于極端高溫季節,燒毀了約1800萬公頃的土地(相比之下,相當于加州一半的土地)。日益升高的溫度在森林和草原上造成了高度易燃的環境。同樣,亞馬遜森林在2019年也發生火災,導致2240000英畝的燒毀面積。最近,在2020年,加州的野外火災燒毀了4359517英畝的土地。
野外火災產生大量的二氧化碳和溫室氣體,這反過來又提高了全球溫度。火災的微粒被遠距離攜帶,造成空氣污染。這些粒子也會沉積在雪上,導致對陽光的更高吸收。這種現象被稱為氣候反饋回路,它會逐漸惡化氣候條件
用PyTorch Lightning預報野外火災
不同行業的堅定分子做出了多種努力,利用歷史野外火災數據,并考察它們與天氣、旅游等替代數據源的依賴性,建立預測火災發生和強度的模型。在這個文章中,我使用PyTorch Lightning構建了一個機器學習模型。火災強度的預測可以通過事先采取正確的補救措施來對抗火災的影響。[3]
步驟1:連接到數據
從Kaggle下載數據后,我將其攝取到我的python環境中,并將其連接到jupyter筆記本界面。
conn?=?sqlite3.connect("FPA_FOD_20170508.sqlite")在閱讀了數據之后,我需要執行一些探索性的分析,以了解數據的特征及其分布,如下所示。
步驟2:一些探索性的數據分析
了解野外火災在美國不同州的蔓延情況。在這里我們可以看到全美五大野外火災規模。
df?=?pd.read_sql_query("SELECT?SUM(FIRE_SIZE)?AS?SUM_FIRE_SIZE,?State?FROM?Fires?GROUP?BY?State;",?conn) df?=?df.set_index("STATE") df[:5]可視化野外火災統計數據。它也有助于可視化數據,了解每個州的野外火災數量。我們可以用圖形化的方式繪制數據,看看受影響最大的州。
不同州的野外火災規模
df["SUM_FIRE_SIZE"].sort_values(ascending=False)[:15].plot(kind="bar")我們從中得知,AK的人數比其他受到嚴重影響的州高出一倍多。
我們可以試著分析過去幾年野外火災的數量是如何變化的。
不同年份的野外火災規模
df?=?pd.read_sql_query("SELECT?SUM(FIRE_SIZE)?AS?SUM_FIRE_SIZE,?FIRE_YEAR?FROM?Fires?GROUP?BY?FIRE_YEAR;",?conn) df.set_index("FIRE_YEAR").plot.bar()我們看到在過去十年里,野外火災的強度顯著增加。
在了解了數據所包含的內容之后,我們對火大小的異常值進行簡單的過濾。可以對異常值進行處理或縮放以對所有數據進行建模。為了簡單起見,我們只研究發生最多的野外火災類別。
步驟3:數據處理和訓練測試分割
根據火力大小對數據集進行劃分。
我們只考慮野外火災規模在2000到10000個單位之間的情況。
analyze_df?=?analyze_df[analyze_df.FIRE_SIZE?>?2000] analyze_df?=?analyze_df[analyze_df.FIRE_SIZE?<?10000]將數據集拆分。
首先,我們對數值和離散類變量進行數據轉換。對數值特征進行數據縮放,同時對離散特征進行標簽編碼。然后,合并兩個特征子集。
X?=?analyze_df.drop(columns=["FIRE_SIZE"]) y?=?analyze_df["FIRE_SIZE"]X_numerical?=?X.select_dtypes(include=["float",?"int"]) fill_nan?=?lambda?col:?col.fillna(col.mean()) X_numerical?=?X_numerical.apply(fill_nan) sc?=?StandardScaler() num_cols?=?X_numerical.columns X_numerical?=?pd.DataFrame(sc.fit_transform(X_numerical),?columns=num_cols) for?col?in?X_categorical.columns:le?=?LabelEncoder()X_categorical[col]?=?le.fit_transform(X_categorical[col])X_numerical.reset_index(drop=True,?inplace=True) X_categorical.reset_index(drop=True,?inplace=True)X?=?pd.concat([X_numerical,?X_categorical],?axis=1)訓練測試集分割
現在我們將數據分成80%的train+val和20%的測試集。然后我們進一步將train+val分成80%的訓練和20%的驗證數據集。
X_train_val,?X_test,?y_train_val,?y_test?=?train_test_split(X,?y,?test_size=0.2,?random_state=42) X_train,?X_val,?y_train,?y_val?=?train_test_split(X_train_val,?y_train_val,?test_size=0.2,?random_state=42)步驟4:使用PyTorch Lightning構建模型(這里只顯示了一個片段,請按照下面的鏈接獲取完整代碼)
在本節中,我們開始使用PyTorch Lightning構建一個簡單的回歸神經網絡模型。[2]
我從一個有17個輸入特征的簡單體系結構開始,第一個隱藏層有64個神經元,第二個隱藏層有32個神經元,最后一個是回歸節點。PyTorch Lightning代碼分為不同的部分:模型、數據加載器、優化器和訓練驗證測試步驟。
class?Regression(pl.LightningModule):###?模型?###?def?__init__(self):super(Regression,?self).__init__()self.fc1?=?nn.Linear(17,?64)self.fc2?=?nn.Linear(64,?32)self.fc3?=?nn.Linear(32,?8)self.fc4=?nn.Linear(8,?1)self.dropout=torch.nn.Dropout(0.2)self.training_losses?=?[]def?forward(self,?x):x?=?torch.sigmoid(self.fc1(x))x?=?self.dropout(x)x?=?torch.sigmoid(self.fc2(x))x?=?self.dropout(x)x?=?torch.sigmoid(self.fc3(x))x?=?self.dropout(x)x?=?self.fc4(x)return?x###?訓練?###?#?問:訓練步驟應該是什么樣的#?定義訓練步驟def?training_step(self,?batch,?batch_idx):x,?y?=?batchlogits?=?self.forward(x)train_loss?=?mse_loss(logits,?y)self.training_losses.append(train_loss)#?添加return?{'loss':?train_loss}###?驗證?###?#?問:驗證步驟應該是什么樣的#?定義驗證步驟def?validation_step(self,?batch,?batch_idx):x,?y?=?batchlogits?=?self.forward(x)loss?=?mse_loss(logits,?y)return?{'val_loss':?loss}#?定義validation_epoch_enddef?validation_epoch_end(self,?outputs):avg_loss?=?torch.stack([x['val_loss']?for?x?in?outputs]).mean()return?{'avg_val_loss':?avg_loss}###?測試?###?????#?問:測試步驟應該是什么樣的#?定義測試步驟def?test_step(self,?batch,?batch_idx):x,?y?=?batchlogits?=?self.forward(x)loss?=?mse_loss(logits,?y)predictions_pred.append(logits)predictions_actual.append(y)return?{'test_loss':?loss,?'logits':?logits}#?定義test_epoch_enddef?test_epoch_end(self,?outputs):avg_loss?=?torch.stack([x['test_loss']?for?x?in?outputs]).mean()logs?=?{'test_loss':?avg_loss}??????return?{'avg_test_loss':?avg_loss,?'log':?logs,?'progress_bar':?logs?}###?The?優化器?###?#?問:我將使用什么優化器?#?定義優化器函數:這里我們使用隨機梯度下降def?configure_optimizers(self):return?optim.SGD(self.parameters(),?lr=l_rate)如果你有不同形狀的數據,或者你希望創建一個不同的模型體系結構,你只需在上面的函數中更改模型參數。你可以在上面的configure_optimizers函數中更改模型中使用的優化器。
###?數據加載器?###????? class?WildfireDataLoader(pl.LightningDataModule):???#?問題:你希望如何將數據加載到模型中?#?為數據加載定義函數:訓練/驗證/測試def?train_dataloader(self):train_dataset?=?TensorDataset(torch.tensor(X_train.values).float(),?torch.tensor(y_train.values).float())train_loader?=?DataLoader(dataset?=?train_dataset,?batch_size?=?512)return?train_loaderdef?val_dataloader(self):validation_dataset?=?TensorDataset(torch.tensor(X_val.values).float(),?torch.tensor(y_val.values).float())validation_loader?=?DataLoader(dataset?=?validation_dataset,?batch_size?=?512)return?validation_loaderdef?test_dataloader(self):test_dataset?=?TensorDataset(torch.tensor(X_test.values).float(),?torch.tensor(y_test.values).float())test_loader?=?DataLoader(dataset?=?test_dataset,?batch_size?=?512)return?test_loader步驟5:運行模型
在這里,我們使用數據加載模塊運行Lightning模型,并根據數據擬合。
data_loader_module?=?WildfireDataLoader() model?=?Regression() trainer?=?Trainer(max_epochs?=?200,data_loader_module?)?? trainer.fit(model,?datamodule=?data_loader_module)步驟6:模型的最終結果
我們發現,模型的均方誤差損失為0.2048,與Logistic回歸(blog中未包含的代碼)相比,這稍微好一些。
火災數據似乎有很大的偏差,大部分數據點的火災規模小于10個單位,其他數據點高達5萬個單位以上。數據的這種偏斜使得回歸問題很難解決。此外,數據集包含非常有限的變量。通過合并更多的特征變量和其他數據源(如天氣數據),可以提高模型的性能。
其目的是演示使用Lightning框架構建高級機器學習模型的方法,因此并不代表最佳模型性能,而是提出一種采用數據驅動方法預測野外火災的方法。
參考文獻:
[1]https://towardsdatascience.com/predicting-california-wildfire-size-with-neural-networks-building-a-machine-learning-project-from-db0e57dce4c9
[2]https://github.com/shotleft/how-to-python/blob/master/How%20it%20works%20-%20Bike%20Share%20Regression%20PyTorch%20Lightning.ipynb
[3]https://www.techrepublic.com/article/fighting-fire-with-ai-using-deep-learning-to-help-predict-wildfires-in-the-us/
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 獲取本站知識星球優惠券,復制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【深度学习】使用Python+PyTorch预测野外火灾的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7文件夹属性没有共享标签页的解决方
- 下一篇: Win10本地账户怎么更改为Micros