文章目录

  • 前言
  • 一、简单分析
  • 二、具体程序
    • 1.引入库
    • 2.读入数据
    • 3.数据处理
    • 4.模型训练和预测
    • 5.结果文件输出
  • 总结

前言

本文给出2020年MathorCup高校数学建模挑战赛——大数据竞赛中的赛道A移动通信基站流量预测的baseline,这个题目的具体描述和数据集请见链接。
整个程序是用python写的,步骤包括文件读取、数据处理、特征构造、模型训练和预测、输出文件保存。读者可以在本文的基础上进行模型的提升。

一、简单分析

本文的训练数据有9G左右的大小,且特征字段是中文的,panda读取的时候需要注意。另外,训练数据中含有重复项,程序中直接删除了重复项只保留一个。关于日期字段,训练数据中的格式有两种例如“2018/3/26”和“018-4-09”因此需要分别处理,baseline中的程序使用的是通用的处理方式。需要注意的是,baseline的程序是将两个流量当作关于时间的函数,没有考虑时间序列特性,这里有很大的改进空间。但是如果考虑时序特性的话,不能直接使用程序中的交叉验证方法,这样会存在数据泄露,并且需要考虑对缺失值进行填充。

二、具体程序

1.引入库

import pandas as pd
import numpy as np
from tqdm import tqdm
import os
import lightgbm as lgb
import warnings
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import StratifiedKFold, KFold
import gc
import time

2.读入数据

博主将训练数据和测试数据全都重命名了,其实可以不用,这里读取必须要用gbk编码,这样才能读取中文。另外移植代码的时候注意路径匹配。

train = pd.read_csv('D:/mathorup/traindata.csv',encoding="gbk")
test1 = pd.read_csv('D:/mathorup/test1.csv',encoding="gbk")#短期测试集
test2 = pd.read_csv('D:/mathorup/test2.csv',encoding="gbk")#长期测试集
train.info()

为了方便后续处理,我用英文字段重命名了列名:

new_col = ['DATE', 'HOUR','NAME' , 'LABEL1','LABEL2']
train.columns = new_col
test1.columns = new_col
new_col2 = ['DATE','NAME' , 'LABEL1','LABEL2']
test2.columns = new_col2

输出进行观察:

train.head()
test1.head()
test2.head()

3.数据处理

删除训练数据中的重复列,保留一个:

train = train.drop_duplicates(keep='first')

删除含有缺失值的数据

train = train.dropna()

处理小时、日、月:

train['HOUR'] = train['HOUR'].apply(lambda x: int(x.split(':')[0]))
train['DAY'] = train['DATE'].apply(lambda x: int(x.split('/')[-1][-2:]))
train['MON'] = train['DATE'].apply(lambda x: int(x[5]))

测试集1做相同处理:

test1['HOUR'] = test1['HOUR'].apply(lambda x: int(x.split(':')[0]))
test1['DAY'] = test1['DATE'].apply(lambda x: int(x.split('/')[-1]))
test1['MON'] = test1['DATE'].apply(lambda x: int(x[5]))

输出观察:

train.head(20)

结果如下图所示:

4.模型训练和预测

模型我使用的是LGB模型,参数没有进行过优化,大家可以稍微做一下参数优化。训练和预测我使用了两个随机种子和五折交叉验证:
上行流量预测:

