2020华为软挑热身赛

article/2025/9/15 15:51:27

                           基于高斯贝叶斯分类的C++优化器

摘要:2020华为软件挑战赛如期举行,本次挑战赛分为热身赛、初赛、复赛、总决赛4个部分,其中热身赛结合当前机器学习中分类问题以及鲲鹏服务器性能相关来出题。为了解决该问题,达到算法准确率和程序时间的平衡。本文基于高斯贝叶斯的分类算法思想,用C++程序来编写该算法,并在完成之后进行算法以及程序等层面优化策略。充分利用特征选择以及内存映射等特点。在赛题数据集上取得1.12分的成绩,为热身赛第180名左右(总约800名报名选手)。

目录

                           基于高斯贝叶斯分类的C++优化器

1 问题介绍

2 算法以及程序优化流程

3   流程详解

3.1 特征选择

3.2 使用什么分类算法

3.3 为什么使用C++?

3.4  如何优化C++程序?

3.4.1 算法层面

3.4.2 代码层面

4 结束语


1 问题介绍

机器学习是金融风控中使用到的核心技术之一。金融风控中,会结合各类特征,进行风险预估(常见的特征如:学历、性别、收入、负债情况、商品购买记录、历史逾期行为、人际社交等)。数据分析工程师会针对上述特征进行特征工程处理,再选用合适的机器学习模型进行数据建模工作。

在“大数据”的时代背景下,保证机器学习算法效果的同时,充分挖掘IT基础设施算力,提升算法计算性能,一方面有利于保护企业现有IT投资,另一方面能让数据分析师以更短的时间完成建模,从而可以选择出来更优化的业务模型。

在本次比赛中,我们准备了已经做好了特征工程处理的数据和对应的样例代码,您需要优化模型提升准确率和性能

2 算法以及程序优化流程

由问题定义可知这是一个分类问题,华为官方要求在准确率和时间两个指标上来综合计分。为了能够达到两者的均衡。本文问题解决方案如下

问题解决流程


  1. 特征选择
  2. 使用高斯贝叶斯分类算法
  3. 使用C++编写程序
  4. 优化程序I/O部分,优化并发

3   流程详解

由于本篇为赛题博客,所涉及的知识点大多广而不深,所以在这里依据问题解决流程简单罗列下子问题以及本文解决的方法。

  1. 特征选择
  2. 使用什么分类算法?
  3. 为什么使用C++?
  4. 如何优化程序?

3.1 特征选择

因为本次热身赛的训练集在8w左右,测试集在2w左右。在分类算法达到一定准确率上如何让程序运行更快是一个亟待解决的问题。而特征选择的必要性体现出来,它可以缩短程序I/O读取数据集训练以及预测时间从而获得更好成绩。特征选择主要有3个派别的方法包括基于过滤的方法,其中有方差检验、相关性检验,这一派别方法通过去掉不符合阙值的特征以及优先选择与目标变量相关性高的特征来筛选特征集合。而基于嵌入的方法派别利用正则化和树模型,通过构建目标函数不断去除那些不太重要的特征。最后基于包裹的方法派别使用现成的分类算法为学习器,每次递归消除那些使得学习器性能提升最小的特征。

在本文中,由于并不知晓训练集多特征对于分类标签的共同影响,而且为了节省时间考虑。本文选择了基于皮尔逊系数的相关性检验方法来过滤特征。两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商,其中协方差反应的是X和Y之间的总体误差,而标准差反应是X和Y各自作为一组数据的离散程度。公式如下

在该公式中,P为皮尔森相关系数,X为特征,Y为标签,分子为X和Y的方差。分母是X,Y的标准差乘积。该公式刻画X和Y之间的相关性,该公式能够反应每个特征和对应标签之间的关系,r值绝对值越大,表示X和Y相关性越高。但是这种过滤特征的方法有缺陷,皮尔逊系数是假设两个变量之间是线性相关而进行分析的,r值越大,相关性越高。而在本赛题中,并不知X和Y之间是否有线性关系,仅仅依赖现有条件去筛选特征,该缺陷可以靠画出X和Y的数据变化图来验证。本文不再赘述,暂且使用这种方法。本文使用皮尔逊相关系数方法从训练集中1000个特征中,取200列特征。之所以选择200列,是因为在后续实验中发现200列是保证贝叶斯预测准确率大于70的条件之一。

3.2 使用什么分类算法

在使用sklearn机器学习库来调研已有的分类算法中,本文基于各种分类算法在赛题发放的样例数据集表现,选择高斯贝叶斯分类器。该分类器在样例数据集中取全部特征可以达到约84%的准确率,用时仅为4.88s。关于高斯贝叶斯分类器的内容,本文不再赘述。只给出其分类思想以及前提假设。

假设:

特征分布符合正态分布,且各个特征之间独立。

分类思想公式:

