风速预测 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则是计算损失函数。对于该数据集很适合。