used_feat = ['HOUR','DAY','NAME','MON']
train_x = train[used_feat]
train_y = train['LABEL1']
test_x = test1[used_feat]
print(train_x.shape, test_x.shape)# -----------------------------------------------
scores = []params = {'learning_rate': 0.1, 'boosting_type': 'gbdt', 'objective': 'regression','metric': 'rmse','min_child_samples': 46, 'min_child_weight': 0.01,'feature_fraction': 0.8, 'bagging_fraction': 0.8, 'bagging_freq': 2, 'num_leaves': 16, 'max_depth': 5, 'n_jobs': -1, 'seed': 2019, 'verbosity': -1, }oof_train = np.zeros(len(train_x))
preds = np.zeros(len(test_x))
folds = 5
seeds = [2048, 1997]
for seed in seeds: kfold = KFold(n_splits=folds, shuffle=True, random_state=seed)for fold, (trn_idx, val_idx) in enumerate(kfold.split(train_x, train_y)):print('fold ', fold + 1)x_trn, y_trn, x_val, y_val = train_x.iloc[trn_idx], train_y.iloc[trn_idx], train_x.iloc[val_idx], train_y.iloc[val_idx]train_set = lgb.Dataset(x_trn, y_trn)val_set = lgb.Dataset(x_val, y_val)model = lgb.train(params, train_set, num_boost_round=5000,valid_sets=(train_set, val_set), early_stopping_rounds=25,verbose_eval=50)oof_train[val_idx] += model.predict(x_val) / len(seeds)preds += model.predict(test_x) / folds / len(seeds)del x_trn, y_trn, x_val, y_val, model, train_set, val_setgc.collect()mse = (mean_squared_error(oof_train, train['LABEL1']))print('-'*120)print('rmse ', round(mse, 5))test1['LABEL1'] = preds

下行流量预测:

train_x = train[used_feat]
train_y = train['LABEL2']
test_x = test1[used_feat]
print(train_x.shape, test_x.shape)# -----------------------------------------------
scores = []params = {'learning_rate': 0.1, 'boosting_type': 'gbdt', 'objective': 'regression','metric': 'rmse','min_child_samples': 46, 'min_child_weight': 0.01,'feature_fraction': 0.8, 'bagging_fraction': 0.8, 'bagging_freq': 2, 'num_leaves': 16, 'max_depth': 5, 'n_jobs': -1, 'seed': 2019, 'verbosity': -1, }oof_train = np.zeros(len(train_x))
preds = np.zeros(len(test_x))
folds = 5
seeds = [2048, 1997]
for seed in seeds: kfold = KFold(n_splits=folds, shuffle=True, random_state=seed)for fold, (trn_idx, val_idx) in enumerate(kfold.split(train_x, train_y)):print('fold ', fold + 1)x_trn, y_trn, x_val, y_val = train_x.iloc[trn_idx], train_y.iloc[trn_idx], train_x.iloc[val_idx], train_y.iloc[val_idx]train_set = lgb.Dataset(x_trn, y_trn)val_set = lgb.Dataset(x_val, y_val)model = lgb.train(params, train_set, num_boost_round=5000,valid_sets=(train_set, val_set), early_stopping_rounds=25,verbose_eval=50)oof_train[val_idx] += model.predict(x_val) / len(seeds)preds += model.predict(test_x) / folds / len(seeds)del x_trn, y_trn, x_val, y_val, model, train_set, val_setgc.collect()mse = (mean_squared_error(oof_train, train['LABEL2']))print('-'*120)print('rmse ', round(mse, 5))test1['LABEL2'] = preds

5.结果文件输出

由于我们对原文件做了较大的改动,上交的文件要处理成原文件的格式:

test11 = pd.read_csv('D:/mathorup/test1.csv',encoding="gbk")#短期测试集
test11['上行业务量GB'] = test1['LABEL1']
test11['下行业务量GB'] = test1['LABEL2']
test11.to_csv('短期验证选择的小区数据集.csv', index = False)
test11.head()

总结

本文仅仅给出了一种简单的方法,打通了整个流程,还有很大的提升空间,比如考虑时序特性、数据相关性分析、改用LSTM等神经网络模型等等。

