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