Digix2019华为算法精英挑战赛代码

最终成绩: 决赛第九

问题

根据手机型号,颜色,用户偏好,手机APP等信息预测用户年龄.

https://developer.huawei.com/consumer/cn/activity/devStarAI/algo/competition.html#/preliminary/info/digix-trail-02/introduction

解决方案

这次比赛我们主要选择神经网络和lightgbm两种模型

神经网络

我们主要搭建了两种神经网络,一种是全连接神经网络,另外一种是密集连接神经网络(Dense connected block+ Fully connected block),我们在神经网络的搭建中,结合回归和分类两方面的损失,对模型进行优化。

全连接神经网络

神经网络主要使用全连接, 使用了两种结构, 第一种是将数据整合为一个数据表, 输入一个几层全连接网络,使用了Dropout, 结构、参数和使用的数据如表1-1,详细模型参数和模型搭建,见程序(main.py文件)

model = Sequential()
model.add(Dense(1024, activation='relu', input_shape=(two_train.shape[1],)))
model.add(Dropout(0.6))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(6, activation='softmax'))
model.summary()
adam = optimizers.Adam(lr=0.00009, beta_1=0.9, beta_2=0.999)
model.compile(loss='categorical_crossentropy',optimizer=adam,metrics=['accuracy'])

Dense connected block+ Fully connected block

为减少参数,加速训练时间,我们使用了另外一种神经网络结构,底层先对各个分开的数据表分开输入,并使用densely connected的网络结构, 使用了正则化, Batch normalization, 初始化权重等。网络结构详见图1-6 ,同时为了提升网络的泛化性能,我们使用了mean_squared_error 和 cross entropy两种loss来训练整个网络,并设置权重,使得模型在验证集当中,达到最优的结果。在学习率方面,我们采用逐epoch衰减和随batch衰减的学习率。

为了减少网络参数和加快训练速度,我们对不同数据输入用Dense block单独处理,将不同Dense block的输出合并后,输入两层全连接网络得到64维向量,分别接入6维全连接层和1维全连接层,分别得到最小均方回归值和分类Softmax概率.

这种网络相比一般全连接网络和其它模型缩短了训练时间,只需要两个epoch就可以在验证集达到0.645以上的精准率,同时线上可以达到0.648的准确率;除此之外,这种网络在数据量增加后可以通过调整网络结构参数直接得到表达力更强的网络和更好的效果。(代码详见 runtrain.py)

Dense block的实现代码

参数:

Learning rate: 采用了逐epoch衰减和随batch衰减,具体参数见程序(runtrain.py文件);

Regularize: Dense block采用了l1正则化,Fully connected部分采用了l2正则化;

Batch Normalization: 网络的每一层均使用了batch normalization;

Architecture:每个数据表的处理特征部分使用了不同的网络结构和层数;

Loss:为了提高模型的泛化性能,我们使用了mean_squared_error和categorical_crossentropy两种loss来训练整个网络, 但考虑到最终任务是分类, 我们对两者设置了不同的权重,即交叉熵的权重远大于最小均方差;

regularizer_para_2 = regularizers.l2(0.01)
learning_rate = 0.003
dim_bhv = 8
dim_bsc1 = 7
dim_bsc2 = 739 # 'city prodName color ct carrier'
dim_act = 9401
dim_time = 9401
dim_duration = 9401
dim_time_new = 9402
dim_duration_new = 9402
dim_tfidf = 9401
dim_app = 56340
dim_app1 = 40
dropout_rate = 0.01
Initializer = initializers.he_uniform()#initializers.TruncatedNormal()
input_app, encode_app = dense_add(dim_app, [1024, 256, 128, 64], 64)
input_bhv, encode_bhv = dense_add(dim_bhv, [32, 16], 16)
input_bsc1, encode_bsc1 = dense_add(dim_bsc1, [32, 16], 16)
input_app1, encode_app2 = dense_add(dim_app1, [32, 16], 32)
input_bsc2, encode_bsc2 = dense_add(dim_bsc2, [256, 128, 64], 64)
input_act, encode_act = dense_add(dim_act, [512, 256, 128, 64], 64)
input_time, encode_time = dense_add(dim_time, [512, 256, 128, 64], 64)
input_duration, encode_duration = dense_add(dim_duration, [512, 256, 128, 64], 64)
input_time_new, encode_time_new = dense_add(dim_time_new, [256, 128, 64], 64)
input_duration_new, encode_duration_new = dense_add(dim_duration_new, [256, 128, 64], 64)
input_tfidf, encode_tfidf = dense_add(dim_tfidf, [256, 128, 64], 64)
dim_constant = 886
input_constant, encode_constant = dense_add(dim_constant, [256, 128, 64], 32)
dim_cv_max = 5000
input_cv_max, encode_cv_max = dense_add(dim_cv_max, [256, 128, 64], 64)

