笔者今年大二,参加了上届的泰迪杯数据挖掘技能赛,也是大学第一次参加比赛,最后结果是A题未获奖,B题一等奖。下面来简单介绍一下我们的参加经历,讲讲比赛总结。
两人大二、一人大一,专业是自动化/机械。
不过这并不意味着什么专业都可以参赛,我们三人都有python的基础。显然参赛前需要预先学习和准备相关编程知识,也要有对数据挖掘和数据处理有一定的概念。
第一次尝试做泰迪杯真题是10月初,当时在做18年的B题,笔者一口气做了七天,一个人每天两三小时做完了。我觉得第一次的实战经验是很重要的,比赛的准备可以从实战先开始。当然,当时对数据分析、数据挖掘一窍不通,可以说是走了很多弯路,很多部分都是面向CSDN编程。其中有个雷坑就建议大家不要走了,当时代码大量学习了 @蘑菇果实使用者=w= 的博客,结果可以说是走了很多弯路。。。
十月末和十一月初就和队友们经常来实验室一起敲代码、做真题、总结套路。最后一周做了19年的两道题,其中大量学习和运用了numpy、pandas、matplotlib的用法和套路,可以说是非常重要。
比如以下部分:
#2018Btask1_2
SaleList = [line.rstrip('\n').split(',') for line in open('result\\'+file,'r')]
TimeList = [line[5].replace('/',' ').split(' ') for line in SaleList]
#代码来自 @蘑菇果实使用者=w=
很复杂的代码,因为题目给的csv文件,朴素做法的确是需要类似 line.rstrip(’\n’).split(’,’) 这样的部分,但是当你学会pandas后,就根本不需要这样处理了:
#2019Atask1_3 统计每个中类商品的促销销售金额和非促销销售金额,将结果保 存为“task1_3.csv”
import pandas as pd
def task1_3():
data = pd.read_csv('data.csv')
data_yes = data[data['是否促销'] == '是']
data_no = data[data['是否促销'] == '否']
data_task1_3_yes = pd.pivot_table(data_yes, index = ['中类名称'], values = ['销售金额'], aggfunc = 'sum')
data_task1_3_no = pd.pivot_table(data_no, index = ['中类名称'], values = ['销售金额'], aggfunc = 'sum')
data_task1_3 = pd.DataFrame({'促销销售金额': data_task1_3_yes.iloc[:, 0], '非促销销售金额': data_task1_3_no.iloc[:, 0]})
data_task1_3.to_csv('task1_3.csv', encoding = 'utf_8_sig')
其中pandas库提供的数据结构Dataframe非常适合存储二维数据,对数据进行操作也非常快捷和方便。通过 pandas.read_csv() 方法可以直接把csv读取,也不再需要使用 .split(’.’) 这样的笨方法。所以非常推荐大家去学习numpy&pandas的用法及其提供的数据结构。
再者就是数据可视化。一般采用matplotlib或seaborn这两个库之一,这里以matplotlib为例,笔者自己总结的绘制折线图固定代码模板。这样在比赛遇到相关题目时可以直接复制大段代码,然后简单处理题目数据并套用即可。
因此笔者尝试根据自己经验总结一下参赛的学习计划该怎么规划:
参赛过程可谓稍有曲折。比赛要求是A、B题各一天,每天12小时,要求最后提交代码和论文。其中论文并没有严格要求格式,如果能规范正规论文格式当然更好。
A题题目出来后,我们三个人立刻开始分工。一人做task1,两人做task2。当时我们预计的数据预处理和简单数据挖掘部分大概在上午12点之前可以全部完成,实际上却有不同程度的麻烦发生。数据预处理倒是很顺利,A同学很快就完成了;但是task2的任务复杂度超出了我的想象,事实上我花了将近7小时在其中一道题上,最后还是做错了。代码的时间复杂度极高,加上题目给的数据基本都是几十万行的,朴素硬解犹如炼丹,出一张图要等几十分钟,最后思路还是错的。
(一定要多审题,划重点)
总结来说,当一道题完全做不动时,要主动寻求队友的帮助,可以互相换换题做,多讨论,不要死磕。
A题做完的时候三个人已经很累了,晚上九点多出学校吃夜宵,因为六七点是紧张的赶deadline和赶论文时间,根本顾不上晚饭。当时我们三个人普遍对今天不太满意,但是又累到不想再打一天,最后达成共识:早上八点来实验室看下题目难度,如果题目比较常规且好做就肝,如果是怪题就直接下班。
幸运的是我们选择了坚持。第二天来的时候大家重新充满了精力,二话不说开始干B题。B题中意外的出现了“数字大屏”这一从来没了解过的数据可视化呈现方式。这一部分通过讨论后,我们决定采取了分别制图后用photoshop制图的方式(笔者熟练掌握ps,所以多一项技能一定是好事~)。最后的task3部分,我们采用的思路是用sklearn库里的KMeans算法,这里也推荐大家至少一人要去了解一下简单的机器学习算法和数学建模方法,免得task3无从下手。
希望这篇博客对你有帮助,加油!