2023 全球人工智能开发者先锋大会—AI 人才学习赛rank1方案分享

Posted Thefan1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023 全球人工智能开发者先锋大会—AI 人才学习赛rank1方案分享相关的知识,希望对你有一定的参考价值。

赛题介绍

这个比赛是和鲸社区上的一个AI 人才学习赛,其由上海市人工智能行业协会主办,联合上海多家人工智能相关企业,由 Datawhale、和鲸社区承办的一场面向 AI 开发者的学习实践赛事。本次大赛以企业相关人才需求为导向,聚合广泛的、跨学科的各类 AI 人才参与学习,利用真实场景下的数据研发 AI 算法模型、探索解决方案的学习实践赛事。比赛链接为: 2023 全球人工智能开发者先锋大会—AI 人才学习赛

数据EDA以及上分点

看官方的数据说明可以看出,该赛题的连续性特征有六个,分别为变压器的外部负载值的六个值,因为并不知道变压器的外部负载值的六个值的具体含义,因此我没想出该如何单纯利用这六个特征进行业务特征构造,之后我试了一下对这六个特征进行暴力特征提取并且加入到模型训练,但是结果显示效果并不好,因此我没有再进一步地对这六个特征进行进一步的挖掘。之后便打算对这六个特征按照‘month’特征进行时间序列特征提取,但是很奇怪,当我加入了这些时间序列特征之后线下的分数有了很大的下降,在这其中我尝试过diff,roll等都没有大用,因此这类特征我也放弃了。最后我尝试了一下统计特征,当我加入了统计特征之后我线下的mse从300多下降到了60多,并且单纯用统计特征线上的分数为260+。不过这样做的风险为线下过拟合太严重了,因为我线下的mse下降了200多,然后我线上的分数才下降30多。之后在模型训练前对y值进行log处理也能有一定的提升,但是因为这个赛题的y值最小值为-4+,因此不能用以往的log1p(y),应该将其替换为log(y + 5)。对于模型的参数,由于我加入了统计特征之后过拟合太严重了,为了减小B榜和决赛的抖动太严重,我得模型的特征几乎都为模型默认的特征,没有对其进行细化的调参。

完整代码展示

统计特征构造:

def brute_force(df, features, groups):
    for method in tqdm(['mean', 'std', 'median']):
        for feature in features:
            for group in groups:
                df[f'group_feature_method'] = df.groupby(group)[feature].transform(method)
    return df
dense_feats = ['L1', 'L2', 'L3', 'L4', 'L5', 'L6']
cat_feats = ['date_id', 'month', 'time']
df = brute_force(df, dense_feats, cat_feats)

对y值平滑处理:

y = np.log(df_train['y'] + 5)

lgb模型参数:

params = 
    'learning_rate': 0.05,
    'boosting_type': 'gbdt',
    'objective': 'regression',
    'metric': 'mae',
    'feature_fraction': 0.7,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'seed': 2022,

catboost模型参数:

cbt_model = CatBoostRegressor(iterations=100000,
                           learning_rate=0.05, 
                           eval_metric='MAE',
                           use_best_model=True,
                           random_seed=42,
                           logging_level='Verbose',
                           task_type='GPU',
                           devices='0',
                           gpu_ram_part=0.5,
                           early_stopping_rounds=200)

以上是我使用到的特征以及模型的参数,下面是我队友使用到的特征以及模型的参数

对6个变压器的外部负载值进行暴力特征提取

loc_f=[i for i in data.columns if
                 i not in ['id', 'transformers','date_id','time','y']]
for i in range(len(loc_f)):
     for j in range(i + 1, len(loc_f)):
        data[f'loc_f[i]+loc_f[j]'] = data[loc_f[i]] + data[loc_f[j]]
        data[f'loc_f[i]-loc_f[j]'] = data[loc_f[i]] - data[loc_f[j]]
        data[f'loc_f[i]*loc_f[j]'] = data[loc_f[i]] * data[loc_f[j]]
        data[f'loc_f[i]/loc_f[j]'] = data[loc_f[i]] / (data[loc_f[j]]+1)

统计特征提取

def brute_force(df, features, groups):
    for method in tqdm(['mean', 'std', 'median','nunique']):
        for feature in features:
            for group in groups:
                df[f'group_feature_method'] = df.groupby(group)[feature].transform(method)
    return df
dense_feats = ['L1', 'L2', 'L3', 'L4', 'L5', 'L6']
cat_feats = ['transformers', 'date_id', 'month', 'time']
df = brute_force(data, dense_feats, cat_feats)

lgb模型参数

parameters = 
        'learning_rate': 0.01,
        'boosting_type': 'gbdt',
        'objective':'regression',# 'regression_l1',
        'metric': 'mape',
        'num_leaves': 31,
        'feature_fraction': 0.6,
        'bagging_fraction': 0.8,
        'min_data_in_leaf': 15,
        'verbose': -1,
        'nthread': 4,
        'max_depth': 7
    

在最后对这三个模型训练出来的结果进行加权融合,便是最后的结果。

赛后总结

通过看我们使用到的特征可以看出虽然该赛题为时间序列数据,但是可能是由于数据质量的问题,常规的时间序列特征在该赛题并不能有多大的提升,不过也有可能是我的打开方式不对,但是统计特征对于这个赛题确有很大的提升,虽然会导致我们的模型线下的过拟合很严重,但是我们可以通过模型的融合来缓解分数抖动过大的问题。

完整可运行的代码链接

2023 全球人工智能开发者先锋大会—AI 人才学习赛Rank1完整代码

以上是关于2023 全球人工智能开发者先锋大会—AI 人才学习赛rank1方案分享的主要内容,如果未能解决你的问题,请参考以下文章

CSDN 亮相 2023 全球人工智能开发者先锋大会

首届AI人才学习赛来了,通过赛事拿offer

首届AI人才学习赛来了,通过赛事拿offer

GAIDC AI人才成长论坛,Datawhale在上海等你!

全球数字经济-全球AI大数据竞赛,全球数字经济大会-黑客马拉松大赛,国家级大学生创新创业训练计划项目-立项-经费20000,据金社区创业先锋

全球数字经济-全球AI大数据竞赛,全球数字经济大会-黑客马拉松大赛,国家级大学生创新创业训练计划项目-立项-经费20000,据金社区创业先锋