机器学习发展到今天已经有众多优秀前辈给我们贡献了各种各种现成的开源包
以最流行的 Scikit-learn 为例,提供了包括回归 (Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering) 等方法的开源包,使用者可以灵活的实现各种建模操作。但是也有人发现了,同样的开源包不同的人建出的模型效果是不一样的,甚至大相径庭。为什么大牛就能建出高质量模型,而我基于开源包建的模型效果总是不尽人意呢?主要原因有以下三点:
首先是数据本身质量差。数据挖掘就像挖金矿,含金量高,那么挖掘难度就小,出金率就高,反之含金量低,那么就会难度大效果差。数据问题大概可以从 2 个方面来考虑,首先要检查数据量是否充足,大部分的机器学习算法都需要一定量的数据才能正常工作,太少的数据量会导致建模失败或模型效果不好,尤其要注意不平衡样本中阳性样本的数量;其次要分析参与建模的数据样本和特征分别是否具有代表性,例如要通过民调来预测美国总统大选,那么民调的样本要具有全面的代表性,不能只抽查偏向某一方的人群或地区,除了样本要有代表性数据特征也要有充足的相关性才容易建出好的模型。
但是,我和大牛使用的是同样数据,建出的模型依然不好,又是怎么回事?
第二个原因是预处理没做好。原始数据往往是不能拿来直接建模,还需要做预处理,预处理做的是否合适会对模型结果产生很大影响。但同时预处理也是一件十分头大的工作,因为它没有固定的方法可言,数据特点和分布不同预处理的方法也就不同,需要不断地去尝试,这也正是为什么我们使用开源包复制了别人的流程,也依然效果不好的。以简单的缺失值处理为例,比如在年龄的变量中,5% 的顾客没有指定年龄,那么你必须决定是整体的忽略这些特征,还是忽略这部分有缺失的实例,又或者是将缺失值补充完整(比如,填写年龄值的中位数还是平均数或是更复杂的方式填充),或者是训练一个带这个特征的模型,再训练一个不带这个特征的模型,等等,以及,当缺失率达到 90% 时是否还能采用相同的处理方法。再例如原始数据可能会存在错误、异常值和噪声,算法也是很难检测到数据规律的,还有高基数变量,非正态分布,时间特征等等都是需要处理的。
花时间来预处理数据是非常值得的投入,事实上,大多数数据科学家也都会花费相当多的时间来做这项工作。而要做好预处理是需要深厚的统计学基础和丰富的数据处理经验,并且经过多次尝试才能做好的。机械的使用开源包复制别人的预处理流程甚至几乎不做什么预处理直接就开始建模,模型效果当然就只能看运气了。
除了预处理外,还有算法参数选择不当的问题。数据挖掘算法和数据库运算中用到的排序、分组算法有很大不同,后者是确定的算法,同样的数据进来就会出同样的结果,也没多少参数可调。而数据挖掘算法有许多经验因素,同样的数据进去,设置不同的参数来训练模型,结果很可能是不一样,甚至可能差别很大。以常用的 GBDT 算法为例,需要的参数有十几个,如下图所示,这些参数表示什么含义,如何去设置,如何能快速找到最佳值,当模型效果不好时如何去调参, 这都需要建模师对算法原理和应用场景有深刻的理解才能顺利进行。况且算法也不是只有这一种,在建模时用哪种算法,是用一种还是多种组合用,都是建模师要需要考虑的。
开源包的特点是灵活,几乎可以实现任何操作,但缺点是模型效果取决于使用者的水平,虽然都能建出模型,但是如果没有背后的统计学、微积分、概率论等数学理论支持,不懂得如何合理的处理数据,选模型,选参数,做评估等等,也很难建出好模型。打个形象点的比喻,开源包里的算法和函数就好像是一堆模块化的建筑材料,而要盖一座大楼仅仅有这些原料是远远不够的,还要懂得建筑结构,材料,机械,流体力学,暖通工程等理论才能建出适合住户需求且安全的大楼;否则只能叫搭房子,至于搭出来的房子能不能住人、会不会倒,经常是看运气。
那么,对于我们普通的初学者或者程序员是不是就很难做数据挖掘了?也不是,近年来兴起的自动建模技术就可以帮到我们。自动建模技术是将统计学家和数学家的数据处理经验和理论融入到软件中,使得软件能够智能的去完成数据预处理,建模型,选参数,做评估等一系列的工作。对于使用者来讲只需要将数据丢进自动建模工具,并且配置好目标,工具就能够自动建出优质模型。因此无论是业务人员还是普通的 IT 程序员都可以通过自动建模技术来做数据挖掘业务,连简单的 Python 都不用再学就可以享受 AI 技术带来的福利。
对进一步数据挖掘和 AI 技术感兴趣的同学还可以搜索“乾学院”,上面有面向小白的零基础“数据挖掘”免费课程,或者直接点下面的链接也可以:
http://www.raqsoft.com.cn/wx/course-data-mining.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。