我写这篇文章是缘于机器学习联络小组里的一次讨论

机器学习模型中有许多种不同方法可以用来解决分类和回归问题。对同一个问题来说,这些不同模型都可以被当成解决问题的黑箱来看待。然而,每种模型都源自于不同的算法,在不同的数据集上的表现也各不相同。最好的方法是使用交叉比对的方式来决定在待测试数据上哪种模型的效果最好。

在此我尝试对每种模型的算法模式进行简要总结,希望能帮助你找着适合特定问题的解决方法。

基于决策树的方法

基本的学习方法是依据最有区分度的划分条件,递归地将训练数据划分成具有同质成员的桶块。“同质性”的衡量标准是基于输出标签而定的。当输出标签是数字值时,衡量标准是桶块成员的方差;当输出标签是类别时,衡量标准是桶块成员的熵或基尼系数。在学习过程中,基于输入的不同的划分条件将被一一尝试(以贪心的方式):当输入是类别时(星期一,星期二,星期三……),输入会先被转换成二元值(isMon, isTue, isWed…),然后依据二元值的真/假值情况作为决策边界来评估同质性;当输入是数字值或序号值时,训练数据各输入值之间的大小关系将被用作决策边界。当进一步划分该决策树在同质性上已经不能得到明显受益时,训练过程就将停止。叶节点所表示的桶块成员将对最终的预测结果进行投票:当输出是类别时,占大多数的成员决定最后的输出类别;当输出是数值时,各成员的平均值即为最后的输出值。

决策树的优点是,它对输入和输出数据的类型没有严格限制,既可以是类别,也可以是二元值或数字值。决策节点的深度也揭露了不同输入变量对最终结果的影响程度。然而,决策树的局限性在于,每个分裂点的决策边界是一个具体的二元决策。而且在每一个时刻,决策条件只考虑一个(而不是综合地考虑多个)输入属性。决策树的另一个缺点在于,一旦习得了一棵决策树,在后续就无法对其进行增量更新了。如果有新的训练数据加入,就必须放弃这棵旧的决策树,从头再重新生成整棵新的决策树。

然而,当决策树和其他的一些集成方法——如随机森林(Random Forest)方法和提升决策树(Boosting Tree)方法——相结合后,可以解决上述的很多局限性。例如,梯度提升决策树在很多问题上都能取得比其他的机器学习模型更好的效果,同时它也是近年来最热门的机器学习方法之一。

基于线性回归的方法

基本的假设是,输出变量(数字值)可以表示为一系列输入变量(也是数字值)的线性组合(加权和)。如 y = w1 * x1 + w2 * x2 + w3 * x3 ...。

训练阶段的最终目标是要在使得错误函数的损失(y, w1 * x1 + w2 * x2 + ...)最小的前提下,确定出系数w1,w2 ...梯度下降法是解决该问题的经典方法。它的主要思想是沿着损失函数的最大梯度方向不断调整w1, w2等值。

线性回归方法的输入变量要求必须是数字值。对二元变量来说,它将被表示为0和1。对类别性的变量来说,每个可能的值将被表示为一个独立的二元变量(也是0和1)。对于输出来说,如果它是一个二元变量(0,1),那么将用一个回归函数将负无穷大到正无穷大的值域变换为0到1的范围。这种方法被称为逻辑回归并且使用另一种基于最大似然率的损失函数。

为了避免过度拟合,正则化技术(L1,L2)被用来对较大的w1,w2等值进行惩罚。L1和L2方法分别是将w1的绝对值和平方加到损失函数中。L1会更大程度地打压冗余或不相关的特征(赋予非常小的权值/系数),可以被拿来选择具有高影响度的特征。

