SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

2020华为云大数据挑战赛-热身赛(1)

发表于 2020-04-22 更新于 2022-03-05 分类于 计算机 , 技术 , Python 阅读次数: Valine:
本文字数: 11k 阅读时长 ≈ 10 分钟

赛题分析及数据观察

  我们的数据集是从2019年1月12日到2019年2月8日。要预测的数据是2019年2月11日和2019年2月14日,分别是春节放假结束的第一天和情人节。

  原始数据格式如下:

time cross direction leftFlow straightFlow
2019/1/12 00:00:00 wuhe_zhangheng east 3 8
2019/1/12 00:05:00 wuhe_zhangheng east 1 8

  总计865600条数据。

  包括六个路口:

  • 'wuhe_jiaxian' :五和路-稼先路
  • 'chongzhi_jiaxian' :冲之大道-稼先路
  • 'wuhe_longping' :五和路-隆平路
  • 'chongzhi_longping' :冲之大道-隆平路
  • 'wuhe_zhangheng' :五和路-张衡路
  • 'chongzhi_beier' :冲之大道-贝尔路

五和大道张衡路路口百度地图/@12698199.237145107,2573060.838976027,18.22z/maplayer%3Dtrafficrealtime?uid=844a750e00bd63b8626858cb&ugc_type=3&ugc_ver=1&device_ratio=2&compat=1&querytype=detailConInfo&da_src=shareurl)

  将五和张衡路口的四个方向流量总和数据可视化:

  可见数据有明显的周期性(以天为周期),其中1月有长达两天半的缺失值。在2月4日开始进入春节假期,车流量明显减少。

参考资料:

  • 2020中国高校计算机大赛·华为云大数据挑战赛-热身赛
  • 2020中国高校计算机大赛·华为云大数据挑战赛热身赛——交通流量预测赛题分析4.19更新版(持续更新!!!)
  • 2020中国高校计算机大赛·华为云大数据挑战赛热身赛—EDA

获取天气数据

  通过天气网站获取深圳2019年1月和2月的天气:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
日期,白天天气,夜间天气,白天气温,夜间气温,白天风向,白天风级,夜间风向,夜间风级
2019年01月01,多云,多云,15℃,9℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月02,阴,阴,14℃,10℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月03,阴,阴,16℃,12℃,东北风,3-4级,东北风,3-4级
2019年01月04,阴,阴,19℃,15℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月05,多云,多云,21℃,16℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月06,多云,多云,20℃,15℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月07,阴,阴,21℃,15℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月08,阴,阴,21℃,17℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月09,阴,阴,19℃,15℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月10,多云,多云,22℃,17℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月11,多云,多云,25℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月12,多云,多云,24℃,20℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月13,多云,多云,23℃,17℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月14,阴,阴,24℃,17℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月15,小雨,阴,20℃,13℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月16,阴,阴,16℃,12℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月17,多云,多云,19℃,12℃,东北风,3-4级,东北风,3-4级
2019年01月18,多云,多云,21℃,13℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月19,多云,多云,21℃,16℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月20,多云,多云,23℃,12℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月21,多云,多云,19℃,12℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月22,晴,晴,19℃,11℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月23,晴,晴,19℃,12℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月24,晴,晴,21℃,14℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月25,晴,晴,24℃,14℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月26,晴,多云,23℃,12℃,东北风,4-5级,东北风,4-5级
2019年01月27,多云,多云,20℃,12℃,东风,3-4级,东风,3-4级
2019年01月28,晴,晴,22℃,14℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月29,晴,晴,23℃,16℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月30,多云,多云,23℃,16℃,无持续风向,1-2级,无持续风向,1-2级
2019年01月31,多云,多云,25℃,13℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月01,多云,多云,20℃,15℃,东北风,3-4级,东北风,3-4级
2019年02月02,多云,多云,23℃,17℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月03,多云,多云,26℃,19℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月04,多云,多云,26℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月05,阴,阴,25℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月06,多云,多云,27℃,20℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月07,多云,多云,27℃,20℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月08,多云,多云,28℃,20℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月09,多云,多云,24℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月10,阴,多云,21℃,17℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月11,多云,多云,21℃,15℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月12,多云,多云,21℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月13,多云,多云,26℃,19℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月14,多云,多云,26℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月15,多云,多云,26℃,19℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月16,多云,多云,26℃,19℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月17,多云,多云,24℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月18,小雨,小雨,21℃,17℃,东风,3-4级,东风,3-4级
2019年02月19,小雨,多云,22℃,18℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月20,多云,多云,27℃,21℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月21,小雨,小雨,27℃,19℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月22,阴,阴,20℃,16℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月23,中雨,小雨,19℃,15℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月24,小雨,多云,18℃,11℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月25,阴,阴,19℃,13℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月26,多云,多云,22℃,16℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月27,多云,多云,25℃,19℃,无持续风向,1-2级,无持续风向,1-2级
2019年02月28,多云,多云,27℃,19℃,无持续风向,1-2级,无持续风向,1-2级

参考资料:

  • 2020中国高校计算机大赛·华为云大数据挑战赛热身赛——python获取深圳历史天气信息!!
  • 深圳历史天气预报 2019年1月份
  • 深圳历史天气预报 2019年2月份

Baseline

  baseline代码分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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-siribucket-bj4/traffic_flow_dataset') # 将数据从公共库拷贝到自己的OBS桶中
