1. 程式人生 > 其它 >基於Python使用整合學習實現風速預測模型

基於Python使用整合學習實現風速預測模型

技術標籤:機器學習機器學習python

風速預測
The CSV file includes a hourly/daily summary for Szeged, Hungary area, between 2006 and 2016.
Data available in the hourly response:
time
summary
precipType
temperature
apparentTemperature
humidity
windSpeed
windBearing
visibility
loudCover
pressure
資料檔案下載地址:https://amazecourses.obs.cn-north-4.myhuaweicloud.com/datasets/weatherHistory.csv

請使用整合學習演算法實現風速預測模型,並分析預測的效果。

在決策樹,線性分析之後,整合學習該問題實在是無法手動實現。因此本次的機器學習作業選擇直接呼叫scikit-learn來實現。主要做的工作是選擇機器學習演算法以及資料集預處理。

1. 程式需要使用的python包

from pandas import read_csv
import pandas as pd
from sklearn.model_selection import train_test_split
# 產生樣本資料集
from sklearn.ensemble import GradientBoostingRegressor
from
sklearn.ensemble import AdaBoostRegressor

2. 資料集預處理

def pre_conduct_data(data):
    # print(type(data)):<class 'pandas.core.frame.DataFrame'>
    # data : pd.core.frame.DataFrame
    pd.set_option('mode.chained_assignment', None)
    data = data.dropna(axis=0, how='any')
    data.drop(['Loud Cover'
], axis=1, inplace=True) lables = data['Summary'].unique().tolist() data['Summary'] = data['Summary'].apply(lambda n: lables.index(n)) lables = data['Precip Type'].unique().tolist() data['Precip Type'] = data['Precip Type'].apply(lambda n: lables.index(n)) lables = data['Daily Summary'].unique().tolist() data['Daily Summary'] = data['Daily Summary'].apply(lambda n: lables.index(n)) data['Temperature (C)'] = data['Temperature (C)'].apply(lambda n: (n*10)-(n*10) % 1) data['Apparent Temperature (C)'] = data['Apparent Temperature (C)'].apply(lambda n: (n*10)-(n*10) % 1) data['Humidity'] = data['Humidity'].apply(lambda n: n*100) data['Wind Speed (km/h)'] = data['Wind Speed (km/h)'].apply(lambda n: (n*10)-(n*10) % 1) data['Visibility (km)'] = data['Visibility (km)'].apply(lambda n: (n*10)-(n*10) % 1) data['Pressure (millibars)'] = data['Pressure (millibars)'].apply(lambda n: (n*10)-(n*10) % 1) return data

第一步設定是因為pandas本身庫存在SettingWithCopyWarning的警報提醒,會要求留一份dataFrame的映象備份。但對於我們的演算法沒有本質影響,故選擇遮蔽提醒。
第二步刪除data中存在NaN值的資料元組。
第三步為刪除全為0值,對演算法無幫助的cloudCover。
第四步為將Summary等資料序列化,方便程式計算。
第五步為去除Temperature等資料的小數,加速運算。

3. 程式主函式

if __name__ == "__main__":
    fname = 'D:\Pythonwork\FisherLDA\ensemble_study\dataset\weatherHistory.csv'
    data = load_dataset(fname)
    train = pre_conduct_data(data)
    y = train['Wind Speed (km/h)'].values
    train.drop('Wind Speed (km/h)', axis=1, inplace=True)
    x = train.values
    xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size = 0.1)
    xtrain = xtrain.tolist()
    #print(xtrain)
    rfc = GradientBoostingRegressor(n_estimators=1000)
    gfc = AdaBoostRegressor(n_estimators=1000)
    rfc.fit(xtrain, ytrain)
    gfc.fit(xtrain, ytrain)
    print("GradientBoostingRegressor's score: {}".format(rfc.score(xtest, ytest)))
    print("AdaBoostRegressor's score: {}".format(gfc.score(xtest, ytest)))

利用sklearn的劃分資料集函式劃分csv,在資料預處理後分別使用GradientBoostingRegressor和AdaBoostRegressor進行計算預測,利用sklearn自帶的score來比較演算法優劣。

4. 結果分析
在這裡插入圖片描述
GradientBoostingRegressor的得分遠高於AdaBoostRegressor。
究其原因在於Adaboost對於shortcoming的處理方式是更改資料集樣本權重,這種方式對於離散化,可取樣本數較小的分類迴歸問題可能確實會有比較好的效果,但是面對風速這樣的連續值迴歸問題結果必然是失敗的。即Adaboost本身就不適合該資料集。而GradientBoostingRegressor則是計算損失函式。對於該資料集很適合。