This project marks the end of the GS4519A course at NCU.
We are using machine learning techniques to predict the likelihood of rain.
Name | Student Number | Divide and Conquer |
---|---|---|
林群賀 | 109601003 | data, GUI, report |
王采琳 | 109601001 | data, code, report |
黃于恩 | 109601501 | data, code, report |
林晴葳 | 109601508 | data, code, report |
吳彥叡 | 109601510 | code, report |
Python version python3.10.1
with gradio, scikit-learn, seaborn, pandas, numpy, matplotlib, joblib
$ pip3 install virtualenv
$ virtualenv venv --python=python3.10.1
$ source venv/bin/activate
$ pip install -r requirements.txt
$ deactivate
$ rm -rf venv # remove the venv
$ pip install virtualenv
$ virtualenv venv
$ venv\Scripts\activate
$ pip install -r requirements.txt
$ deactivate
$ rmdir /s venv # remove the venv
從古自今,天氣一直是影響人類生活和經濟發展的重大因素,因此科學家們不斷在尋找最佳的天氣預測方法,而目前普遍的做法是收集大量的觀測數據(氣溫、濕度、風向和風速、氣壓等等),並利用對大氣物理過程的認識來確定未來某地點大氣層的狀態。但由於大氣過程的複雜,因此現今天氣預測總是存在一定的誤差。
身為大氣系的學生,我們想試看看利用機器學習來預測天氣,就像鐵達尼號和房價預測,先給程式大量的歷史數據,從中尋找相關性高的變數,讓程式去訓練出最佳的預測模式。
我們想要預測五、六月的梅雨,所以上中央氣象局的資料庫下載了平鎮測站過去14年五月和六月的資料。
- 高氣壓:下沉氣流,空氣塊溫度會升高,變乾燥。
- 低氣壓:上升氣流,上升冷卻達到飽和狀態,往往會凝結降雨。
- 地面溫度較低:空氣便會冷卻收縮下沉,形成高壓。
- 地面溫度較高:空氣就會受熱膨脹上升,形成低壓。
風對降雨的影響主要是通過把海洋水汽帶到大陸形成降雨,所以迎風岸降雨較多。
相對濕度是指單位體積空氣中,實際水蒸氣和飽和水氣含量的百分比。
相對濕度愈高,代表環境愈潮濕,也反映了降雨、有霧的可能性。
df.drop(['ObsTime', 'SeaPres', 'StnPresMaxTime', 'StnPresMinTime'], axis = 1, inplace = True)
df.drop(['T Max Time', 'T Min Time', 'Td dew point'], axis = 1, inplace = True)
df.drop(['RHMinTime', 'WGustTime'], axis = 1, inplace = True)
df.drop(['PrecpHour', 'PrecpMax10', 'PrecpMax10Time', 'PrecpMax60', 'PrecpMax60Time'], axis = 1, inplace = True)
df.drop(['SunShine', 'SunShineRate', 'GloblRad', 'VisbMean'], axis = 1, inplace = True)
df.drop(['EvapA', 'UVI Max', 'UVI Max Time', 'Cloud Amount'], axis = 1, inplace = True)
df.info()
df = df.replace('...','-999')
df = df.replace('/','-999')
for i in range(854):
for j in range(0, 13):
if df.iloc[i, j] == '-999':
df.iloc[i, j] = 0.0
df = pd.DataFrame(df, dtype = np.float)
我們先處理降雨量,因為有降水及代表有下雨,所以只要大於大於0就轉換為1,反之轉換為0。
有些資料我們打算用平均值來填補,並取到小數點後第一位
剩下的資料我們以眾數的方式來填補缺失值
X = df.drop(['Precp'], axis=1)
y = df['Precp']
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score
X_train,X_test, y_train,y_test = train_test_split(X, y, test_size=0.3, random_state=67)
lr = LogisticRegression(max_iter=200)
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
accuracy_score(y_test, predictions)
recall_score(y_test, predictions)
precision_score(y_test, predictions)
經過多次交叉測試後,發現什麼都沒有刪除,分數會最高
Predict not rain | Predict rain | |
---|---|---|
True not rain | 149 | 19 |
True rain | 24 | 65 |
import joblib
joblib.dump(lr,'Precipitation_Predict.pkl',compress=3)
- 蒐集更多數據
- 套用數學迴歸方法,且搭配數學公式,如此還可以篩選掉原先的極端值,保留對機器真正有用的學習。