利用機器學習預測野火

2021-01-11 人工智慧遇見磐創

聯合國在實現其可持續發展目標方面面臨的主要障礙之一是與自然災害作鬥爭,而造成巨大破壞的首要障礙是野火。

在讀到最近在美國科羅拉多州和澳大利亞各地發生的野火之後,我們想知道是否有一種方法可以提前預測這些災難,以便採取一些保護措施。

我們在Kaggle上找到了這個數據集,它包含了美國188萬場野火,我們使用PyTorch Lightning建立一個模型。閱讀後面的內容,一起來看看如何使用這個數據集建立一個可以預測野火強度的模型吧。

氣候變化與野火

聯合國可持續發展目標的重點是到2030年實現具體目標,其中涉及教育、貧困、氣候變化和海洋生物等問題。聯合國環境規劃署負責協調聯合國的環境活動,並協助發展中國家制定有利於環境的政策。

我們有10年時間來實現聯合國可持續發展倡議的目標。

一個繁榮的環境直接影響到聯合國制定的17個可持續發展目標,因此保護環境免受自然和人為災害是聯合國的主要議程之一。根據聯合國的各種報告,野火確實影響了氣候變化。隨著全球氣溫的升高,野火發生的可能性越來越大,它們對氣候變化產生了重大影響。

2019年,澳大利亞遭遇了歷史上最嚴重的火災之一,由於極端高溫季節,燒毀了約1800萬公頃的土地(相比之下,相當於加州一半的土地)。日益升高的溫度在森林和草原上造成了高度易燃的環境。同樣,亞馬遜森林在2019年也發生火災,導致2240000英畝的燒毀面積。最近加州的野火燒毀了4359517英畝的土地。

野火產生大量的二氧化碳和溫室氣體,這反過來又提高了全球溫度。火災的微粒被遠距離攜帶,造成空氣汙染。這些粒子也會沉積在雪上,導致對陽光的更高吸收。這種現象被稱為氣候反饋迴路,它會逐漸惡化氣候條件。

用PyTorch Lightning預報野火

不同行業做出了多種努力,利用歷史野火數據,並考察它們與天氣、旅遊等替代數據源的依賴性,建立預測火災發生和強度的模型。在這個文章中,我使用PyTorch Lightning構建了一個機器學習模型。火災強度的預測可以通過事先採取正確的補救措施來對抗火災的影響。

步驟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.columnsX_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 = batch logits = 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 = batch logits = self.forward(x) loss = mse_loss(logits, y) return {'val_loss': loss} # 定義validation_epoch_end def 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 = batch logits = self.forward(x) loss = mse_loss(logits, y) predictions_pred.append(logits) predictions_actual.append(y) return {'test_loss': loss, 'logits': logits} # 定義test_epoch_end def 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_loader def 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_loader def 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/

