基于機器學(xué)習(xí)的地震預(yù)測(Earthquake Prediction with Machine Learning)
一、地震是什么
地震幾乎是每個人都聽說過或經(jīng)歷過的事情。地震基本上是一種自然發(fā)生的事件,當?shù)貧ぶ型蝗会尫拍芰繉?dǎo)致地面振動或晃動時,就會發(fā)生地震。在地球表面之下,有很大一部分被稱為構(gòu)造板塊,它們構(gòu)成了地球的外層。這些部分經(jīng)常移動并相互作用。由于這種相互作用和運動,這些板塊可能會因摩擦而鎖定,這反過來又會導(dǎo)致壓力增加。
隨著時間的推移,隨著壓力的不斷積累,在某一點上,它達到了一個點,沿著板塊邊界的巖石破裂,釋放出大量儲存的能量。這種釋放出來的能量以地震波的形式在地殼中傳播,從而導(dǎo)致地面震動和顫抖。地震的強度和強度都是用里氏震級來測量的。
二、數(shù)據(jù)組
地震數(shù)據(jù)集包含2001年1月1日至2023年1月1日在世界各地發(fā)生的各種地震的詳細信息。它是與地震事件相關(guān)的結(jié)構(gòu)化數(shù)據(jù)。這些數(shù)據(jù)是由地震研究所、研究機構(gòu)等組織收集和維護的。這個數(shù)據(jù)集可以用來建立和訓(xùn)練各種機器學(xué)習(xí)模型,這些模型可以預(yù)測地震,這將有助于拯救人們的生命,并采取必要的措施來減少造成的損害。
數(shù)據(jù)集可以使用此此鏈接下載: https://www.kaggle.com/datasets/warcoder/earthquake-dataset
該數(shù)據(jù)集總共包含782行和19個屬性(列)。屬性的簡要描述如下:
標題: 指給地震起的名稱/標題
震級: 用來描述地震的強度或強度
日期: 地震發(fā)生的日期和時間
cdi: cdi表示給定地震記錄的最高烈度
mmi: mmi代表修正Mercalli烈度,表示地震的最大儀器報告烈度
alert: 此屬性指的是與特定地震相關(guān)的可能威脅或風險的警報級別
tsunami: 表示本次地震是否引起海嘯
震級: 用來描述地震的嚴重程度。地震的重要性與這個數(shù)字成正比
net: 表示采集數(shù)據(jù)的源的id。
nst: 此屬性用于描述用于確定地震位置的地震臺站的總數(shù)。
dmin: 表示離震中最近的監(jiān)測站的水平距離。
缺口: 用于確定地震的水平位置。數(shù)值越小,表明確定地震水平位置的可靠性越高
magType: 這是指用于計算地震震級的算法類型
深度: 表示地震開始破裂的深度
緯度,經(jīng)度: 用坐標系統(tǒng)表示地震發(fā)生的位置
location: 該國家的具體位置
大陸: 指發(fā)生地震的大陸
country: 表示受地震影響的國家
三、使用的工具和庫
該項目使用了以下Python庫:
● Numpy
● Matplotlib
● Seaborn
● Pandas
● Scikit-learn
四、預(yù)測要求
先決條件是:
NumPy:
- 理解數(shù)組和矩陣運算。
- 能夠有效地進行數(shù)值計算。
Pandas:
- 熟練處理和分析結(jié)構(gòu)化數(shù)據(jù)。
- 了解數(shù)據(jù)框架和系列。
- 能夠處理和預(yù)處理地震數(shù)據(jù),包括清理、過濾和轉(zhuǎn)換數(shù)據(jù)。
Matplotlib:
- 掌握基本的繪圖技術(shù),包括線形圖、散點圖和直方圖。
- 理解子圖,以便在單個圖中創(chuàng)建多個圖。
- 熟悉高級繪圖類型,如熱圖、等高線圖和地理可視化。
Seaborn:
- 了解統(tǒng)計數(shù)據(jù)可視化技術(shù)。
- Seaborn功能的知識,創(chuàng)建視覺吸引力和信息豐富的情節(jié)。
Scikit-learn:
- 熟悉機器學(xué)習(xí)概念,如監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)。
- 了解模型選擇、培訓(xùn)和評估程序。
五、機器學(xué)習(xí)進行地震檢測的步驟
- 導(dǎo)入所需的庫
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
- 導(dǎo)入所需庫后,可以讀取和顯示數(shù)據(jù)集??梢允褂?*read_csv()**函數(shù)讀取數(shù)據(jù)集,并且可以使用head()函數(shù)顯示數(shù)據(jù)集的前5行。
data = pd.read_csv('earthquake_data.csv')
data.head()
輸出:
輸出顯示數(shù)據(jù)集的前5行。
3. 一旦數(shù)據(jù)被讀取,就可以對數(shù)據(jù)進行一些基本的探索性數(shù)據(jù)分析,以獲得對數(shù)據(jù)的一些見解,并對數(shù)據(jù)有更多的了解。
data.info()
輸出:
info()函數(shù)用于獲取有關(guān)數(shù)據(jù)集中存在的屬性、數(shù)據(jù)集中的行數(shù)、每個屬性中缺失值的數(shù)量、每個屬性的數(shù)據(jù)類型等信息。
4. 除了info()函數(shù),description()函數(shù)還可用于獲取數(shù)據(jù)集的統(tǒng)計信息。
data.describe().transpose()
輸出:
description()函數(shù)為屬于數(shù)據(jù)集的所有屬性提供最小值,最大值,平均值,標準差等統(tǒng)計見解。
5. isnull()函數(shù)可用于查找數(shù)據(jù)集中是否存在任何空值,聚合函數(shù)sum()用于獲取數(shù)據(jù)集中每個屬性中空值的總數(shù)。
data.isnull().sum()
輸出:
輸出圖像顯示數(shù)據(jù)集所有屬性中空值的總數(shù)。列alert、continent和country分別有367,576和298個空值。
6. 在獲得關(guān)于數(shù)據(jù)的一些基本見解之后,我們可以繼續(xù)清理數(shù)據(jù)集。清理數(shù)據(jù)集將有助于將其轉(zhuǎn)換為更好的形式,以便以后用于訓(xùn)練各種機器學(xué)習(xí)模型。
features = ["magnitude", "depth", "cdi", "mmi", "sig"]
target = "alert"
data = data[features + [target]]
data.head()
輸出:
在上面給出的代碼中,我們創(chuàng)建了一個名為features的列表,其中包含名為震級,深度,cdi, mmi, sig。我們將使用機器學(xué)習(xí)模型來預(yù)測警報屬性。
警報屬性存儲在一個名為target的變量中。在下一步中,我們將創(chuàng)建一個數(shù)據(jù)框架,并只選擇功能列表中提到的列/屬性以及目標變量。
新數(shù)據(jù)框的前10行可以使用head()函數(shù)顯示。
- 警報屬性中所有值的計數(shù)可以使用餅圖顯示。
plt.figure(figsize = (6,12))
plt.pie(x = data[target].value_counts(), labels = ['blue','orange','green','red'], autopct = '%.2f')
plt.title("Distribution of values in alert column")
plt.legend()
plt.show()
輸出:
餅狀圖顯示警報列中出現(xiàn)的各種值的分布。各種值出現(xiàn)的百分比為:藍色= 78.31%,橙色= 13.49%,綠色= 5.30%,紅色= 2.89%。
8. 前面我們已經(jīng)看到數(shù)據(jù)集中的一些屬性包含某些空值。由于空值不多,因此可以使用dropna()函數(shù)從數(shù)據(jù)集中刪除這些值。
data.dropna(inplace=True)
data.info()
輸出:
使用dropna()函數(shù)刪除空值,在下一行中,使用info()函數(shù)獲取有關(guān)數(shù)據(jù)集的一些基本信息。
9. 在下一步中,我們將對數(shù)據(jù)進行預(yù)處理。在此步驟中,將更改某些屬性的數(shù)據(jù)類型。代碼中將屬性cdi、mmi、sig從int64類型轉(zhuǎn)換為int8類型,將屬性depth從float64類型轉(zhuǎn)換為int16類型。屬性警報也從類型對象轉(zhuǎn)換為類別。這些轉(zhuǎn)換主要是為了內(nèi)存優(yōu)化。轉(zhuǎn)換數(shù)據(jù)類型的其他原因是,使用整數(shù)而不是浮點數(shù)以更好的方式表示數(shù)據(jù)。
data = data.astype({'cdi': 'int8', 'mmi': 'int8', 'sig': 'int8', 'depth': 'int16', 'alert': 'category'})
data.info()
輸出:一旦轉(zhuǎn)換了屬性的數(shù)據(jù)類型,就可以使用info()函數(shù)來顯示屬性關(guān)于屬性及其數(shù)據(jù)類型的信息。
10. 現(xiàn)在,讓我們檢查目標(警報)列中出現(xiàn)的各種值的計數(shù)。我們可以使用條形圖來實現(xiàn)這個目的。
data[target].value_counts().plot(kind='bar', title='Count (target)', color=['green', 'yellow', 'orange', 'red']);
輸出:輸出圖像是一個條形圖,顯示alert屬性中所有值的計數(shù)。的值是綠色,黃色,橙色,紅色。大多數(shù)值是綠色的,其次是黃色、橙色和紅色。
11. 在前面的步驟中,可以看到alert屬性中最常出現(xiàn)的值是綠色的價值。這表明alert屬性是不平衡的,即alert屬性中的值沒有相同的出現(xiàn)次數(shù)。為了克服alert屬性不平衡的問題,我們可以執(zhí)行over-sampling過采樣也有助于模型表現(xiàn)良好,因為它消除了被偏向于出現(xiàn)次數(shù)最高的值的可能性。
X = data[features]
y = data[target]
X = X.loc[:,~X.columns.duplicated()]
sm = SMOTE(random_state=42)
X_res, y_res= sm.fit_resample(X, y,)
y_res.value_counts().plot(kind='bar', title='Count (target)', color=['green', 'orange', 'red', 'yellow']);
在前兩行中,變量X被初始化為名為data的數(shù)據(jù)框。這是一個功能列表先前指定的屬性。變量y是用數(shù)據(jù)框架的目標(警報)列初始化的。在下一行中,代碼從X值中刪除所有重復(fù)的列。只有那些列不會重復(fù),并將存儲在X中。完成此操作后,我們將創(chuàng)建SMOTE算法的一個新實例。SMOTE代表合成少數(shù)過采樣技術(shù)。這是一種常用的解決問題的技術(shù)機器學(xué)習(xí)中的類不平衡。創(chuàng)建SMOTE算法的實例后,可以使用該實例應(yīng)用SMOTE算法對變量X和y進行重采樣,應(yīng)用SMOTE算法得到的值為分別存儲在x_res和y_res變量中。完成后,我們可以使用條形圖繪制y_res變量中的值。
輸出:從柱狀圖中可以明顯看出,y_res變量中存在的所有值具有相同數(shù)量的出現(xiàn)了。
12. 接下來,我們可以使用train_test_split()將數(shù)據(jù)分割為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)函數(shù)。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.2, random_state=42)
注意,在上面的代碼中,我們使用變量X_res和y_res作為獨立變量和因變量分別為。我們使用X_res和y_res,因為它沒有問題alert屬性不平衡。原始數(shù)據(jù)幀在告警中面臨著不平衡的問題屬性。
- 在我們開始在數(shù)據(jù)集上實現(xiàn)模型之前,我們必須使數(shù)據(jù)符合標準這將最終幫助機器學(xué)習(xí)模型以更好的方式理解數(shù)據(jù)。這可以使用StandardScaler()函數(shù)來完成。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
- 我們可以繪制出數(shù)據(jù)集中存在的各種值之間的相關(guān)性。相關(guān)矩陣表示數(shù)據(jù)集中存在的各種變量之間的關(guān)系,以及每個變量如何受到其他變量的影響。也可以使用下面的代碼繪制它。
plt.figure(figsize = (10,6))
sns.heatmap(data.corr(), annot=True, fmt=".2f")
plt.plot()
輸出:
相關(guān)矩陣表示數(shù)據(jù)集中存在的各種值之間的相關(guān)系數(shù)。
15. 下一步,我們可以在訓(xùn)練數(shù)據(jù)集上訓(xùn)練各種機器學(xué)習(xí)模型這些模型的性能可以使用測試數(shù)據(jù)集進行評估。
models = []
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state=42)
dt.fit(X_train, y_train)
可以使用predict()方法對模型進行預(yù)測。模型的性能可以使用指標accuracy_score、classification_report、confusion_matrix。
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
dt_pred = dt.predict(X_test)
print(accuracy_score(dt_pred,y_test)*100)
print(classification_report(dt_pred, y_test))
sns.heatmap(confusion_matrix(dt_pred, y_test), annot = True)
plt.plot()
輸出:出現(xiàn)在混淆矩陣對角線上的值(54,64,60,51)表示被模型正確分類的數(shù)據(jù)點的數(shù)量。從準確性來看得分,顯然決策樹分類器的準確率為88.07%。
16. 我們要實現(xiàn)的下一個模型是KNN。
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
該模型的預(yù)測方式與之前的預(yù)測方式相似
knn_pred = knn.predict(X_test)
print(accuracy_score(knn_pred, y_test)*100)
print(classification_report(knn_pred, y_test))
sns.heatmap(confusion_matrix(knn_pred, y_test), annot = True)
plt.plot()
輸出:
混淆矩陣和準確度分數(shù)可以像前面一樣顯示。從輸出可以明顯看出KNN的準確率為89.23%。
17. 在使用KNN算法之后,我們可以在數(shù)據(jù)集上使用隨機森林分類器。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train)
來自隨機森林分類器的預(yù)測可以使用predict()方法進行。混淆矩陣和準確性評分可以像前面一樣顯示。
rf_pred = rf.predict(X_test)
print(accuracy_score(rf_pred, y_test)*100)
print(classification_report(rf_pred, y_test))
sns.heatmap(confusion_matrix(rf_pred, y_test), annot = True)
plt.plot()
輸出:可以看出隨機森林分類器的準確率為91.15%。
18. 我們將實現(xiàn)的最后一個模型是梯度增強分類器。
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier(random_state=42)
gb.fit(X_train, y_train)
混淆矩陣和精度可以像前面那樣顯示。
gb_pred = gb.predict(X_test)
print(accuracy_score(gb_pred, y_test)*100)
print(classification_report(gb_pred, y_test))
sns.heatmap(confusion_matrix(gb_pred, y_test), annot = True)
plt.plot()
輸出:梯度增強算法的準確率為92.69%。
六、總結(jié)
總之,機器學(xué)習(xí)技術(shù)在地震預(yù)測方面顯示出了很好的結(jié)果。通過分析各種數(shù)據(jù)源,如地震記錄、地理空間信息等,機器學(xué)習(xí)模型可以學(xué)習(xí)模式、趨勢和關(guān)系,這些可以幫助識別潛在的地震發(fā)生。
雖然機器學(xué)習(xí)模型可以幫助預(yù)測地震,但重要的是要注意,這是一個正在進行的研究領(lǐng)域,實現(xiàn)可靠和準確的預(yù)測仍然是一項復(fù)雜的任務(wù)。領(lǐng)域?qū)<液蜋C器學(xué)習(xí)工程師之間的合作努力對于推進該領(lǐng)域和開發(fā)可以幫助早期檢測地震的強大模型至關(guān)重要。
博客主頁:https://blog.csdn.net/weixin_51141489,需要源碼或相關(guān)資料實物的友友請關(guān)注、點贊,私信吧!