一、 数据挖掘十大经典算法
最近写了一些机器学习的文档,对应数据挖掘经典算法,列表如下:
1. 聚类K-Means
2. 关联Apriori
《机器学习_规则与关联规则模型Apriori、FP-Growth》
3. 最大期望EM
4. 决策树DTree
5. CART: 分类与回归树
6. 贝叶斯Bayes
《机器学习_统计模型之(一)贝叶斯公式》
《机器学习_统计模型之(二)贝叶斯网络》
《机器学习_统计模型之(三)朴素贝叶斯》
7. 线性回归logistic
8. 集成算法adaBoost
9. 支持向量机SVM
10. PageRank
(没写)
11. 其它(特征工程)
《机器学习_用SVD奇异值分解给数据降维》
《机器学习_用PCA主成分分析给数据降维》
12. 总结
数据挖掘是人工智能的一个分枝,基本覆盖了大部分机器学习算法。
有了深度学习之后,这些算法大多被归入浅层学习。至于是选择深度学习还是浅层学习,主要还是要看具体问题。两种学习也是强相关的,像在CNN和RNN的算法中其实也容入了浅层学习的很多想法。而HMM和GBDT看起来和深度学习也很相似。我觉得深度模型更值得借鉴的是它可以在多个层次同时调整。在集成浅层算法时,也可以参考。
二、 浅谈算法选型
以下是一些个人看法,希望在算法选型时给大家一些启发。
1. 算法的分类
从开始看第一本讲算法书起,就希望能把算法归类,或者能让算法和问题类型对应起来。但好像并不这么简单。
《机器学习》(Peter Flach著)把有学习模型分成三类:几何模型,统计模型,逻辑模型。简单地说,几何模型就是计算实例间的距离;统计模型是对已知变量X与未知变量Y之间的依赖关系统计建模;逻辑模型更偏重规则,每一种算法都被可被划入其中一种至几种分类。
虽然不能完全分开,但是遇到具体问题的时候,三选一总比十选一要容易得多。
2. 微调与重构
罗曼罗兰说:“大半的人在二十岁或三十岁上就死了。一过这个年龄,他们只变了自己的影子”。这其实挺合理的。当一个基础系统,很多上层都依赖于它时,任何修改都可能导致上层多个系统的崩溃,所以一般系统达到一定规模之后,修改都以查缺补漏为主。一个系统停止更新了,基本也就看到天花板了。
微调总比重构来得容易,但效果也有限。以ImageNet比赛为例,每一次重大的进步都是因为加入了新结构,而微调和增加算力,效果都不特别特著。
我们使用现成算法也有这个问题,比如用sklearn库中的算法时,主要是调参,对调用者来说库就是黑盒,没法针对数据的特征做内部的修改,或者在内部嫁接多个算法。用库,你能轻松地赶上大家的水平,但是很难突破。所以有时候,看一个数据挖掘比赛,前十名用的都是同一个算法,大家主要在比调参和特征工程。
3. 有监督、无监督与半监督
确定有监督、无监督,是选择算法的第一步。这两种情况对应的算法完全不同,不过现在也常把聚类(无监督)放在有监督学习中使用(比如CNN)。
强化学习是一种半监督学习,一般是根据规则模拟一些场景,用于训练,比如利用左右互博的方式训练下棋,自动驾驶,机器人等等,它可以作为一种有效的数据补充。
4. 精确与启发
精确模型对所有数据有效,往往用于预测(比如决策树),而启发模型对部分数据有效,往往用于筛选(比如规则模型)。
具体选择哪种模型,取决于已知数据带有信息量的多少。如果用属性和结果做图,发现大多数数据都是有规律的,就使精确模型。如果大多数都是噪音,只有少量有价值的点(或者是稀疏的),最好能选用启发模型,至少也要先把有序数据和无序数据分开。
5. 单模式与多模式
取得正确结果的路径往往不止一条,就如同决策树中的分枝,从这个角度看,处理复杂问题的时候,逻辑模型是必不可少的。
对于多模式,像朴素贝叶斯,线性回归这种简单算法就不太适用了,有时候我们会使用集成算法,把几种算法结合在一起。
处理具体问题的时候,也需要先判断这是单模式问题,还是多模式问题?单模式,可能倾向用几何距离类的算法,多模式可能要考虑逻辑和统计类,集成算法,或者先看看能不能把数据拆分后再做进一步处理。
6. 总结与推理
模型有时被划分成判别式和生成式,判别式的训练过程一般以总结为主,比如决策树,线性拟合;而生成式中加入了一些推理,比如说关联规则,一阶规则,贝叶斯网络等等。选算法时也要注意,是否需要机器推导。
7. 表面与隐藏
隐马尔可夫模型和神经网络模型中都有隐藏层的概念,它阐释出内在的关系,这类算法常对应一些比较复杂的问题。
8. 线性与非线性
线性指量与量之间按比例、成直线的关系,在数学上可以理解为一阶导数为常数的函数;非线性则指不按比例、不成直线的关系,一阶导数不为常数。
线性模型指一般线性模型,线性混合模型和广义线性模型(先映射成线性模型,再做处理),比如线性拟合,logistic回归,局部加权线性回归,SVM都属于线性类的模型。有的也能拟合曲线,但作用范围有限。
神经网络的主要优点之一就是能解决非线性问题。
线性模型和线性变换都是非常基本元素,算法中几乎无处不在。一般线性模型用只能处理简单的问题,主要是和其它算法组合使用。
9. 相关性、组合与分解
分析属性间的关系对选择算法也很重要,有时能看到属性间有明显的关系,比如图像中每个像素与它上下左右的相邻像素都相关,这时候我们使用神经网络中的卷积来替代全连接。
实例间也可能存在联系,比如股票中涨跌幅就是两日收盘价计算出来的,相比于收盘价,涨跌幅更具意义。
另外,还有一些不太明显的关系,可以通过分析特征的相关系数得到,并使用降维减小相关性和减少数据。
10. 连续与离散
我们拿到的原始数据可能是连续的或是离散的,因为可以相互转换,数据的类型倒不是大问题,不过转换时,也需要注意一些细节。
比如说连续数据离散化时,需要去考虑切分的方法,像等深、等宽分箱,切分窗口重叠等等,最好能先用直方图分析一下数据的分布。
离散值转成连续值时也有一些问题,比如把:”男人”,“女人”与“孩子”,映射成0,1,2,那“男人”与“孩子”间的距离更大,这是明显是不合理的,这时候可能需要把一个属性拆成三个。
11. 数据保存
我们的思维中有多少是真正的思考,有多少是套路呢?如何把习得的套路保存下来,以及重用呢?
套路可能是决策树规则,可能是神经网络参数,可能是规则列表,又或是典型实例;还有一些学习得来的知识,怎么把它们容入连接成更大的模型?
对于人来讲,最终得以保存的可能是不可描述的经验和可描述的规则,规则可以是经验总结的,也可以是习得的,可以实例化,又可以加入进一步推导。它所涵盖的可能是全部(树模型),也可能是部分(规则模型),或者是一条主干(线性拟合)加上一些例外(离群点)。
12. 问题类型
下面看看常见的数据挖掘问题
i. 纯数据的预测问题:
通过各个特征值预测结果,比较流行使用GDBT和CNN算法。
ii. 关联问题:
如根据用户的浏览,收藏,购物,给用户推荐,可能用到聚类,关联规则。
iii. 复杂问题
涉及一些组合问题,比如自动驾驶,机器人,需要处理一些冲突,均衡,常使用神经网络,博弈算法,有时也用到增强学习。
iv. 专业领域的问题
如图像处理,音频,自然语言处理,地图数据,涉及专业领域的知识,需要分析数据的具体特点以选择算法。