lightgbm

Lightgbm模型所选的数据为前面用户的基本属性、加上所选5000个APP的用户激活信息和用户的usage使用日志信息,总共为15795维(代码详情见 lgb.py)

不断的通过模型的测试结果和特征选择,最后选取15795维的特征。模型参数

"boosting_type": "gbdt",
"objective": "multiclass",
"metric": "multi_error",
"num_class": 6,
"num_leaves": 256,
"lambda_l2": 20,
"lambda_l1":0.0,
"bagging_fraction": 0.9,
"feature_fraction": 0.6,
"bagging_freq": 10,
"learning_rate": 0.05,
"bagging_seed": 2019,
"feature_fraction_seed": 2019,
"num_threads": 48

更好的解决方案

https://github.com/luoda888/HUAWEI-DIGIX-AgeGroup

Digix2019华为算法精英挑战赛代码的更多相关文章

  1. 2021华为软件精英挑战赛(C/C++实现)-苦行僧的实现过程

    下面给出2021华为软件精英挑战赛参与的整个过程,虽然成绩不是很好,但是也是花了一些时间的,希望后面多多学习,多多进步. 代码已经上传到了Github上:https://github.com/myFr ...

  2. <路径算法>哈密顿路径变种问题(2016华为软件精英挑战赛初赛)

    原创博客,转载请联系博主! 前言:几天前华为的这个软件精英(算法外包)挑战赛初赛刚刚落幕,其实这次是我第二次参加,只不过去年只入围到了64强(32强是复赛线),最后搞到了一个华为的一顶帽子(感谢交大l ...

  3. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  4. 一道算法题目, 二行代码, Binary Tree

    June 8, 2015 我最喜欢的一道算法题目, 二行代码. 编程序需要很强的逻辑思维, 多问几个为什么, 可不可以简化.想一想, 二行代码, 五分钟就可以搞定; 2015年网上大家热议的 Home ...

  5. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

  6. AC-BM算法原理与代码实现(模式匹配)

    AC-BM算法原理与代码实现(模式匹配) AC-BM算法将待匹配的字符串集合转换为一个类似于Aho-Corasick算法的树状有限状态自动机,但构建时不是基于字符串的后缀而是前缀.匹配 时,采取自后向 ...

  7. 利用朴素贝叶斯算法进行分类-Java代码实现

    http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现  鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0) ...

  8. 如何将Android Studio与华为软件开发云代码仓库无缝对接(二)

    上篇文章:如何将Android Studio与华为软件开发云代码仓库无缝对接(一) 上一章讲了,如何用Android Studio以软件开发云代码仓库为基础,新建一个项目.接下来,这一章继续讲建好项目 ...

  9. 对一致性Hash算法,Java代码实现的深入研究(转)

    转载:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读 ...

随机推荐

  1. PAT1067 试密码 (20分)——测试点4分析 一个易错点

    1067 试密码 (20分)   当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码( ...

  2. jQuery-语言基础整理

    jQuery是js的一个类库,主要封装的是js中DOM操作部分,使用和原生js一样 1.需要先引入页面才可以使用 代码引入:<script src='jquery.js'></scr ...

  3. Java工作流框架jflow 集团应用模式用户组功能

    关键字 驰骋BPM ,工作流开发框架,用户组,接受人规则,用户组发起人范围,选择人范围. 集团工作模式. Ccflow ,jflow.工作流引擎 名词定义与应用背景 对于集团模式的ccflow,jfl ...

  4. Rocket - diplomacy - BaseNode

    https://mp.weixin.qq.com/s/eOgNLi_MJ8HJOpepGaaW8Q   简单介绍BaseNode的实现.   ​​   1. You cannot create a n ...

  5. Splay代码简化版

    皆さん.こんにちは.上一篇文章,我们讲了Splay如何实现.这一篇我们来让我们的伸展树短一点. 上一篇Splay讲解的链接:リンク. 首先还是变量的定义,在这里呢,我把一些小函数也用Define来实现 ...

  6. Java实现 LeetCode 721 账户合并(并查集)

    721. 账户合并 给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails ...

  7. Java实现 蓝桥杯 算法训练 约数个数

    算法提高 约数个数 时间限制:1.0s 内存限制:512.0MB 输入一个正整数N (1 样例输入 12 样例输出 6 样例说明 12的约数包括:1,2,3,4,6,12.共6个 import jav ...

  8. Java实现蓝桥杯模拟存储转换

    问题描述 在计算机存储中,15.125GB是多少MB? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. pac ...

  9. Java实现 LeetCode 228 汇总区间

    228. 汇总区间 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7] 输出: ["0->2","4-> ...

  10. 关于nginx的源码安装方式

    Nginx(engine x)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器, 也是一个 IMAP/POP3/SMTP 代理服务器.在高连接并发的情况下, ...