相關焦點

  • NSF支持開發野火風險評估計算平臺
    (National Science Foundation)通過「美國繁榮、健康和基礎設施領先工程(LEAP-HI)」計劃資助200萬美元支持一項重大項目,以更好地預測野火造成的破壞性事件。該項目將召集科學家和工程師共同開發一個新的計算平臺,預測火災發生前幾天至幾周的野火風險。這將使野火管理人員、應急人員和公用事業公司能夠更好地預測火災發生的時間和地點,以便其提前規劃和調集資源。項目目標是開發一套系統,用於詳細評估荒地火災的風險,在數天至數周內預警發生重大火災的可能性。
  • 美國航天局利用機器學習人工智慧預測颶風強度 | 章魚通
    不過,在NASA南加州噴氣推進實驗室(Jet Propulsion Laboratory)的科學家領導下,研究人員利用機器學習來開發一種實驗計算機模型,該模型有望大大提高檢測快速強化事件的準確度。科學家和預測員非常善於預測颶風會在哪裡登陸。但預測其強度仍給他們帶來麻煩,因為這取決於周圍環境以及風暴中發生的事情。颶風中的一些特性,比如雨的強度,以及空氣垂直移動的速度,都是難以衡量的。也很難確定哪些內部特點導致這些風暴迅速加劇。
  • 物理所等利用機器學習方法預測材料性能獲進展
    近二十年來,機器學習方法的發展為我們的生活帶來許多便利。智能網絡搜索、語音識別,乃至無人超市、無人駕駛汽車等,依託於機器學習方法的新事物正迅速地在生活中普及。Alpha Go的橫空出世更讓世界驚嘆於人工智慧的潛在價值。在科研領域,大數據的理念正在改變著科研人員對未知世界的探索方式。
  • 「可解釋學習」利用SHAP對分子活性預測機器學習模型進行解釋
    文章利用可解釋學習方法SHAP(SHapley Additive exPlanation)對基於複雜機器學習模型的分子活性預測模型進行解釋,嘗試打開「黑箱」。但是,機器學習模型的難以解釋的特性一直為人們所詬病,尤其是預測精度高的模型往往複雜度更高和規模更大,解釋性(Interpretability)更差。而對於QSAR模型,其中分子結構與活性的關係比起普通的圖像識別任務中標籤和圖片關係更難以理解,這增加了解釋模型的難度。這些複雜的機器學習模型的解釋有著重要的意義,可以提高模型與真實實驗符合程度從而提升模型性能,以及輔助分子作用機理的探索等。
  • 機器學習預測非周期超晶格結構的熱導率
    利用聲子的波動性來調控熱導率是另一種有效的途徑。有研究表明非周期性的超晶格結構相對於周期性的超晶格結構熱導率大幅度降低,甚至可以低於合金的熱導率極限(alloy limit)。典型的超晶格結構如圖1所示,由於非周期結構會使聲子發生局域化,大大抑制了其熱傳輸的能力。
  • 機器學習模型成為NASA最新預測颶風強度的背後技術
    因此,為了預測未來的颶風強度,美國宇航局位於南加州的噴氣推進實驗室的科學家們提出了一種機器學習模型,聲稱可以準確預測颶風未來的快速強度事件。之後,科學家們展示了機器學習模型對大西洋和北太平洋東部地區快速加強的預測技巧,以及從衛星觀測中得出的聯合預測因子。在研究雲衛星數據中的冰和液態水含量時,研究人員意識到,加強型風暴和颶風強度的冰和液態水含量較高,但不一定高於削弱型颶風。因此,根據颶風潛在強度理論,熱帶對流層的外流溫度是決定颶風最大強度的關鍵。這表示,研究能否利用風暴結構的衛星信息來預測熱帶氣旋或颶風的強度是非常必要的。
  • 「蝴蝶效應」也能預測了?看機器學習如何解釋混沌系統
    機器學習的方法能預測到的未來大大延長,比此前的預測方法能預測到的長了八倍,預測效果幾乎和真實情況完全匹配。  而且,這個算法對Kuramoto-Sivashinsky方程式本身一無所知;它只能看到方程式演進的數據。  這使機器學習方法變得更強大。因為,在許多情況下,由於不能確定描述混沌系統的方程式,動力學家無法對它們進行建模和預測。
  • 機器學習新戰果,破解「蝴蝶效應」,預測火焰的下一秒形態
    其中最重要的一個是,在21世紀初,Jaeger和德國混沌理論學家Harald Haas利用一個隨機連接的人工神經元網絡——形成了庫計算中的」庫」——來學習三個混沌系統協同變量的動力學法則。在對這三組數字進行訓練後,網絡可以預測出這三個變量的未來值,且預測範圍之遠令人印象深刻。然而,當有多個相互作用的變量時,計算就變得難以處理了。
  • 謝國彤:疾病預測的機器學習、深度學習和經典回歸方法
    基於經典回歸方法的疾病預測傳統的疾病風險預測主要基於 Cox 比例風險回歸模型(簡稱 Cox 模型)及邏輯回歸模型。例如,[Wang et al. 2003] 發表於 JAMA 的文章利用 Cox 模型,基於弗雷明漢(Framingham)心臟研究來建立房顫患者發生腦卒中及死亡的風險預測模型,方法流程見圖 1。
  • python利用機器學習推理數學公式
    第一類是分類:可以用來進行類型預測,比如是否是廣告郵件,垃圾簡訊,花的種類,動物種類等。第二類是回歸:可以用來進行數值預測。比如預測房價,股票等。第三類是聚類:用於劃分群體。比如哪些是對這個商品的高意向群體,哪些是低意向的等。
  • MIT研究訓練機器學習系統預測人類互動行為
    【天極網IT新聞頻道】近日,MIT計算機科學與人工智慧實驗室(CSAIL)的研究人員研發出一套用於動作預測的機器學習算法,能夠預測人類的互動。研究人員用視頻來訓練這套機器學習系統,以分析並預測人類互動的動作,例如,擁抱、親吻、握手、擊掌等。
  • 大講堂 | 預測時間敏感的機器學習模型建模與優化
    原標題:大講堂 | 預測時間敏感的機器學習模型建模與優化 雷鋒網AI研習社訊:機器學習模型現在已經廣泛應用在越來越多的領域比如地震監測,闖入識別,高頻交易;同時也開始廣泛的應用在行動裝置中比如通過邊緣計算。這些真實世界的應用在原有的模型精度基礎之上帶來很多實際約束比如預測要在很短或規定時間內完成。
  • 鳶尾花預測:如何創建機器學習Web應用程式?
    作為數據科學家或機器學習工程師,能夠部署數據科學項目非常重要,這有助於完成數據科學生命周期。通過既有框架(如Django或Flask)對傳統機器學習模型進行部署,可能是一項艱巨耗時的任務。本文就將展示如何在Python庫中使用streamlit,用不到50行的代碼構建一個簡單的基於機器學習的數據科學web應用程式。
  • 【原創】Johannes小組JCIM論文:用於預測Frequent Hitter的機器學習模型
    利用高通量篩選和虛擬篩選尋找先導化合物的方法被廣泛應用於新藥研發,但「不良化合物」(Badly behaving compounds)的存在使得這類方法的準確性大大下降。不良化合物通常包括「Aggregators」、「反應活性物質」、「假陽性化合物」等等,而他們中大部分都屬於「frequent hitters」。
  • 機器學習:Python中的四種機器學習技巧
    而算法可以利用多種技術來獲得輸出。Python的機器學習技巧機器學習回歸算法倒退就是回到以前的狀態: 一個往往比較落後的狀態。在有關統計學的書籍中,您會發現回歸可以衡量一個變量的平均值和其他值的對應值如何相互關聯。
  • 研究人員發現野火會導致真菌和細菌數量激增,改變微生物群落
    隨著野火變得越來越大,燃得越來越旺,也更難以預測,對植物和動物物種帶來毀滅性打擊。現在,研究人員正在研究這些野火如何影響最微小的森林生物 - 包括細菌和真菌 - 並發現一些微生物在兇猛的野火之後茁壯成長。
  • Python機器學習7:如何保存、加載訓練好的機器學習模型
    本文將介紹如何使用scikit-learn機器學習庫保存Python機器學習模型、加載已經訓練好的模型。學會了這個,你才能夠用已有的模型做預測,而不需要每次都重新訓練模型。本文將使用兩種方法來實現模型的保存和加載:Pickle和joblib。
  • 用於追蹤野火和極端天氣的新一代GOES系列衛星
    最新的進展為在多年的野火舊數據上使用神經網絡模型,然後自動確定野火的出現位置,方法的準確度超過99%。目前使用舊數據的確可以改善對未來火災的預測,但如果林火監測員想要獲取更多火災數據時(如進行方向和熱強度等信息),MODIS則無法達到理想的解析度。
  • 利用機器學習管理車輛傳感器退化
    打開APP 利用機器學習管理車輛傳感器退化 EEWORLD 發表於 2020-11-29 10:29:00 Smith認為機器學習是前進的方向。 Smith表示,機器學習模型可以在汽車傳感器出現故障之前實現模式識別。「汽車工程師可以分析五種不同的傳感器,檢測系統級故障以及更高級別的退化。」 機器學習是未來 汽車行業開始重視傳感器退化問題,但隨著時間的推移,使用一些先進的計算技術,利用機器學習進行退化相關分析的機會非常充足。
  • 機器學習在生命科學中的應用
    機器學習可以應用於drug-develop的所有階段,包括靶標驗證,預後生物標記物的鑑定和試驗中數字pathology數據的分析。目前許多公司已經將投資目標轉向機器學習領域,通過支持機器學習方法的開發,促進drug-develop研發。