การพยากรณ์อากาศด้วย Python Machine Learning สำหรับผู้เริ่มต้น
Published: 2023-04-10 19:01:25

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

การพยากรณ์อากาศแบบ 7 วันสามารถทำนายสภาพอากาศได้อย่างแม่นยำประมาณ 80% ของเวลาทั้งหมด และการพยากรณ์อากาศแบบ 5 วันสามารถทำนายสภาพอากาศได้อย่างแม่นยำประมาณ 90% ของเวลาทั้งหมด อย่างไรก็ตามการคาดการณ์ 10 วันหรือนานกว่านั้นจะถูกต้องเพียงครึ่งเดียว

การพยากรณ์อากาศเป็นศาสตร์ที่สำคัญซึ่งจะสามารถช่วยรักษาชีวิตและลดความเสียหายต่อทรัพย์สินได้ นอกจากนี้ยังมีความสำคัญต่อการเกษตร ช่วยให้เกษตรกรสามารถติดตามได้ว่าเมื่อใดควรปลูกหรือช่วยปกป้องพืชผลของตนและจะมีความสำคัญมากขึ้นในการวางแผนปีต่อๆไป

ดังนั้นวันนี้เราจะทำการพยากรณ์อากาศแบบง่าย เพื่อทำนายสภาพอากาศที่กำลังจะมาถึงตามข้อมูลที่มีอยู่

การพยากรณ์อากาศเป็น **Machine Learning** ประเภท **Supervised learning** 
แบบ **Regression** ซึ่งก็คือการนำเอาข้อมูลหรือตัวแปรมาหาความสัมพันธ์กัน เพื่อคาดการณ์สิ่งที่จะเกิดขึ้น เช่น สภาพอากาศ

## **ภาพรวมของโปรเจค**

ชุดข้อมูลที่ใช้คือสภาพอากาศในเมือง Seattle จาก [Kaggle](https://www.kaggle.com/datasets/ananthr1/weather-prediction) 
ลิงค์ [Github](https://github.com/kokobiyu/Weather-Forecasting-with-Classifier) ของ Abiyyu Surya Harry ผู้เขียน [Blog](https://medium.com/@abiyyushofficial/weather-forecasting-with-python-machine-learning-beginner-50bf41ddf4e)

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
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/re7prjaac66bzi8b6uni.jpg)

```
df.head()
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wrzbymicz2c3ctklo7f8.jpg)

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

```
df.describe()
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ie32cgmcts81vqrc6rt6.jpg)

```
df.info()
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b0lscba9z7lr6bwlz3t.jpg)





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

คอลัมน์สภาพอากาศมีค่าข้อมูลในรูปแบบข้อความ แต่เราจำเป็นต้องทำนายข้อมูลสภาพอากาศ จึงต้องแปลงเป็นจำนวนเต็ม
```
df['date'] = pd.to_datetime(df['date'])
df['weather']=LabelEncoder().fit_transform(df['weather'])
```

```
df.info()
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czf0mmp5nu3a4gpeb3lz.jpg)

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

## **การวิเคราะห์ข้อมูลเชิงสำรวจ**
จัดทำกราฟแท่งเปรียบเทียบอุณหภูมิต่ำสุดและสูงสุดในแต่ละปี

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sr6jrykp34gkp3c5eoxz.jpg)

เราจะเห็นว่าทุกๆปีมีการเปลี่ยนแปลงอุณหภูมิอย่างเป็นรูปแบบ
```
plt.figure(figsize = (15, 5))
fig2 = plt.plot(df['date'], df[['precipitation', 'wind']])
plt.grid();
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ylgr2ds1c0co3kgqeabx.jpg)


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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0h38oivjt8moa1i73eim.jpg)

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

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


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztth3x7a2jauj4oae7uj.jpg)
เราจะเห็นว่า 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))
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n0hda931yo7s00i9oh0s.jpg)

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

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

```
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")
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lvi77w1xrildt7qkht6o.jpg)

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

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

**<u>แหล่งที่มา</u>**
_บทความต้นฉบับ_ : [Weather Forecasting with Python Machine Learning (Beginner)](https://medium.com/@abiyyushofficial/weather-forecasting-with-python-machine-learning-beginner-50bf41ddf4e) เขียนโดย Abiyyu Surya Harry

_Codeและรูปภาพ_ : [Weather Forecasting](https://github.com/kokobiyu/Weather-Forecasting-with-Classifier/blob/main/Weather%20Forecasting.ipynb) โดย kokobiyu