本人也是小白,阅读他人的代码并不容易,虽然作者会有解释(博客、视频等),但并非人人都能理解。
本文试图通过一个案例来学习他人的方案来达到学习的目的,我也当是写给自己看了,反正没人看当做笔记好了。
注:阅读代码非常消耗时间,但对于学习的提升会很大。
1、找到其中一个竞赛,里面一定要有作者提供源码,不然没法去学习。
竞赛页面:
https://tianchi.aliyun.com/competition/introduction.htm?spm=5176.100067.5678.1.3f1c2163BGVGtT&raceId=231647
这是我从某公众号中看到的,因为附带源码,所以就去看看了。是一个亚军的方案。
作者方案及其讲解:https://github.com/YouChouNoBB/ijcai-18-top2-single-mole-solution
2、不要一上来就阅读源代码,否则会一脸懵逼。先看看了解下竞赛题目及其数据解释
先了解数据非常重要,可以下载数据去理解一下。
注意:打开数据要小心,因为数据可能非常大,用什么软件打开可能会导致失去响应,耗内存,卡死电脑也不奇怪。
我这里用notepad++打开,
有提示,起码不会直接卡死软件,太大的话可以自行用pandas来切分成多个文件。
不想这么麻烦的话,直接看竞赛的数据介绍也行。
因为我们是了解做法,知道作者如何处理数据和为什么要这样处理数据即可。
3、拿到源代码了,要按什么顺序去阅读也是一个很重要的问题。
千万不要被作者的代码量吓到,其实大部分操作并不难,阅读下去会发现没什么,可能有大部分的重复操作。
一般的读程序方式是先看main函数的,然后再逐个看调用函数。
但这里的函数可能很多,分的文件可能也多,从源头找起可能很费劲,而且机器学习其实函数单独看也不算太难。
当然首先要看作者的README.md,但这里面作者是叫你去看他的博客或者视频。
当然这是非常好的方式,但我选择直接看。
我们先看run.sh,一般机器学习的人会选择linux系统,所以最后都会有一个.sh文件用以批处理运行。
没有的话只能从名字来判断顺序了,一般都是先数据后模型,再验证。
我们这里直接按这个文件里的顺序来看,因为这是作者的运行顺序,有助于我们从头(数据处理)开始了解。
当然可能还存在着作者在文件中用来辅助运行的文件,这些要看头文件是否有导入来阅读。
4、首先,当然是数据的处理,这里需要对照着数据的意思去理解作者这样处理数据的原因。
很幸运的是,作者采用的是易懂的英文作为各种名字,这样我们阅读起来更方便快捷。
这里的注释都是我自己加的,帮助自己理解,这个函数是作者在查找相同的类别数。
边阅读边写上自己理解的注释,是阅读他人代码的好方法。
我们需要知道数据代表什么,而且数据的形式是什么?
这些在竞赛页面都会写得很清楚。
5、阅读过程中肯定会遇到自己不懂的api,这个通过上网查询。
只需要了解它的作用即可(不必深究,不然又得学习一个库了)
竞赛算法并不会写得太复杂,这样我们可以去理解作者的做法。
当然查询还得看下调用的头文件,因为可能不同库的函数名一样。
6、通常作者的每个文件都是可以单独运行的,除了最后含main的那个(最主要的那个)。
但不建议运行,因为肯定是能跑的,不然作者拿什么去参赛;
还有你跑的话,可能在本地会发生错误(确实什么本地文件,没有什么库),修改其代码然后跑通并没有必要。
我们要做的是理解其思想,没必要浪费自己的时间,等你下载文件,下载库都已经没什么时间了。
更可况,有些参赛选手是拿几个GPU去跑的,普通电脑根本带不动。
这里作者跑多线程,作者是采用线程分开处理数据的,即不同线程处理不同数据,以免混淆。
7、处理完数据后(字符型数据标签化、填充缺省值等),接下来是特征工程。
所以说要理解数据很重要,不然都无法去实现高效模型。
直接阅读代码可能看不到作者的分析数据过程,可以参考作者博客或视频。
但代码是作者分析数据后的结果操作,所以直接阅读也不是问题。
特征工程的工作量可能会非常大,阅读时知道作者产生的新特征代表什么挺重要。
所幸作者用英文加下划线表达,省去了我大量的阅读。
要避免深究代码,没必要,每个人都有自己的实现方式,又不是什么底层操作。
理解作者函数的作用,输入和返回值即可。
因为特征工程(尤其是参赛的)动则上百行。
特征工程会涉及到大量的pandas的操作,如果你想跟着作者学习分析数据,
可以自己在竞赛页面取少量数据进行操作,包括数据融合,创建新特征,可视化分析等。
8、最后看到,作者大量的代码,大量的文件都投入到了特征工程当中。
最后处理模型只有一个文件,但模型处理看似代码量少,其实各种调整模型参数可是很伤脑筋的。
可想而知,要想参加比赛,除了有能运行的电脑之外,数据的分析能力也是非常重要的。
可能大部分时间都会用在特征工程上,现实情况也的确如此,机器学习也并非学习模型。
通过该文件的导入库情况可知,作者采用了lgb模型来分析。
不懂作者使用的模型也没关系,可以自己慢慢学习。基本上
模型的操作基本上是拟合数据,调参,训练,预测等。
最后是交叉验证。
9、还有一个作者没跑的文件,其实也是处理模型,里面是简单的逻辑回归模型。
这里提出建议,不要一上来就对数据采用各种复杂的模型,先用逻辑回归看看,
然后对比一下模型之间的错误率、准确率等再进行模型的选择。
总算阅读完了,不简单啊,这里膜拜一下这位作者(其实是一个三人团队):请受小弟一拜。
这里阅读的是参赛代码,并非所有代码都这么友好,有注释用英文名等等,
但机器学习算法的途径殊途同归,可以同样地去理解。
现在算法层出不穷,不要强迫自己什么都记住,什么都会,
毕竟人又不是机器人,重要的是手段和学习能力。