机器学习发展到今天已经有众多优秀前辈给我们贡献了各种各种现成的开源包
以最流行的 Scikit-learn 为例,提供了包括回归 (Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering) 等方法的开源包,使用者可以灵活的实现各种建模操作。但是也有人发现了,同样的开源包不同的人建出的模型效果是不一样的,甚至大相径庭。为什么大牛就能建出高质量模型,而我基于开源包建的模型效果总是不尽人意呢?主要原因有以下三点:
首先是数据本身质量差。数据挖掘就像挖金矿,含金量高,那么挖掘难度就小,出金率就高,反之含金量低,那么就会难度大效果差。数据问题大概可以从 2 个方面来考虑,首先要检查数据量是否充足,大部分的机器学习算法都需要一定量的数据才能正常工作,太少的数据量会导致建模失败或模型效果不好,尤其要注意不平衡样本中阳性样本的数量;其次要分析参与建模的数据样本和特征分别是否具有代表性,例如要通过民调来预测美国总统大选,那么民调的样本要具有全面的代表性,不能只抽查偏向某一方的人群或地区,除了样本要有代表性数据特征也要有充足的相关性才容易建出好的模型。
但是,我和大牛使用的是同样数据,建出的模型依然不好,又是怎么回事?
第二个原因是预处理没做好。原始数据往往是不能拿来直接建模,还需要做预处理,预处理做的是否合适会对模型结果产生很大影响。但同时预处理也是一件十分头大的工作,因为它没有固定的方法可言,数据特点和分布不同预处理的方法也就不同,需要不断地去尝试,这也正是为什么我们使用开源包复制了别人的流程,也依然效果不好的。以简单的缺失值处理为例,比如在年龄的变量中,5% 的顾客没有指定年龄,那么你必须决定是整体的忽略这些特征,还是忽略这部分有缺失的实例,又或者是将缺失值补充完整(比如,填写年龄值的中位数还是平均数或是更复杂的方式填充),或者是训练一个带这个特征的模型,再训练一个不带这个特征的模型,等等,以及,当缺失率达到 90% 时是否还能采用相同的处理方法。再例如原始数据可能会存在错误、异常值和噪声,算法也是很难检测到数据规律的,还有高基数变量,非正态分布,时间特征