MathorCup高校数学建模挑战赛——大数据竞赛 赛道A 移动通信基站流量预测baseline相关推荐

  1. 2022年第三届MathorCup高校数学建模挑战赛——大数据竞赛(baseline)

    教育部<高等学校人工智能创新行动计划>教技[2018]3号,鼓励对计算机专业类的智能科学与技术.数据科学与大数据技术等专业进行调整和整合,鼓励各个领域与大数据进行深度融合,通过大数据技术促 ...

  2. 2021年MathorCup高校数学建模挑战赛—大数据竞赛A题二手车估价问题解题思路

    MathorCup高校数学建模挑战赛-大数据竞赛 A题 二手车估价问题 原题再现:   随着我国的机动车数量不断增长,人均保有量也随之增加,机动车以"二手车"形式在流通环节,包括二 ...

  3. 2022 年 MathorCup 高校数学建模挑战赛——大数据竞赛(北京移动用户体验影响因素研究全套代码)

    赛道 B:北京移动用户体验影响因素研究      移动通信技术飞速发展,给人们带来了极大便利,人们也越来越离不开移动通信技术带来的各种便捷.随着网络不断的建设,网络覆盖越来越完善.各个移动运营商,越来 ...

  4. 2021年MathorCup高校数学建模挑战赛——大数据竞赛A题

    赛道 A:二手车估价问题 随着我国的机动车数量不断增长,人均保有量也随之增加,机动 车以"二手车"形式在流通环节,包括二手车收车.二手车拍卖.二手 车零售.二手车置换等环节的流通需 ...

  5. 2022年第三届MathorCup高校数学建模挑战赛——大数据竞赛

    关注我后续分享更多数学建模思路~

  6. 2021 年 MathorCup 高校数学建模挑战赛——大数据竞赛B题

    赛道 B:信息流智能推荐算法中的序列评估问题 随着互联网信息的蓬勃发展,用户在使用互联网应用时面临着信息过载的问题.推荐算法的出现,满足了用户个性化的内容消费需求,  提升了用户获取有用信息的效率,在 ...

  7. 第三届2022MathorCup高校数学建模挑战赛大数据论文加代码(附详解)

    基于系统决策树分类的移动用户体验影响因素研究 摘要 本题主要是一个研究预测模型,以中国移动通信集团北京公司为背景,让客户根据 自身在网络覆盖与信号强度方面的体验和语音通话过程中的整体体验来进行语音通话 ...

  8. 2021年MathorCup高校数学建模挑战赛b题:三维团簇的能量预测(三等)

    微信公众号:数学建模与人工智能 https://github.com/QInzhengk/Math-Model-and-Machine-Learning 三维团簇的能量预测 摘要 一.问题重述 1 二 ...

  9. 第二十四天:2019年第九届MathorCup高校数学建模挑战赛A题

    之前发了一篇文章,审核未通过- 不过没有关系,释然又双叒叕回来啦!这个暑假,数模.算法.名著.高数.英语都是不可辜负的哟! 今天是释然发题解的第二十三天,以后经常会和大家分享学习路上的心得,希望和大家 ...

最新文章

  1. envi5.2中文版
  2. 一个编程菜鸟的进阶之路(C/C++)
  3. 改变ComboBox控件的高度
  4. 高等数学上-赵立军-北京大学出版社-题解-练习3.4
  5. rocketmq 消息指定_SpringBoot 整合 RocketMQ 如何实现消息生产消费?
  6. oracle释放shm空间,安装11gRAC时提示/dev/shm大小不足
  7. STM32的串口DMA收发以及双缓冲区的实现
  8. cacti 监控自身
  9. 大数据与python-零起点Python大数据与量化交易 PDF 下载
  10. java script特效_javascript 常用特效(40种)
  11. [EXP]CVE-2019-0604 Microsoft SharePoint RCE Exploit
  12. intouch sqlserver_intouch 连接modbus 。转存数据库方法
  13. 论文浏览(20) Video Classification with Channel-Separated Convolutional Networks
  14. 运维分级发布_运维必备制度:故障分级和处罚规范
  15. 记录安装python+appium+模拟器的自动化
  16. 分销商城系统核心功能模块
  17. linux文件无法写入
  18. 这5个免费素材网站,设计师都在用
  19. OV代码签名数字证书
  20. JACO2 6自由度机械臂上手体验一

热门文章

  1. hive SQL实现占比、同比、环比计算(lag函数,lead函数)
  2. Arch xfce4 安装解压缩软件
  3. “上下求索”的人工智能市场了发生什么变化?
  4. 浙江理工大学计算机专业好考吗,报考数据分析—浙江理工大学
  5. Unity SpriteRender 和Image的区别
  6. 为你骄傲,不再崇拜...
  7. 超好看的网站极简导航网址网站源码模板
  8. Redis哨兵模式主从持久化问题解决
  9. 操作系统大纲(复习版)
  10. 甘特图怎么做的?项目经理必备软件