线性模型的强大在于,它在算分和学习上都具有非常好的效果。基于随机梯度下降的学习算法具有很高的可扩展性,可以用来处理增量学习问题。线性模式的缺点在于其对于输入特征的线性假设通常是不成立的。因此,一种重要的方法是请相关领域的专家对每一个输入特征进行转换。另一种常用的方法是使用各种不同的转换函数,如1/x, x^2, log(x)等,寄希望于这些函数中的一个会和输出具有线性关系。线性度可以通过观察残差(y – predicted_y)是否是正态分布的(利用高斯分布的常态机率图) 来判断。

神经网络

神经网络可以表示为多层感知器(每一个感知器都是一个逻辑回归单元,具有多个二元输入和一个二元输出)。因为有多个层次,这相当于z = logit(v1 * y1 + v2 * y2 + ...),其中y1 = logit(w11 * x1 + w12 * x2 + ...)。

多层模型使得神经网络可以学习输入x和输出z之间的非线性关系。典型的学习技术是“反向错误传播”,错误从输出层被反向传播到输入层来调整相应权值。

需要注意的是,神经网络只接受二元输入。这意味着我们需要将类别型输入转换成多个二元变量。对于数值型输入变量,我们可以将其转换成1/0字符串。类别型变量和数值型输出可以通过相应方式进行转换。

贝叶斯网络

贝叶斯网络实质上就是一个依赖图,图中的每个节点代表一个二元变量,每条边(有向的)代表依赖关系。如果节点A和节点B均有一条边指向节点C,这意味着C的概率取决于A和B的布尔值的不同组合。如果节点C指向节点D,那么节点D也依赖于A和B的值。

该方法的学习过程是要对每个节点找出其所有进入边的联合概率分布,这可以通过计算A、B和C点的观察值获得,然后就可以更新节点C上的联合概率分布表。一旦我们对每个节点都有了相应的联合概率分布表,我们就可以利用贝叶斯规则,通过已观察节点(输入变量)来计算任意隐藏节点(输出变量)的概率。

贝叶斯网络的长处在于它具有很高的可扩展性并且可以增量式地学习,因为我们只需计算已观察节点并且更新相应的概率分布表即可。和神经网络一样,贝叶斯网络需要所有输入数据为二元值,类别型变量需要如前述转换成多个二进制变量。通常来说,数值型变量并不太适合贝叶斯网络。

支持向量机

支持向量机可以接受数值型输入和二元输出。它的核心思想是要找出一个能最大区别两类输出的线性平面。类别型输入将被转换成数值型输入,同时类别型输出可以被模拟为多个二元输出。

使用一个不同的损失函数,支持向量机也可以完成回归的功能(称为SVR)。我自己还没有用过这种方法,所以对此我不便多说。

支持向量机的优点在于它可以处理非常多维的数据。另外,借助核函数,它还可以处理非线性关系。

最近邻

最近邻方法并不是以习得一个模型为目的。其主要思想是要从训练集中找出K个近似的数据点,并且用它们来对输出进行插值运算——对于类别型和数值型的输出来说分别是占大多数的类别和数值平均值(或者是加权平均值)。K是一个可调的参数,需要用交叉验证的方法来选择其最优值。

最近邻方法需要定义一个距离函数来寻找得最近的邻居。对于数值型输入来说,通常会将输入正规化再除去标准差。当输入是独立的时,通常使用欧几里德距离,否则就使用马氏距离(Mahalanobis Distance,表示输入特征对之间的关联度)。对于二元属性,则使用杰卡德距离(Jaccard Distance)。

K近邻方法好在它很朴素简洁,因为无需去训练一个模型。当有新数据到来时,增量式学习就可以自动开始(旧数据已经可以删除)。然而,该方法需要把数据组织成一棵可感知距离(distance aware)的树,即需要在O(logN)而非O(N)的时间复杂度里找到最近邻居。K近邻方法的另一个缺点是不能处理多维数据。此外,不同因子的权值调优(通过对不同权值组合的交叉比对)是一项沉闷乏味的工作。

原文标题:Characteristics of Machine Learning Model

原文链接:http://www.wking-china.com/xpjylc/2012/02/characteristics-of-machine-learning.html#links

乐译文萃看好文章!