前言
这算是博主完整参加的第一个数据竞赛,真的收获了好多东西,对数据竞赛有了全方位的认识,也全程目睹了前排大佬神仙打架。这篇文章也算是对这次比赛历程的一个回顾,因为复赛没有怎么做,这里主要还是总结自己初赛时收获的tricks,欢迎小伙伴们一起交流学习!Tips:当然还要非常感谢鱼佬和阿泽两位大神的baseline和思路分享!
这里介绍一下团队的主要成员:
- 壹磊,北京交通大学运筹学与控制论专业研二在读
- yiyang,东华大学应用统计专业研二在读
- 潜心,上海师范大学计算机技术专业研二在读
一、赛题介绍:时间序列问题
比赛网址:http://challenge.xfyun.cn/topic/info?type=temperature
因为初赛和复赛规则几乎完全不同,可以说是两个不同的比赛。初赛可以定位为多变量回归问题,复赛则变成了一个基于时间序列预测的结果补全问题。说来惭愧,复赛的一个月的时间我们团队都在忙各种事情,基本上只有一个队友偶尔在做,所以这篇主要是我对初赛特征工程方面的总结。
二、初赛:允许使用当前值和特征穿越
初赛里我们团队成员还没有相识,因此各自单打独斗进行建模,毫无例外都使用了xgboost单模,最终的成绩分别为0.104、0.106和0.117,这样的做法的优势是使我们各自的模型存在一定差异性的,也为后续的模型融合创造了条件,最终经过模型融合和调整,我们队伍的初赛A帮成绩定格在0.10034,最终A榜排在36名,切换到B榜排名上升到28名(28/771),顺利入围复赛。
A榜
B榜
下面,我主要总结一下我在数据处理和特征工程中做的工作,有很多借鉴了鱼佬的baseline,并且没有做分桶特征,同时较少涉及特征穿越。(单模成绩:0.106 ,A榜排名:60名左右,我觉得B榜应该会有不小的提升)
- 缺失值补全(使用fillna操作)
# 缺失值补全
f = ['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']
train_df[f] = train_df[f].fillna(method='ffill')
test_df[f] = test_df[f].fillna(method='ffill')
- 异常值截断(假设数据服从正态分布,使用3σ法则进行截断,可用前后均值替换)
# 气压异常值前后均值替换
for f in tqdm(['indoorAtmo', 'outdoorAtmo']):
upper = data_df[f].mean()+ 3 * data_df[f].std()
lower = data_df[f].mean()- 3 * data_df[f].std()
for i in data_df[data_df[f] > upper].index:
data_df.loc[i,f] = (data_df.loc[i-1,f] + data_df.loc[i+1,f])/2
for i in data_df[data_df[f] < lower].index:
data_df.loc[i,f] = (data_df.loc[i-