CCF 工作负载baseline(0.211+)

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_)

为了防止号没了,改动了一下划分训练集测试集的随机种子,可能还有一些库的版本差距,差距应该不大,比较怂,希望没有直接提交的,万一改了个随机种子直接上分就有点尴尬(手动狗头)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值