การพยากรณ์อากาศด้วย Python Machine Learning สำหรับผู้เริ่มต้น

thanaporn1045

Thanaporn1045

Posted on April 10, 2023

การพยากรณ์อากาศด้วย Python Machine Learning สำหรับผู้เริ่มต้น

คุณเคยสงสัยหรือไม่ว่าผู้คนสามารถพยากรณ์อากาศได้อย่างไรและการพยากรณ์อากาศนั้นเชื่อถือได้แค่ไหน

การพยากรณ์อากาศแบบ 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
Enter fullscreen mode Exit fullscreen mode

การวิเคราะห์ข้อมูล

df=pd.read_csv("seattle-weather.csv")
Enter fullscreen mode Exit fullscreen mode
df.shape
Enter fullscreen mode Exit fullscreen mode

Image description

df.head()
Enter fullscreen mode Exit fullscreen mode

Image description

จากภาพจะเห็นได้ว่า
มี 6 ตัวแปรในชุดข้อมูลนี้ แบ่งเป็น

  • 4 ตัวแปรต่อเนื่อง
  • 1 ตัวแปรวันที่
  • 1 ตัวแปรสภาพอากาศ
df.describe()
Enter fullscreen mode Exit fullscreen mode

Image description

df.info()
Enter fullscreen mode Exit fullscreen mode

Image description

การจัดทำข้อมูลก่อนการประมวลผล

เราจำเป็นต้องแปลง Dtype บางคอลัมน์เพื่อให้พอดีกับ Machine Learning models ก่อนอื่นเราต้องแปลง Dtype ในวันที่จากวัตถุเป็นวันที่และเวลา

คอลัมน์สภาพอากาศมีค่าข้อมูลในรูปแบบข้อความ แต่เราจำเป็นต้องทำนายข้อมูลสภาพอากาศ จึงต้องแปลงเป็นจำนวนเต็ม

df['date'] = pd.to_datetime(df['date'])
df['weather']=LabelEncoder().fit_transform(df['weather'])
Enter fullscreen mode Exit fullscreen mode
df.info()
Enter fullscreen mode Exit fullscreen mode

Image description

จะเห็นได้ว่า Dtype ของข้อมูลมีการเปลี่ยนแปลง ซึ่งสามารถนำมาใช้วิเคราะห์ได้แล้ว

การวิเคราะห์ข้อมูลเชิงสำรวจ

จัดทำกราฟแท่งเปรียบเทียบอุณหภูมิต่ำสุดและสูงสุดในแต่ละปี

plt.figure(figsize = (15, 5))
fig = plt.plot(df['date'], df[['temp_min', 'temp_max']])
plt.grid();
Enter fullscreen mode Exit fullscreen mode

Image description

เราจะเห็นว่าทุกๆปีมีการเปลี่ยนแปลงอุณหภูมิอย่างเป็นรูปแบบ

plt.figure(figsize = (15, 5))
fig2 = plt.plot(df['date'], df[['precipitation', 'wind']])
plt.grid();
Enter fullscreen mode Exit fullscreen mode

Image description

เมื่อทำการขยายเพื่อดูแต่สภาพอากาศใน 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(
Enter fullscreen mode Exit fullscreen mode

Image description

จากภาพจะเห็นได้ว่า ธันวาคมมีวันที่หนาวที่สุดในรอบปี ในขณะที่เดือนสิงหาคมมีวันที่ร้อนที่สุดในรอบปี เดือนธันวาคมมีค่าเบี่ยงเบนมาตรฐานน้อยที่สุด ซึ่งหมายความว่าอุณหภูมิเปลี่ยนแปลงน้อยที่สุด ในขณะที่เดือนกรกฎาคมมีค่าเบี่ยงเบนมาตรฐานมากที่สุด

plt.figure(figsize=(12,7))
sns.heatmap(df[["precipitation","temp_max","temp_min","wind"]].corr(),annot=True,cmap='coolwarm');
Enter fullscreen mode Exit fullscreen mode

Image description
เราจะเห็นว่า 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)
Enter fullscreen mode Exit fullscreen mode

XGB Classifier

xgb = XGBClassifier()
xgb.fit(X_train,y_train)
print("XGB Accuracy:{:.2f}%".format(xgb.score(X_test,y_test)*100))
Enter fullscreen mode Exit fullscreen mode

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))
Enter fullscreen mode Exit fullscreen mode

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))
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode
#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))
Enter fullscreen mode Exit fullscreen mode

Image description

เราได้ปรับปรุงเล็กน้อยในโมเดลของเราโดยใช้การปรับไฮเปอร์พารามิเตอร์

ทดสอบการป้อนข้อมูลของผู้ใช้

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")
Enter fullscreen mode Exit fullscreen mode

Image description

เราได้ผลลัพธ์ของเราแล้ว แบบจำลองนี้ต้องการรับค่า “precipitation”, “temp_max”, “temp_min” และ “wind”

สรุป

บทความนี้เป็นการพยากรณ์สภาพอากาศอย่างง่าย โดยพยากรณ์สภาพอากาศจากความสัมพันธ์ของหยาดน้ำฟ้า, อุณหภูมิสูงสุด, อุณหภูมิต่ำสุด และลม ที่ได้จากวิเคราะห์ของ Machine Learning model ซึ่งได้ผลลัพธ์เป็นสภาพอากาศที่คาดว่าจะเกิดขึ้น แน่นอนว่าโมเดลของเราไม่ก้าวหน้าเท่าโมเดลที่ใช้ในโทรทัศน์ ในอนาคตเราสามารถใช้แบบจำลองนี้เพื่อช่วยปรับปรุงแหล่งพลังงานหมุนเวียนของเราให้มีความน่าเชื่อถือและมีประสิทธิภาพมากยิ่งขึ้น ตัวอย่างเช่น เราสามารถระบุรูปแบบและตำแหน่งทางภูมิศาสตร์ที่เหมาะสมในการตั้งโรงไฟฟ้าพลังงานแสงอาทิตย์และพลังงานลม

แหล่งที่มา
บทความต้นฉบับ : Weather Forecasting with Python Machine Learning (Beginner) เขียนโดย Abiyyu Surya Harry

Codeและรูปภาพ : Weather Forecasting โดย kokobiyu

💖 💪 🙅 🚩
thanaporn1045
Thanaporn1045

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