[上分指南] 2020华为云大数据挑战赛热身赛如何轻松快速提高10分?baseline简单解读与优化思路分享第一弹

[上分指南] 2020华为云大数据挑战赛热身赛如何轻松快速提高10分?baseline简单解读与优化思路分享第一弹

你感受过长期35.6483的绝望吗?
如果你回答是,那么请阅读本文!!

写在前面:大家好!我是练习时长半年的在读本科生数据小白JerryX,各位数据挖掘大佬多多指教!!欢迎大家多多点赞,多多评论,多多批评指正!!

下面,我们一边研究下baseline,一边看看如何脱离35.6483的苦海。

import moxing as mox
mox.file.shift('os', 'mox')
import os
import re
import json
import pandas as pd
from pandas import to_datetime
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib
from collections import OrderedDict

首先是常规操作,入一些必要的

# 获取竞赛数据集:将“obs-mybucket-bj4/myfolder”改成您的OBS桶名及文件夹
import moxing as mox
mox.file.copy_parallel('s3://obs-bdc2020-bj4/traffic_flow_dataset', 's3://obs-mybucket-bj4/traffic_flow_dataset')
print('Copy procedure is completed !')

我们再从华为云的OBS获取本次比赛的数据集traffic_flow_dataset并复制到本地路径下。

OBS_DATA_PATH = "s3://obs-mybucket-bj4/traffic_flow_dataset"
LOCAL_DATA_PATH = './dataset/train'
OBS_MODEL_DIR = "s3://obs-mybucket-bj4/modelfiles/model"
OBS_MODEL_PATH = OBS_MODEL_DIR + "/modelfile.m"
OBS_CONFIG_PATH = OBS_MODEL_DIR + "/config.json"
LOCAL_MODEL_PATH = './modelfile.m'
LOCAL_CONFIG_PATH = './config.json'

接下来,我们宏定义一些路径地址,包括后续调用数据集,保存模型等的路径。


# read data of one day and one direction
def read_file(path, filename):
    calfile = os.path.join(path, filename)
    original = pd.read_csv(calfile, header=None)
    data = pd.DataFrame(columns=["time", "number"])
    data["time"] = original[0]
    data["number"] = original[3] + original[4]
    return data

这个函数正如注释所解释的一样读取一个方向的一天的数据。其中"time"即当日的一些时间片的时间戳,而"number"则是某条路段的某个时间点的某个方向的左转和直行的车流量和

# read data of one day
def read_data_day(path, date):
    day_data = pd.DataFrame(columns=["time","number"])
    caldir = os.path.join(path, date)
    # read data of one day
    for f in os.listdir(caldir):
        if re.match(r'wuhe_zhangheng.*\.csv', f):
            day_data = day_data.append(read_file(caldir, f), ignore_index=True)
    return day_data

这一个函数则是读取某一天的数据,我们可以看到在baseline的实现中利用正则表达式匹配出了"wuhe_zhangheng"这一路口对应的信息,但是却没有考虑到其他路口的流量信息,那么后续如何将其他路口的流量信息引入,来更好地服务于五和张衡路口的流量预测呢?这是一个可以考虑的方向。

# get and preprocess data
def get_data(path):
    raw_data = pd.DataFrame(columns=["time", "number"])
    for day in os.listdir(path):
        raw_data = raw_data.append(read_data_day(path, day))
    # encode time in raw data to weekday and timeindex(the n minutes of the day)
    df_dt = to_datetime(raw_data.loc[:, "time"], format="%Y/%m/%d %H:%M:%S")
    all_data = pd.DataFrame({
        "weekday": df_dt.dt.weekday/6.0,
        "timeindex": (df_dt.dt.hour * 60 + df_dt.dt.minute)/(24*60.0),
        "number": raw_data["number"].astype(int)}) 
    all_data = all_data.groupby(["weekday", "timeindex"]).mean().reset_index(level = ["weekday", "timeindex"])
    return all_data

这个函数就是我们获取数据和构建数据集的一个主要函数了,其中我们可以注意到我们构建的数据集包含三大属性:
(1)weekday:即周次特征的归一化。
(2)timeindex: 即当天的时间戳。
(2)number: 从上面的子函数我们可以得知这一属性代表的是某条路段的某个时间点的某个方向的左转和直行的车流量和。
接下来,上分点来了!!!
注意:看下面这行代码

 all_data = all_data.groupby(["weekday", "timeindex"]).mean().reset_index(level = ["weekday", "timeindex"])

这行代码达到的目的是什么呢,它将给定周次的给定时间戳的所有的流量信息做了分组的平均聚合。 换句话说,它将一个路口的几周的四个车流量做了平均。

平均。。这对吗??
在这里插入图片描述

答案提示:欢迎到隔壁网页仔细阅读分析比赛的评价指标,简单的分析将会创造上10分的快乐!!!
网页链接:2020中国高校计算机大赛·华为云大数据挑战赛热身赛——交通流量预测赛题分析4.19更新版

def train_model():
    X_train, X_test, y_train, y_test = train_test_split(local_data[['weekday','timeindex']], local_data['number'], test_size=0.1, random_state=42)
    print("X_train shape is: " + str(X_train.shape))
    print("X_test shape is: " + str(X_test.shape))
    
    params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,
              'learning_rate': 0.01, 'loss': 'ls'}
    clf = GradientBoostingRegressor(**params)
    clf.fit(X_train, y_train)
    joblib.dump(clf, LOCAL_MODEL_PATH)

    y_predict = clf.predict(X_test)
    mse = mean_squared_error(y_test, y_predict)
    print("MSE: %.4f" % mse)

咳咳,下面继续看看后面的函数吧。这个函数就是模型训练的部分了,利用了梯度提升决策树的模型,同时利用MSE作为模型的评价指标。

def create_config():
    schema_model=json.loads('{"model_algorithm":"gbtree_classification","model_type":"Scikit-learn","runtime":"python3.6","metrics":{},"apis":[{"procotol":"http","url":"/","method":"post","request":{"Content-type":"applicaton/json","data":{"type":"object","properties":{"req_data":{"type":"array","items":[{"type":"string"}]}}}},"response":{"Content-type":"applicaton/json","data":{"type":"object","properties":{"resp_data":{"type":"array","items":[{"type":"number"}]}}}}}]}',object_pairs_hook=OrderedDict)
    schema_model['model_algorithm'] = "gbtree_regression"
    schema_model['model_type'] = "Scikit_Learn"
    with open(LOCAL_CONFIG_PATH, 'w') as f:
        json.dump(schema_model, f)

这个函数进行了一些模型的配置,建议参考相关document进行修改哈。随意修改,bug++

if __name__ == "__main__":
    # copy data from obs to local
    mox.file.copy_parallel(OBS_DATA_PATH, LOCAL_DATA_PATH)
    # read and preprocess data
    local_data = get_data(LOCAL_DATA_PATH)
    # train model
    train_model()
    # create config.json
    create_config()
    # upload model to obs
    mox.file.copy(LOCAL_MODEL_PATH, OBS_MODEL_PATH)
    mox.file.copy(LOCAL_CONFIG_PATH, OBS_CONFIG_PATH)
    print("Model training has been completed!")

这里就是主函数调用的部分了,可以看出整个流程的pipeline还是非常清晰的,对于萌新较为友好。

先简单说怎么多,学业繁忙,就先分享一个上分点啦,后续还会继续进行其他优化思路的分享,欢迎大家持续关注哈~~

在这里插入图片描述

原创文章 11 获赞 24 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43945120/article/details/105755339