本公式为基本的贝叶斯公式,其中x为特征集合,yi表示标签。而样例数据集只有1和0两个类别。所以在该公式计算过程中,不需要计算分母。只需要计算分子即可。分子由两部分组成,包括P(x|yi)和P(yi),前者可以直接转化为P(x1|yi),P(x2|yi)...P(xn|yi)来计算(因为贝叶斯强烈的假设条件),而P(xi|yi)使用正态分布的概率密度计算即可,后者为训练集中每一种标签对应的先验概率。

3.3 为什么使用C++?

在挑选什么语言来实现贝叶斯算法问题上,目前大赛比较好的选手都是选择C++语言。其相对于其他编程语言的优点在于:

  • C++是编译型语言
  • C++更底层,程序员直接接触内存等底层资源,从而更快的运行

缺陷在于:

  • 学习时间过长,不能关注于模型本身

3.4  如何优化C++程序?

3.4.1 算法层面

在算法层面,本文所做的是特征选择

3.4.2 代码层面

1.数据截取

在实验过程中,发现仅需要200列特征,1/10训练集即可在测试集上达到70准确率。

 

2.    I/O的优化

在I/O层面,本文使用mmap内存映射机制。该机制过程如下

 

mmap通过将硬盘中的文件一部分内容映射到用户空间上,那么用户获取该空间指针就可以直接向内核缓存区读写这部分内容,相对于Fread读取方法,mmap没有硬盘拷贝到用户空间的过程,自然更快。本文首先获取需要读取训练集和测试集文件大小,再依据文件大小映射出整个文件到用户空间上,取文件映射头指针一个一个读取200列数据。

3 .并行优化

在并行层面,分别读取两个文件的操作很明显是可以并行的。数据隔离满足线程安全,本文采用两个线程分别读取数据到vector中。

4.代码优化

代码优化层面主要是语言特性以及计算机底层方面知识,本文在网络资源的帮助下,就以下几点做出改进

  • 参数尽可能使用引用传递
  • 不使用字符串的加法来转换字符串成数字,而是一个字符一个字符转成对应数字
  • 预先分配二维数组空间存放训练数据,而不是使用vector
  • 局部性原理

 

4 结束语

本文基于高斯贝叶斯分类器,结合特征选择,以及优化程序等流程,在大赛取得一定成绩,但仍有较大进步空间。分为以下几个方面阐述:

  • 特征选择的理论解释,本文并未就特征选择方面提出可以让人信服的证明过程,所选择的200列仅仅是达到了一定准确率而已。
  • 本文就贝叶斯计算过程没有采用neno技术来实现数据并行
  • 没有针对现有方法提出改进,只是做了子问题的调研工作以及一些模糊的直觉来选择较好的方法,创新性低
  • 在多线程方面,生产者-消费者模型可以使用。比如一个线程读取测试文件,一个线程消费所读取的数据。这样可以更快,而不是串行处理

 

 

5  拓展问题

本部分是笔者自己打比赛自己问自己的问题,可读可不读

问题的细致定义:

(C++性能优化代码+选择合适的算法(准确率和时间)+特征工程+服务器特性)4个方面的知识点 问题很简单,简单二分类问题,数据集为几w行1000列。但是要准确率以及够快。

  • 1 学习特征工程,以及自己为什么选择这种特征?是单纯看出来的,还是经过实验所得?
  • 2 读文件的优化?fread是怎么读的?怎么优化的?为什么更快?为什么不用mmap,那什么是mmap?可不可针对这两种方法优化? 3 为什么用朴素贝叶斯? 还有其他更快的分类算法吗?朴素贝叶斯的公式推演以及似然度的选择计算?
  • 4 既然为了加速,那肯定有并行算法,在什么地方用了并行算法?为什么用这种并行算法?
  • 5 为什么用neno加速,它是什么?为什么可以加速?
  • 6 为什么选择C++,而不是Python或者java?
  • 7 怎么对C++程序做性能优化?步骤?
  • 8 针对某一问题的性能优化有没有理论最优值?
  • 9 有无做出了解底层原理的方法或者创新操作。
  • 10 积累了那些对于语言共同特性的优化?
  • 11 看了那些书,包括C++性能优化指南,代码大全,编译原理等等。
  • 12 为了编写合乎编译器和计算机底层(性能性)和可读性,维护性高,你知道了什么?
  • * 从代码的编译过程来看,比如int a=-5;编译器如何解析它成为汇编? * 计算机时如何做的运算b-5的,涉及到原码,反码,补码等等。组成原理 * 代码大全为了可读性和维护性, * 语言本身特性。
  • 13 当我编写一个hello world的时候,计算机里面发生了什么?

 

 

 


http://chatgpt.dhexx.cn/article/eorLDmmA.shtml

相关文章

华为软挑赛2023-初赛笔记

前言 比赛介绍 官方链接: 2023华为软件精英挑战赛——普朗克计划 (huaweicloud.com) 赛题介绍 场景介绍 官方赛题介绍: 2023华为软件精英挑战赛初赛赛题及相关材料发布_2023华为软件精英挑战赛_华为云论坛 (huaweicloud.com) 比赛场景如图所示 简单来说,在一…

【C++】2018华为软挑:模拟退火+贪心FF解决装箱问题

