การพยากรณ์อากาศด้วย Python Machine Learning สำหรับผู้เริ่มต้น
Thanaporn1045
Posted on April 10, 2023
คุณเคยสงสัยหรือไม่ว่าผู้คนสามารถพยากรณ์อากาศได้อย่างไรและการพยากรณ์อากาศนั้นเชื่อถือได้แค่ไหน
การพยากรณ์อากาศแบบ 7 วันสามารถทำนายสภาพอากาศได้อย่างแม่นยำประมาณ 80% ของเวลาทั้งหมด และการพยากรณ์อากาศแบบ 5 วันสามารถทำนายสภาพอากาศได้อย่างแม่นยำประมาณ 90% ของเวลาทั้งหมด อย่างไรก็ตามการคาดการณ์ 10 วันหรือนานกว่านั้นจะถูกต้องเพียงครึ่งเดียว
การพยากรณ์อากาศเป็นศาสตร์ที่สำคัญซึ่งจะสามารถช่วยรักษาชีวิตและลดความเสียหายต่อทรัพย์สินได้ นอกจากนี้ยังมีความสำคัญต่อการเกษตร ช่วยให้เกษตรกรสามารถติดตามได้ว่าเมื่อใดควรปลูกหรือช่วยปกป้องพืชผลของตนและจะมีความสำคัญมากขึ้นในการวางแผนปีต่อๆไป
ดังนั้นวันนี้เราจะทำการพยากรณ์อากาศแบบง่าย เพื่อทำนายสภาพอากาศที่กำลังจะมาถึงตามข้อมูลที่มีอยู่
การพยากรณ์อากาศเป็น Machine Learning ประเภท Supervised learning
แบบ Regression ซึ่งก็คือการนำเอาข้อมูลหรือตัวแปรมาหาความสัมพันธ์กัน เพื่อคาดการณ์สิ่งที่จะเกิดขึ้น เช่น สภาพอากาศ
ภาพรวมของโปรเจค
ชุดข้อมูลที่ใช้คือสภาพอากาศในเมือง Seattle จาก Kaggle
ลิงค์ Github ของ Abiyyu Surya Harry ผู้เขียน Blog
Machine Learning models ที่ใช้
1.XGB Classifier
2.K-Nearest Neighbors Classifier
3.AdaBoost Classifier
ซึ่งจะต้อง import libraries ดังนี้
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import os
import plotly.express as px
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from xgboost import XGBClassifier
from neuralprophet import NeuralProphet
from sklearn.preprocessing import LabelEncoder
การวิเคราะห์ข้อมูล
df=pd.read_csv("seattle-weather.csv")
df.shape
df.head()
จากภาพจะเห็นได้ว่า
มี 6 ตัวแปรในชุดข้อมูลนี้ แบ่งเป็น
- 4 ตัวแปรต่อเนื่อง
- 1 ตัวแปรวันที่
- 1 ตัวแปรสภาพอากาศ
df.describe()
df.info()
การจัดทำข้อมูลก่อนการประมวลผล
เราจำเป็นต้องแปลง Dtype บางคอลัมน์เพื่อให้พอดีกับ Machine Learning models ก่อนอื่นเราต้องแปลง Dtype ในวันที่จากวัตถุเป็นวันที่และเวลา
คอลัมน์สภาพอากาศมีค่าข้อมูลในรูปแบบข้อความ แต่เราจำเป็นต้องทำนายข้อมูลสภาพอากาศ จึงต้องแปลงเป็นจำนวนเต็ม
df['date'] = pd.to_datetime(df['date'])
df['weather']=LabelEncoder().fit_transform(df['weather'])
df.info()
จะเห็นได้ว่า Dtype ของข้อมูลมีการเปลี่ยนแปลง ซึ่งสามารถนำมาใช้วิเคราะห์ได้แล้ว
การวิเคราะห์ข้อมูลเชิงสำรวจ
จัดทำกราฟแท่งเปรียบเทียบอุณหภูมิต่ำสุดและสูงสุดในแต่ละปี
plt.figure(figsize = (15, 5))
fig = plt.plot(df['date'], df[['temp_min', 'temp_max']])
plt.grid();
เราจะเห็นว่าทุกๆปีมีการเปลี่ยนแปลงอุณหภูมิอย่างเป็นรูปแบบ
plt.figure(figsize = (15, 5))
fig2 = plt.plot(df['date'], df[['precipitation', 'wind']])
plt.grid();
เมื่อทำการขยายเพื่อดูแต่สภาพอากาศใน 1 ปี
df['month'] = df['date'].dt.month_name(locale='English')
fig = px.box(df, df.month, ['temp_min', 'temp_max'])
fig.update_layout(title='Warmest and Coldest Monthly Tempratue.')
fig.show(
จากภาพจะเห็นได้ว่า ธันวาคมมีวันที่หนาวที่สุดในรอบปี ในขณะที่เดือนสิงหาคมมีวันที่ร้อนที่สุดในรอบปี เดือนธันวาคมมีค่าเบี่ยงเบนมาตรฐานน้อยที่สุด ซึ่งหมายความว่าอุณหภูมิเปลี่ยนแปลงน้อยที่สุด ในขณะที่เดือนกรกฎาคมมีค่าเบี่ยงเบนมาตรฐานมากที่สุด
plt.figure(figsize=(12,7))
sns.heatmap(df[["precipitation","temp_max","temp_min","wind"]].corr(),annot=True,cmap='coolwarm');
เราจะเห็นว่า wind และ preception มีความสัมพันธ์กันเพียงเล็กน้อย ในทางกลับกัน temp_max และ precipitation มีความสัมพันธ์เชิงลบ ซึ่งหมายความว่าพวกมันเคลื่อนที่ไปในทิศทางตรงกันข้าม คล้ายกับ temp_max และ wind
การฝึก Machine Learning Model
features=["precipitation", "temp_max", "temp_min", "wind"]
X=df[features]
y=df.weather
X_train, X_test, y_train,y_test = train_test_split(X, y,random_state = 0)
XGB Classifier
xgb = XGBClassifier()
xgb.fit(X_train,y_train)
print("XGB Accuracy:{:.2f}%".format(xgb.score(X_test,y_test)*100))
XGB Accuracy:78.42%
K-Nearest Neighbors Classifier
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
print("KNN Accuracy:{:.2f}%".format(knn.score(X_test,y_test)*100))
KNN Accuracy:72.68%
AdaBoost Classifier
ab = AdaBoostClassifier()
ab.fit(X_train, y_train)
print("AB Accuracy:{:.2f}%".format(ab.score(X_test,y_test)*100))
AB Accuracy:84.70%
เราได้ค่า accuracy สูงสุดใน AdaBoostClassifier ดังนั้นจึงเลือกใช้โมเดลนี้
การปรับปรุงโมเดลของเรา
ทดลองไฮเปอร์พารามิเตอร์ปรับแต่งโมเดลของเราโดยใช้ GridSearchCV
parameters = {
'learning_rate': [1, 2, 3],
'n_estimators': [100, 500, 1000]
}
cv = GridSearchCV(ab, param_grid=parameters, scoring='f1_micro', n_jobs=-1, verbose=3)
cv.fit(X_train, y_train)
#predicting values from GridSearchCV
y_pred = cv.predict(X_test)
# show classification report on test data
print(classification_report(y_test.values, y_pred, zero_division=1))
เราได้ปรับปรุงเล็กน้อยในโมเดลของเราโดยใช้การปรับไฮเปอร์พารามิเตอร์
ทดสอบการป้อนข้อมูลของผู้ใช้
input=[[1.140175,8.9,2.8,2.469818]]
ot = ab.predict(input)
print("The weather is:")
if(ot==0):
print("Drizzle")
elif(ot==1):
print("Fog")
elif(ot==2):
print("Rain")
elif(ot==3):
print("snow")
else:
print("Sun")
เราได้ผลลัพธ์ของเราแล้ว แบบจำลองนี้ต้องการรับค่า “precipitation”, “temp_max”, “temp_min” และ “wind”
สรุป
บทความนี้เป็นการพยากรณ์สภาพอากาศอย่างง่าย โดยพยากรณ์สภาพอากาศจากความสัมพันธ์ของหยาดน้ำฟ้า, อุณหภูมิสูงสุด, อุณหภูมิต่ำสุด และลม ที่ได้จากวิเคราะห์ของ Machine Learning model ซึ่งได้ผลลัพธ์เป็นสภาพอากาศที่คาดว่าจะเกิดขึ้น แน่นอนว่าโมเดลของเราไม่ก้าวหน้าเท่าโมเดลที่ใช้ในโทรทัศน์ ในอนาคตเราสามารถใช้แบบจำลองนี้เพื่อช่วยปรับปรุงแหล่งพลังงานหมุนเวียนของเราให้มีความน่าเชื่อถือและมีประสิทธิภาพมากยิ่งขึ้น ตัวอย่างเช่น เราสามารถระบุรูปแบบและตำแหน่งทางภูมิศาสตร์ที่เหมาะสมในการตั้งโรงไฟฟ้าพลังงานแสงอาทิตย์และพลังงานลม
แหล่งที่มา
บทความต้นฉบับ : Weather Forecasting with Python Machine Learning (Beginner) เขียนโดย Abiyyu Surya Harry
Codeและรูปภาพ : Weather Forecasting โดย kokobiyu
Posted on April 10, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 30, 2024