CCF2020 大数据时代的Serverless工作负载预测赛道baseline:(0.211+)
附一下官网链接:https://www.datafountain.cn/competitions/468
之前刚开赛的时候,写了个baseline,分享一下。目前排名有点落后,大家随便看看。
import pandas as pd
from datetime import datetime
import time
from sklearn.preprocessing import LabelEncoder
def make_label(data):
'''构建十个目标 当做多目标任务做
没有用多目标预测的库 而是分开预测的
这里应该能够上点分'''
data['CPU_USAGE_1']=data.CPU_USAGE.shift(-1)
data['CPU_USAGE_2']=data.CPU_USAGE.shift(-2)
data['CPU_USAGE_3']=data.CPU_USAGE.shift(-3)
data['CPU_USAGE_4']=data.CPU_USAGE.shift(-4)
data['CPU_USAGE_5']=data.CPU_USAGE.shift(-5)
data['LAUNCHING_JOB_NUMS_1']=data.LAUNCHING_JOB_NUMS.shift(-1)
data['LAUNCHING_JOB_NUMS_2']=data.LAUNCHING_JOB_NUMS.shift(-2)
data['LAUNCHING_JOB_NUMS_3']=data.LAUNCHING_JOB_NUMS.shift(-3)
data['LAUNCHING_JOB_NUMS_4']=data.LAUNCHING_JOB_NUMS.shift(-4)
data['LAUNCHING_JOB_NUMS_5']=data.LAUNCHING_JOB_NUMS.shift(-5)
'''
因为使用shift 所有会产生一些缺失值 这里直接删了
数量不多 应该问题不大
'''
return data.dropna()
def process(df):
'''
对时间进行了一点处理
训练集没有问题
测试集出现了2023年时间
应该是官方脱敏的原因
'''
df.DOTTING_TIME/=1000
df.DOTTING_TIME=list(map(lambda x:time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(x)),df.DOTTING_TIME))
df=df.sort_values(['QUEUE_ID','DOTTING_TIME'])
df['DOTTING_TIME']=pd.to_datetime(df.DOTTING_TIME)
return df
train=pd.read_csv('train.csv')
test=pd.read_csv('evaluation_public.csv')
train=process(train)
test=process(test)
#将之后五个时间点的数值作为label
train=train.groupby('QUEUE_ID').apply(make_label)
train=train.reset_index(drop=True)
#特征值转化
encode_STATUS=LabelEncoder()
encode_QUEUE_TYPE=LabelEncoder()
encode_PLATFORM=LabelEncoder()
encode_RESOURCE_TYPE=LabelEncoder()
train.STATUS=encode_STATUS.fit_transform(train.STATUS)
test.STATUS=encode_STATUS.transform(test.STATUS)
train.QUEUE_TYPE=encode_QUEUE_TYPE.fit_transform(train.QUEUE_TYPE)
test.QUEUE_TYPE=encode_QUEUE_TYPE.transform(test.QUEUE_TYPE)
train.PLATFORM=encode_PLATFORM.fit_transform(train.PLATFORM)
test.PLATFORM=encode_PLATFORM.transform(test.PLATFORM)
train.RESOURCE_TYPE=encode_RESOURCE_TYPE.fit_transform(train.RESOURCE_TYPE)
test.RESOURCE_TYPE=encode_RESOURCE_TYPE.transform(test.RESOURCE_TYPE)
train.drop(['DOTTING_TIME'],axis=1,inplace=True)
test.drop(['DOTTING_TIME'],axis=1,inplace=True)
targets_names=['CPU_USAGE_1','LAUNCHING_JOB_NUMS_1','CPU_USAGE_2','LAUNCHING_JOB_NUMS_2','CPU_USAGE_3','LAUNCHING_JOB_NUMS_3',
'CPU_USAGE_4','LAUNCHING_JOB_NUMS_4','CPU_USAGE_5','LAUNCHING_JOB_NUMS_5']
targets=[]
for i in targets_names:
targets.append(train[i])
train.drop(i,axis=1,inplace=True)
'''
只保留测试集最后一条样本进行预测,测试集利用率还是比较低
'''
test=test.drop_duplicates(subset=['ID'],keep='last')
test_id=test.ID
test.drop('ID',axis=1,inplace=True)
from catboost import CatBoostRegressor
from lightgbm import LGBMRegressor
from sklearn.model_selection import train_test_split
df=pd.DataFrame()
df['ID']=test_id
model=LGBMRegressor(n_estimators=100000,eval_metric='mse')
for i in targets:
train_x,test_x,train_y,test_y=train_test_split(train,i,test_size=0.2,random_state=42)
model.fit(train_x,train_y,eval_set=(test_x,test_y),early_stopping_rounds=50,verbose=100)
df[i.name]=model.predict(test,num_iteration=model.best_iteration_)
为了防止号没了,改动了一下划分训练集测试集的随机种子,可能还有一些库的版本差距,差距应该不大,比较怂,希望没有直接提交的,万一改了个随机种子直接上分就有点尴尬(手动狗头)