本文的主要工作是补充这篇博客的缺失代码,使之能够运行。 2018华为软挑--模拟退火FF解决装箱问题【C代码】_小马哥MAX的博客-CSDN博客算法简介: 装箱问题是一个NP完全问题,求解全局最优解有很多种方法:遗传算法、禁忌搜索…

2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)

本文始发于个人公众号【两猿社】。 声明,为保证比赛公平,本文不会提供比赛源码,仅提供思路与踩坑经验。 他来了,他来了,他带着面试绿卡走来了。 他来了,他来了,他带着20w大奖走来了。 一年一度…

2018华为软挑参赛体验

第一次接触到这个比赛应该是研究生刚入学的时候,在教研室看到了师姐的一份简历,上面就有华为软挑的参赛经历。研一利用空余时间加强C和STL的学习,看完了《C primer》《Effective STL》,自己也写了一些demo,感觉这个比赛…

2022华为软挑编程问题报错总结

for i in number_feature: TypeError: ‘int’ object is not iterable的错误 错误原因:是因为在python里,整型(int)数据是不能直接用于迭代的,而是应该用range()函数 改为如下图:

2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码)

前期工作: 2021华为软挑初探——代码实现 2021华为软挑再探——代码实现 1 关于打包 在windows系统下,先把你写的程序写在src里面的CodeCraft-2021里面 然后在这个页面,将这三个文件压缩就可以上传啦: 2 关于标准输入 标准输…

华为软挑2019

参加软挑的一些感悟 写在前边的话 我本科一直在做嵌入式相关的项目,这是第一次参加软件类的竞赛,不得不说过程确实很刺激,最后止步杭厦赛区50强也很是遗憾,明明很接近,最后输在了代码效率上,本地成绩很好的 python代码 ,上传测评运行时间超限(官测环境比本地性能好&…

2021华为软挑初探——代码实现

其他工作: 2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码) 2021华为软挑再探——代码实现 这几天华为软挑好多人也是做的热火朝天,作为一个渣渣小孙也来探探,不探…

2020华为软挑总结

文章目录 一、热身赛编程闯关:评价标准:问题分析 二、初赛问题描述评价标准:问题分析思路一:思路二:思路三:针对思路三的提速: 最终结果: 三、code记录初赛两篇不错的总结三、复活赛…

2022华为软挑比赛(初赛笔记)

文章目录 2022华为软挑(初赛笔记)1. 赛题要求2. 解决方案2.1 挑选适合的边缘节点2.2 第一轮:最大分配2.3 第二轮:均值分配 总结 本文仓库地址: Github-CodeCraft-2022 2022华为软挑(初赛笔记) …

2023华为软件精英挑战赛笔记心得(Python实现)

第一次参加华为软挑,问了周围一圈人没人组队,看了眼题目,感觉挺有意思的,就打算自己写来跑一下,不求分数,主要是想学点东西,顺便记录一下。(最后跑了195w,自己的能力也就…

2021华为软件精英挑战总结

2021华为软挑32强总结 今年的软挑最终止步于粤港澳赛区第16名,总成本为16亿3979万6349,赛区第一名总成本为15亿3903万4817。 虽然没进入决赛,但是拿到了华为面试直通卡,也喜提广州一日游,算不虚此行了。决赛虽然还在继…

Spring认证中国教育管理中心-Spring Data Neo4j教程一

原标题:Spring认证中国教育管理中心-Spring Data Neo4j教程一(Spring中国教育管理中心) 5. 开始 我们为 SDN 提供了 Spring Boot 启动器。请通过您的依赖管理包含启动模块并配置要使用的螺栓 URL,例如org.neo4j.driver.uribolt:/…

SpringBoot 整合 Neo4j

1、创建测试类2、集成 SpringBoot 阅读此文之前,必须对 Neo4j 有个初步的了解,如果要实际操作的话,需要自备一个 Neo4j 数据库 本文所涉及代码已开源至 Gitee https://gitee.com/Array_Xiang/spring-boot-neo4j 创建一个 SpringBoot 项目&…

【Neo4j教程之CQL函数基本使用】

🚀 Neo4j 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,C…

Neo4j资料 Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址: 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明,《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱:pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

Neo4J超详细专题教程,快来收藏起来吧

Neo4J超详细教程 Lecture:波哥 一、Neo4J相关介绍 1.为什么需要图数据库 随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系 网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随…

Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址: 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明,《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱:pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

neo4j教程-安装部署

neo4j教程-安装部署 Neo4j的关键概念和特点 •Neo4j是一个开源的NoSQL图形存储数据库,可为应用程序提供支持ACID的后端。Neo4j的开发始于2003年,自2007年转变为开源图形数据库模型。程序员使用的是路由器和关系的灵活网络结构,而不是静态表…

Neo4j安装教程

1.下载社区版本,java8推荐安装3.*的版本 Neo4j Download Center - Neo4j Graph Data Platformhttps://neo4j.com/download-center/#community 点击下载即可。 2.配置 启动 将提取的文件放在服务器上的永久主页中,例如 D:\neo4j\. 顶级目录称为 NEO4J_…