前言:?
在本科的时候也参加过数学建模竞速,但当时觉得数学建模难(确实很难),所有只参加了校赛,并且拿了一个校赛二等奖。
今年算是第一次参加国家级的比赛,华为杯数学建模比赛每年9月份开始,报名时间往前推就行,今年的比赛因为疫情推出了一个月。
首先华为杯一共有A,B,C,D,E,F 总共6道题,赛题分好几类,比如优化类(今年的F题),数据处理类(今年的D题),我们队就是选的D题,在赛前讨论的时候,我们就决定选数据处理类的题目。事实上,我们周围大部分人选的就是D题,因为数据处理类一般是用机器学习算法做预测,分类,优化。对于计算机专业的学生的来说,稍微在行一点。但是很多人选,也意味着,竞争压力很大。数学建模赛是没有标准答案的,评奖是按百分比来的,(好像前20%就是三等),所以要考虑这点。接下来说一下我们队的流程:
10月14:
第一天上午拿到题目,我们先把所有的题目都过了一遍,发现F题稍微看的懂,但是属于优化类的题目。接着我发现D题的数据分为training 和 test 这是标准的数据处理类的题目,在机器学习里,数据一般划分为训练集和测试集,我们就把题目定为D。
D题第一题要求在729个变量中选取20个对因变量影响最大的变量,我们就开始分头行动,找相关论文,找往年赛题。在20年的B题中发现也有类似的题目,他们是用pearson相关性系数来做的,这里介绍一下这个皮尔逊系数。
在 matlab 中使用 corrcoef 函数可以求两个序列的相关度
corrcoef(x,y)表示序列 x 和序列 y 的相关系数,得到的结果是一个 2*2 矩阵,
其中对角线上的元素分别表示 x 和 y 的自相关,非对角线上的元素分别表示 x
与 y 的相关系数和 y 与 x 的相关系数,两个是相等的
这个系数一般是线性相关,(题目中的数据可能是非线性)我们用python先把数据做归一化(其实不用也行),做完之后选了20个相关性最大的变量出来,但是我们发现相关性系数最大的也不过0.5,特别低。之后重新算了好几遍还是很低。我们就讨论换一种思路来解题了。
10月15:
第二天早上我的另一个队友在肝了一晚上之后,用随机森林的方法选出了20个变量,随机森林解释及代码实现,和其他的同学交流他们也有使用随机森林解题的,由于时间的问题,我们第一题就暂时用这个方解题了。
接下来就是第二题,第二题是用第一题找到的20个变量做预测,在机器学习里属于回归问题。但是题目的样本数只有1974个,这对训练一个好一个机器学习模型来说,数据量远远不够。我先用keras搭了一个最简单的神经网络来做预测(照着书上房价预测的模型搭的),训练之后效果非常差,说明这种模型不太行。队友这个时候就想用DNN (深度神经网络)尝试一下,结果证明DNN在这个题目上效果并不好,RMSE0.9。后来我在阿里天池上看他们做预测会用哪些模型,发现了catboost模型,用catboost模型跑的效果还是挺不错的,RMSE 0.4,效果比其他模型好很多。
最后:
记住论文是最重要的,我们花在写论文的时间太短了,这是一个教训,最后的成绩是按论给的,实验做的再好论文没写好也不行。通过这次比赛我发现自己对于机器学习的认知还停留在皮毛阶段,对最基本的原理还是没有弄明白。比完赛马上买了一个本西瓜书,狠补知识。
|