基于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)):
    # 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则是计算损失函数。对于该数据集很适合。

你可能感兴趣的:(机器学习,机器学习,python)