print('Copy procedure is completed !')

OBS_DATA_PATH = "s3://obs-siribucket-bj4/traffic_flow_dataset" # OBS桶数据集存储路径
LOCAL_DATA_PATH = './dataset/train' # 本地数据集存储路径
OBS_MODEL_DIR = "s3://obs-siribucket-bj4/modelfiles/model" # OBS桶模型存储路径
OBS_MODEL_PATH = OBS_MODEL_DIR + "/modelfile.m" # OBS桶模型文件
OBS_CONFIG_PATH = OBS_MODEL_DIR + "/config.json" # OBS桶模型配置文件
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

# 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): # 如果数据是wuhe_zhangheng路口的数据就将其读入
day_data = day_data.append(read_file(caldir, f), ignore_index=True)
return day_data

# get and preprocess data
def get_data(path):
raw_data = pd.DataFrame(columns=["time", "number"]) # 创建一个包含"time", "number"字段的原始数据df
for day in os.listdir(path): # 获取当前文件夹下的所有日期文件夹
raw_data = raw_data.append(read_data_day(path, day)) # 将每一天的数据追加到raw_data中
# 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") # 将时间字符串转换为datetime对象
all_data = pd.DataFrame({
"weekday": df_dt.dt.weekday/6.0, # 将周几转换为浮点数且将数据范围压缩
"timeindex": (df_dt.dt.hour * 60 + df_dt.dt.minute)/(24*60.0), # 将时间转换为索引并将范围压缩到0-1
"number": raw_data["number"].astype(int)}) # 将车流量转换为整形
all_data = all_data.groupby(["weekday", "timeindex"]).mean().reset_index(level = ["weekday", "timeindex"]) # 将四个方向的数据按"weekday", "timeindex"聚合并取均值
return all_data

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)

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)

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!")

  输出结果:

1
2
3
4
5
Copy procedure is completed !
X_train shape is: (1814, 2)
X_test shape is: (202, 2)
MSE: 5.4240
Model training has been completed!

  线上提交成绩:35.6483

  该baseline仅使用了五和张衡路口的交通流量数据,并提取了'weekday','timeindex'两个特征进行训练。在预处理过程中对数据范围做了归一化压缩。
  从题目可知是要预测路口四个方向车流量之和,然而baseline使用的单个方向的均值作为标签,直接将聚合函数由mean改为sum即可获得64.8分。


customize_service

  由于我们提交给服务器的只是训练好的模型,还要对数据做预处理和识别结果后处理,这些操作在与模型文件一同提交的customize_service.py文件中执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# -*- coding: utf-8 -*-
#from main.modelService import PythonBaseService
#from main import log
from model_service.python_model_service import XgSklServingBaseService
from model_service import log
import json
import pandas as pd
from pandas import to_datetime
import numpy as np
import collections

logger = log.getLogger(__name__)

class user_Service(XgSklServingBaseService):

# 对数据做预处理,提取相应特征
# data是batchin中的数据
def _preprocess(self, data):
logger.info("begin to pre process")
json_data = json.loads(data, object_pairs_hook=collections.OrderedDict) # 按字典序将元数据转换为json数据格式,这样我们预测的结果顺序才是对的
days = json_data["req_data"][0].split(",") # 从我们的batchin中获取要预测的时间
df = pd.DataFrame(columns = ["weekday", "timeindex"]) # 创建特征矩阵
# generate X_test time between 5:00-20:55 in requested days
for day in days: # 根据每一天提取相应特征
timestamp = to_datetime(day, format="%Y-%m-%d") # 将字符串转化为datetime对象
df1 = pd.DataFrame({"weekday":(timestamp.dayofweek/6.0), "timeindex":(np.arange(300, 1256, 5))/(24 * 60.0)}) # 分别提取星期几特征与时间索引,时间索引是我们要预测的内容,不用动
df = df.append(df1, ignore_index=True) # 将提取的当天数据特征追加到总特征矩阵中
logger.info("end to pre process")
return df

# 对识别结果做后处理,以满足提交的格式要求,该部分不用改动
# result_data是我们模型预测的结果
def _postprocess(self, result_data):
logger.info("begin to post process")
schema = json.loads('{"wuhe_zhangheng":[1,2,3]}')
schema["wuhe_zhangheng"] = result_data
logger.info("end to post process")
return json.dumps(schema)

2020华为云大数据挑战赛-热身赛(2)

-------- 本文结束 感谢阅读 --------
相关文章
  • 中医药天池大数据竞赛--中药说明书实体识别挑战
  • 2020华为云大数据挑战赛-正式赛(2)
  • 2020华为云大数据挑战赛-正式赛(1)
  • 2020华为云大数据挑战赛-正式赛遇到的问题
  • 2020华为云大数据挑战赛-热身赛(2)
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: 2020华为云大数据挑战赛-热身赛(1)
  • 本文作者: SiriYang
  • 创建时间: 2020年04月22日 - 13时04分
  • 修改时间: 2022年03月05日 - 23时03分
  • 本文链接: https://blog.siriyang.cn/posts/20200422133601id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
学习笔记 Python 机器学习 数据挖掘 竞赛
2020华为云大数据挑战赛-热身赛遇到的问题
Bulls and Cows的Java求解过程遇到的问题
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 赛题分析及数据观察
  2. 获取天气数据
  3. Baseline
  4. customize_service
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%