前言
本次参加2020CCF大数据与计算智能大赛,在Serverless工作负载预测赛道侥幸进入决赛,在这里首先感谢我的队友在比赛中的不懈努力,然后和大家分享一下我个人的模型(进入决赛得分为融模结果),本文给出方案A榜线上成绩为0.344,简易改进后得分为0.346和0.348,根据我们队伍A/B榜波动看来,模型相对稳定,B榜成绩预估在top20左右
一、训练集重分组
import pandas as pd
import numpy as np
import time
from tqdm import tqdm
train=pd.read_csv('../data/train.csv')
#由于训练集中某些特征存在测试集中不包含的离散值 根据此进行筛选
train = train[train.STATUS=='available']
train = train[train.PLATFORM=='x86_64']
train = train[train.RESOURCE_TYPE=='vm']
train = train[train.QUEUE_TYPE!='spark']
train = train.reset_index(drop=True)
del train['STATUS']
del train['PLATFORM']
del train['RESOURCE_TYPE']
#时间格式转换
train.DOTTING_TIME = train.DOTTING_TIME.astype('datetime64[ms]')
#根据时间进行排序 并去重复时间
train = train.sort_values(by='DOTTING_TIME')
train.drop_duplicates(subset=['DOTTING_TIME','QUEUE_ID'],keep='last',inplace=True)
print(train.shape)
train_new=[]
train['qid_group']=''
'''
对训练集进行重新分组 首先根据qid分组 然后根据时间间隔 若相邻样本(由于之前已根据时间进行排序)
时间间隔大于30(题目要求的预测未来时间是5-25,这里比较随意的给定了一个30)
则将其分为另外一组(这一步操作与之后特征处理以及目标值构造时的操作有关)
(只考虑到了相邻的样本的时间)
'''
for qid in tqdm(train.QUEUE_ID.unique()):
k=0
train['diff_time']=train[train.QUEUE_ID==qid].DOTTING_TIME.diff(1)
for row in train[train.QUEUE_ID==qid].iterrows():
if row[1].diff_time>pd.to_timedelta(30,'min') :
k+=1
row[1].qid_group='{}_{}'.format(row[1].QUEUE_ID,str(k))
train_new.append(row[1])
else:
row[1].qid_group='{}_{}'.format(row[1].QUEUE_ID,str(k))
train_new.append(row[1])
- 获取重新分组后的训练集 并保存本地
train_new=pd.DataFrame(np.array(train_new),columns=train.columns)
train_new.to_csv('../data/train_new.csv',index=False)
- 此步骤大约花费1min左右
二、特征构建
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings("ignore")
pd.set_option('display.max_columns', None)
df_train = pd.read_csv('../data/train_new.csv')
df_test = pd.read_csv('../data/evaluation_public.csv')
del df_test['STATUS']
del df_test['PLATFORM']
del df_test['RESOURCE_TYPE']
#离散特征编码
df_train.loc[df_train.QUEUE_TYPE=='sql','QUEUE_TYPE'] = 0
df_train.loc[df_train.QUEUE_TYPE=='general','QUEUE_TYPE'] = 1
df_test.loc[df_test.QUEUE_TYPE=='sql','QUEUE_TYPE'] = 0
df_test.loc[df_test.QUEUE_TYPE=='gen