机器学习的常用方法都有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习的常用方法都有哪些?相关的知识,希望对你有一定的参考价值。

参考技术A

梯度下降是非常常用的优化算法。作为机器学习的基础知识,这是一个必须要掌握的算法。借助本文,让我们来一起详细了解一下这个算法。


前言

本文的代码可以到我的Github上获取:

https://github.com/paulQuei/gradient_descent

本文的算法示例通过Python语言实现,在实现中使用到了numpy和matplotlib。如果你不熟悉这两个工具,请自行在网上搜索教程。


关于优化

大多数学习算法都涉及某种形式的优化。优化指的是改变x以最小化或者最大化某个函数的任务。

我们通常以最小化指代大多数最优化问题。最大化可经由最小化来实现。

我们把要最小化或最大化的函数成为目标函数(objective function)或准则(criterion)。

我们通常使用一个上标*表示最小化或最大化函数的x值,记做这样:

[x^* = arg; min; f(x)]


优化本身是一个非常大的话题。如果有兴趣,可以通过《数值优化》和《运筹学》的书籍进行学习。


模型与假设函数

所有的模型都是错误的,但其中有些是有用的。– George Edward Pelham Box


模型是我们对要分析的数据的一种假设,它是为解决某个具体问题从数据中学习到的,因此它是机器学习最核心的概念。

针对一个问题,通常有大量的模型可以选择。

本文不会深入讨论这方面的内容,关于各种模型请参阅机器学习的相关书籍。本文仅以最简单的线性模型为基础来讨论梯度下降算法。

这里我们先介绍一下在监督学习(supervised learning)中常见的三个符号:


    m,描述训练样本的数量

    x,描述输入变量或特征

    y,描述输出变量或者叫目标值

    请注意,一个样本可能有很多的特征,因此x和y通常是一个向量。不过在刚开始学习的时候,为了便于理解,你可以暂时理解为这就是一个具体的数值。

    训练集会包含很多的样本,我们用 表示其中第i个样本。

    x是数据样本的特征,y是其目标值。例如,在预测房价的模型中,x是房子的各种信息,例如:面积,楼层,位置等等,y是房子的价格。在图像识别的任务中,x是图形的所有像素点数据,y是图像中包含的目标对象。

    我们是希望寻找一个函数,将x映射到y,这个函数要足够的好,以至于能够预测对应的y。由于历史原因,这个函数叫做假设函数(hypothesis function)。

    学习的过程如下图所示。即:首先根据已有的数据(称之为训练集)训练我们的算法模型,然后根据模型的假设函数来进行新数据的预测。

    线性模型(linear model)正如其名称那样:是希望通过一个直线的形式来描述模式。线性模型的假设函数如下所示:

    [h_\\theta(x) = \\theta_0 + \\theta_1 * x]

    这个公式对于大家来说应该都是非常简单的。如果把它绘制出来,其实就是一条直线。

    下图是一个具体的例子,即: 的图形:

    在实际的机器学习工程中,你会拥有大量的数据。这些数据会来自于某个数据源。它们存储在csv文件中,或者以其他的形式打包。

    但是本文作为演示使用,我们通过一些简单的代码自动生成了需要的数据。为了便于计算,演示的数据量也很小。

    import numpy as np

    max_x = 10
    data_size = 10
    theta_0 = 5
    theta_1 = 2

    def get_data:
    x = np.linspace(1, max_x, data_size)
    noise = np.random.normal(0, 0.2, len(x))
    y = theta_0 + theta_1 * x + noise
    return x, y

    这段代码很简单,我们生成了x范围是 [1, 10] 整数的10条数据。对应的y是以线性模型的形式计算得到,其函数是:。现实中的数据常常受到各种因素的干扰,所以对于y我们故意加上了一些高斯噪声。因此最终的y值为比原先会有轻微的偏离。

    最后我们的数据如下所示:

    x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]

    我们可以把这10条数据绘制出来这样就有一个直观的了解了,如下图所示:

    虽然演示用的数据是我们通过公式计算得到的。但在实际的工程中,模型的参数是需要我们通过数据学习到的。所以下文我们假设我们不知道这里线性模式的两个参数是什么,而是通过算法的形式求得。

    最后再跟已知的参数进行对比以验证我们的算法是否正确。

    有了上面的数据,我们可以尝试画一条直线来描述我们的模型。

    例如,像下面这样画一条水平的直线:

    很显然,这条水平线离数据太远了,非常的不匹配。

    那我们可以再画一条斜线。

    我们初次画的斜线可能也不贴切,它可能像下面这样:

    最后我们通过不断尝试,找到了最终最合适的那条,如下所示:

    梯度下降算法的计算过程,就和这种本能式的试探是类似的,它就是不停的迭代,一步步的接近最终的结果。


    代价函数

    上面我们尝试了几次通过一条直线来拟合(fitting)已有的数据。

    二维平面上的一条直线可以通过两个参数唯一的确定,两个参数的确定也即模型的确定。那如何描述模型与数据的拟合程度呢?答案就是代价函数。

    代价函数(cost function)描述了学习到的模型与实际结果的偏差程度。以上面的三幅图为例,最后一幅图中的红线相比第一条水平的绿线,其偏离程度(代价)应该是更小的。

    很显然,我们希望我们的假设函数与数据尽可能的贴近,也就是说:希望代价函数的结果尽可能的小。这就涉及到结果的优化,而梯度下降就是寻找最小值的方法之一。

    代价函数也叫损失函数。

    对于每一个样本,假设函数会依据计算出一个估算值,我们常常用来表示。即 。

    很自然的,我们会想到,通过下面这个公式来描述我们的模型与实际值的偏差程度:

    [(h_\\theta(x^i) - y^i)^2 = (\\widehaty^i - y^i)^2 = (\\theta_0 + \\theta_1 * x^i - y^i)^2]

    请注意, 是实际数据的值, 是我们的模型的估算值。前者对应了上图中的离散点的y坐标,后者对应了离散点在直线上投影点的y坐标。

    每一条数据都会存在一个偏差值,而代价函数就是对所有样本的偏差求平均值,其计算公式如下所示:

    [L(\\theta) = \\frac 1m \\sum_i=1^m(h_\\theta(x^i) - y^i)^2 = \\frac 1m \\sum_i=1^m(\\theta_0 + \\theta_1 * x^i - y^i)^2]

    当损失函数的结果越小,则意味着通过我们的假设函数估算出的结果与真实值越接近。这也就是为什么我们要最小化损失函数的原因。

    不同的模型可能会用不同的损失函数。例如,logistic回归的假设函数是这样的:。其代价函数是这样的:

    借助上面这个公式,我们可以写一个函数来实现代价函数:

    def cost_function(x, y, t0, t1):
    cost_sum = 0
    for i in range(len(x)):
    cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
    cost_sum += cost_item
    return cost_sum / len(x)

    这个函数的代码应该不用多做解释,它就是根据上面的完成计算。

    我们可以尝试选取不同的 和 组合来计算代价函数的值,然后将结果绘制出来:

    import numpy as np
    import matplotlib.pyplot as plt

    from matplotlib import cm
    from mpl_toolkits.mplot3d import Axes3D

    theta_0 = 5
    theta_1 = 2

    def draw_cost(x, y):
    fig = plt.figure(figsize=(10, 8))
    ax = fig.gca(projection='3d')
    scatter_count = 100
    radius = 1
    t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
    t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
    cost = np.zeros((len(t0_range), len(t1_range)))
    for a in range(len(t0_range)):
    for b in range(len(t1_range)):
    cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
    t0, t1 = np.meshgrid(t0_range, t1_range)

    ax.set_xlabel('theta_0')
    ax.set_ylabel('theta_1')
    ax.plot_surface(t0, t1, cost, cmap=cm.hsv)

    在这段代码中,我们对 和 各自指定了一个范围进行100次的采样,然后以不同的 组合对来计算代价函数的值。

    如果我们将所有点的代价函数值绘制出来,其结果如下图所示:

    从这个图形中我们可以看出,当 越接近 [5, 2]时其结果(偏差)越小。相反,离得越远,结果越大。


    直观解释

    从上面这幅图中我们可以看出,代价函数在不同的位置结果大小不同。

    从三维的角度来看,这就和地面的高低起伏一样。最高的地方就好像是山顶。

    而我们的目标就是:从任意一点作为起点,能够快速寻找到一条路径并以此到达图形最低点(代价值最小)的位置。

    而梯度下降的算法过程就和我们从山顶想要快速下山的做法是一样的。

    在生活中,我们很自然会想到沿着最陡峭的路往下行是下山速度最快的。如下面这幅图所示:

    针对这幅图,细心的读者可能很快就会有很多的疑问,例如:

    对于一个函数,怎么确定下行的方向?

    每一步该往前走多远?

    有没有可能停留在半山腰的平台上?

    这些问题也就是本文接下来要讨论的内容。


    算法描述

    梯度下降算法最开始的一点就是需要确定下降的方向,即:梯度。

    我们常常用 来表示梯度。

    对于一个二维空间的曲线来说,梯度就是其切线的方向。如下图所示:

    而对于更高维空间的函数来说,梯度由所有变量的偏导数决定。

    其表达式如下所示:

    [\\nabla f(\\theta) = ( \\frac\\partial f(\\theta)\\partial \\theta_1 , \\frac\\partial f(\\theta)\\partial \\theta_2 , ... , \\frac\\partial f(\\theta)\\partial \\theta_n )]

    在机器学习中,我们主要是用梯度下降算法来最小化代价函数,记做:

    [\\theta ^* = arg min L(\\theta)]

    其中,L是代价函数,是参数。

    梯度下降算法的主体逻辑很简单,就是沿着梯度的方向一直下降,直到参数收敛为止。

    记做:

    [\\theta ^k + 1_i = \\theta^k_i - \\lambda \\nabla f(\\theta^k)]

    这里的下标i表示第i个参数。 上标k指的是第k步的计算结果,而非k次方。在能够理解的基础上,下文的公式中将省略上标k。

    这里有几点需要说明:

    收敛是指函数的变化率很小。具体选择多少合适需要根据具体的项目来确定。在演示项目中我们可以选择0.01或者0.001这样的值。不同的值将影响算法的迭代次数,因为在梯度下降的最后,我们会越来越接近平坦的地方,这个时候函数的变化率也越来越小。如果选择一个很小的值,将可能导致算法迭代次数暴增。

    公式中的 称作步长,也称作学习率(learning rate)。它决定了每一步往前走多远,关于这个值我们会在下文中详细讲解。你可以暂时人为它是一个类似0.01或0.001的固定值。

    在具体的项目,我们不会让算法无休止的运行下去,所以通常会设置一个迭代次数的最大上限。


    线性回归的梯度下降

    有了上面的知识,我们可以回到线性模型代价函数的梯度下降算法实现了。

    首先,根据代价函数我们可以得到梯度向量如下:

    [\\nabla f(\\theta) = (\\frac\\partial L(\\theta) \\partial\\theta_0, \\frac \\partial L(\\theta) \\partial\\theta_1) = (\\frac 2m \\sum_i=1^m(\\theta_0 + \\theta_1 * x^i - y^i) , \\frac 2m \\sum_i=1^m(\\theta_0 + \\theta_1 * x^i - y^i) x^i)]

    接着,将每个偏导数带入迭代的公式中,得到:

    [\\theta_0 := \\theta_0 - \\lambda \\frac\\partial L(\\theta_0) \\partial\\theta_0 = \\theta_0 - \\frac 2 \\lambda m \\sum_i=1^m(\\theta_0 + \\theta_1 * x^i - y^i) \\ \\theta_1 := \\theta_1 - \\lambda \\frac\\partial L(\\theta_1) \\partial\\theta_1 = \\theta_1 - \\frac 2 \\lambda m \\sum_i=1^m(\\theta_0 + \\theta_1 * x^i - y^i) x^i]

    由此就可以通过代码实现我们的梯度下降算法了,算法逻辑并不复杂:

    learning_rate = 0.01

    def gradient_descent(x, y):
    t0 = 10
    t1 = 10
    delta = 0.001
    for times in range(1000):
    sum1 = 0
    sum2 = 0
    for i in range(len(x)):
    sum1 += (t0 + t1 * x[i] - y[i])
    sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
    t0_ = t0 - 2 * learning_rate * sum1 / len(x)
    t1_ = t1 - 2 * learning_rate * sum2 / len(x)
    print('Times: , gradient: [, ]'.format(times, t0_, t1_))
    if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
    print('Gradient descent finish')
    return t0_, t1_
    t0 = t0_
    t1 = t1_
    print('Gradient descent too many times')
    return t0, t1

    这段代码说明如下:

    我们随机选择了 都为10作为起点

    设置最多迭代1000次

    收敛的范围设为0.001

    学习步长设为0.01

    如果我们将算法迭代过程中求得的线性模式绘制出来,可以得到下面这幅动态图:

    最后算法得到的结果如下:


    Times: 657, gradient: [5.196562662718697, 1.952931052920264]
    Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
    Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
    Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
    Gradient descent finish

    从输出中可以看出,算法迭代了660次就收敛了。这时的结果[5.193562479839619, 1.9533620008416623],这已经比较接近目标值 [5, 2]了。如果需要更高的精度,可以将delta的值调的更小,当然,此时会需要更多的迭代次数。


    高维扩展

    虽然我们举的例子是二维的,但是对于更高维的情况也是类似的。同样是根据迭代的公式进行运算即可:

    [\\theta_i = \\theta_i - \\lambda \\frac \\partial L(\\theta)\\partial \\theta_i = \\theta_i - \\frac2\\lambdam \\sum_i=1^m(h_\\theta(x^k)-y^k)x_i^k]

    这里的下标i表示第i个参数,上标k表示第k个数据。


    梯度下降家族BGD

    在上面的内容中我们看到,算法的每一次迭代都需要把所有样本进行遍历处理。这种做法称为之Batch Gradient Descent,简称BGD。作为演示示例只有10条数据,这是没有问题的。

    但在实际的项目中,数据集的数量可能是几百万几千万条,这时候每一步迭代的计算量就会非常的大了。

    于是就有了下面两个变种。


    SGD

    Stochastic Gradient Descent,简称SGD,这种算法是每次从样本集中仅仅选择一个样本来进行计算。很显然,这样做算法在每一步的计算量一下就少了很多。

    其算法公式如下:

    [\\theta_i = \\theta_i - \\lambda \\frac \\partial L(\\theta)\\partial \\theta_i = \\theta_i - \\lambda(h_\\theta(x^k)-y^k)x_i^k]

    当然,减少算法计算量也是有代价的,那就是:算法结果会强依赖于随机取到的数据情况,这可能会导致算法的最终结果不太令人满意。


    MBGD

    以上两种做法其实是两个极端,一个是每次用到了所有数据,另一个是每次只用一个数据。

    我们自然就会想到两者取其中的方法:每次选择一小部分数据进行迭代。这样既避免了数据集过大导致每次迭代计算量过大的问题,也避免了单个数据对算法的影响。

    这种算法称之为Mini-batch Gradient Descent,简称MBGD。

    其算法公式如下:

    [\\theta_i = \\theta_i - \\lambda \\frac \\partial L(\\theta)\\partial \\theta_i = \\theta_i - \\frac2\\lambdam \\sum_i=a^a + b(h_\\theta(x^k)-y^k)x_i^k]

    当然,我们可以认为SGD是Mini-batch为1的特例。

    针对上面提到的算法变种,该如何选择呢?

    下面是Andrew Ng给出的建议:

    如果样本数量较小(例如小于等于2000),选择BGD即可。

    如果样本数量很大,选择 来进行MBGD,例如:64,128,256,512。

    下表是 Optimization for Deep Learning 中对三种算法的对比

    方法准确性更新速度内存占用在线学习BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
    算法优化

    式7是算法的基本形式,在这个基础上有很多人进行了更多的研究。接下来我们介绍几种梯度下降算法的优化方法。


    Momentum

    Momentum是动量的意思。这个算法的思想就是借助了动力学的模型:每次算法的迭代会使用到上一次的速度作为依据。

    算法的公式如下:

    [v^t = \\gamma v^t - 1 + \\lambda \\nabla f(\\theta) \\ \\theta = \\theta - v_t]

    对比式7可以看出,这个算法的主要区别就是引入了,并且,每个时刻的受前一个时刻的影响。

    从形式上看,动量算法引入了变量 v 充当速度角色——它代表参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。名称动量来自物理类比,根据牛顿运动定律,负梯度是移动参数空间中粒子的力。动量在物理学上定义为质量乘以速度。在动量学习算法中,我们假设是单位质量,因此速度向量 v 也可以看作是粒子的动量。

    对于可以取值0,而是一个常量,设为0.9是一个比较好的选择。

    下图是momentum算法的效果对比:

    对原来的算法稍加修改就可以增加动量效果:

    def gradient_descent_with_momentum(x, y):
    t0 = 10
    t1 = 10
    delta = 0.001
    v0 = 0
    v1 = 0
    gamma = 0.9
    for times in range(1000):
    sum1 = 0
    sum2 = 0
    for i in range(len(x)):
    sum1 += (t0 + t1 * x[i] - y[i])
    sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
    v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
    v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
    t0_ = t0 - v0
    t1_ = t1 - v1
    print('Times: , gradient: [, ]'.format(times, t0_, t1_))
    if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
    print('Gradient descent finish')
    return t0_, t1_
    t0 = t0_
    t1 = t1_
    print('Gradient descent too many times')
    return t0, t1

    以下是该算法的输出:


    Times: 125, gradient: [4.955453758569991, 2.000005017897775]
    Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
    Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
    Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
    Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
    Gradient descent finish

    从结果可以看出,改进的算法只用了129次迭代就收敛了。速度比原来660次快了很多。

    同样的,我们可以把算法计算的过程做成动态图:

    对比原始的算法过程可以看出,改进算法最大的区别是:在寻找目标值时会在最终结果上下跳动,但是越往后跳动的幅度越小,这也就是动量所产生的效果。


    Learning Rate 优化

    至此,你可能还是好奇该如何设定学习率的值。

    事实上,这个值的选取需要一定的经验或者反复尝试才能确定。

    《深度学习》一书中是这样描述的:“与其说是科学,这更像是一门艺术,我们应该谨慎地参考关于这个问题的大部分指导。”。

    关键在于,这个值的选取不能过大也不能过小。

    如果这个值过小,会导致每一次迭代的步长很小,其结果就是算法需要迭代非常多的次数。

    那么,如果这个值过大会怎么样呢?其结果就是:算法可能在结果的周围来回震荡,却落不到目标的点上。下面这幅图描述了这个现象:

    事实上,学习率的取值未必一定要是一个常数,关于这个值的设定有很多的研究。

    下面是比较常见的一些改进算法。


    AdaGrad

    AdaGrad是Adaptive Gradient的简写,该算法会为每个参数设定不同的学习率。它使用历史梯度的平方和作为基础来进行计算。

    其算法公式如下:

    [\\theta_i = \\theta_i - \\frac\\lambda\\sqrtG_t + \\epsilon \\nabla f(\\theta)]

    对比式7,这里的改动就在于分号下面的根号。

    根号中有两个符号,第二个符号比较好理解,它就是为了避免除0而人为引入的一个很小的常数,例如可以设为:0.001。

    第一个符号的表达式展开如下:

    [G_t = \\sum_i = 1^t \\nabla f(\\theta)i\\nabla f(\\theta)i^T]

    这个值其实是历史中每次梯度的平方的累加和。

    AdaGrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的学习率;相反,对于出现频率较高的参数采用较小的学习率。因此,Adagrad非常适合处理稀疏数据。

    但该算法的缺点是它可能导致学习率非常小以至于算法收敛非常的慢。

    关于这个算法的直观解释可以看李宏毅教授的视频课程:ML Lecture 3-1: Gradient Descent。


    RMSProp

    RMS是Root Mean Square的简写。RMSProp是AI教父Geoff Hinton提出的一种自适应学习率方法。AdaGrad会累加之前所有的梯度平方,而RMSProp仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。

    该算法的公式如下:

    [E[\\nabla f(\\theta_i)^2]^t = \\gamma E[\\nabla f(\\theta_i)^2]^t - 1 + (1-\\gamma)(\\nabla f(\\theta_i)^t)^2 \\ \\theta_i = \\theta_i - \\frac\\lambda\\sqrtE[g^2]^t+1 + \\epsilon \\nabla f(\\theta_i)]

    类似的,是为了避免除0而引入。 是衰退参数,通常设为0.9。

    这里的 是t时刻梯度平方的平均值。


    Adam

    Adam是Adaptive Moment Estimation的简写。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

    Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

    该算法公式如下:

    [m^t = \\beta_1 m^t-1 + (1-\\beta_1) \\nabla f(\\theta) \\ v^t = \\beta_2 v^t-1 + (1-\\beta_2) \\nabla f(\\theta)^2 \\ \\widehatm^t = \\fracm^t1 - \\beta^t_1 \\ \\widehatv^t = \\fracv^t1 - \\beta^t_2 \\ \\theta = \\theta - \\frac\\lambda\\sqrt\\widehatv^t + \\epsilon\\widehatm^t]

    ,分别是对梯度的一阶矩估计和二阶矩估计。, 是对,的校正,这样可以近似为对期望的无偏估计。

    Adam算法的提出者建议 默认值为0.9,默认值为0.999,默认值为 。

    在实际应用中 ,Adam较为常用,它可以比较快地得到一个预估结果。


    优化小结

    这里我们列举了几种优化算法。它们很难说哪种最好,不同的算法适合于不同的场景。在实际的工程中,可能需要逐个尝试一下才能确定选择哪一个,这个过程也是目前现阶段AI项目要经历的工序之一。

    实际上,该方面的研究远不止于此,如果有兴趣,可以继续阅读 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 这篇论文或者 Optimization for Deep Learning 这个Slides进行更多的研究。

    由于篇幅所限,这里不再继续展开了。


    算法限制

    梯度下降算法存在一定的限制。首先,它要求函数必须是可微分的,对于不可微的函数,无法使用这种方法。

    除此之外,在某些情况下,使用梯度下降算法在接近极值点的时候可能收敛速度很慢,或者产生Z字形的震荡。这一点需要通过调整学习率来回避。

    另外,梯度下降还会遇到下面两类问题。


    局部最小值

    局部最小值(Local Minima)指的是,我们找到的最小值仅仅是一个区域内的最小值,而并非全局的。由于算法的起点是随意取的,以下面这个图形为例,我们很容易落到局部最小值的点里面。

    这就是好像你从上顶往下走,你第一次走到的平台未必是山脚,它有可能只是半山腰的一个平台的而已。

    算法的起点决定了算法收敛的速度以及是否会落到局部最小值上。

    坏消息是,目前似乎没有特别好的方法来确定选取那个点作为起点是比较好的,这就有一点看运气的成分了。多次尝试不同的随机点或许是一个比较好的方法,这也就是为什么做算法的优化这项工作是特别消耗时间的了。

    但好消息是:

    对于凸函数或者凹函数来说,不存在局部极值的问题。其局部极值一定是全局极值。

    最近的一些研究表明,某些局部极值并没有想象中的那么糟糕,它们已经非常的接近全局极值所带来的结果了。


    鞍点

    除了Local Minima,在梯度下降的过程中,还有可能遇到另外一种情况,即:鞍点(Saddle Point)。鞍点指的是我们找到点某个点确实是梯度为0,但它却不是函数的极值,它的周围既有比它小的值,也有比它大的值。这就好像马鞍一样。

    如下图所示:

    多类随机函数表现出以下性质:在低维空间中,局部极值很普遍。但在高维空间中,局部极值比较少见,而鞍点则很常见。

    不过对于鞍点,可以通过数学方法Hessian矩阵来确定。关于这点,这里就不再展开了,有兴趣的读者可以以这里提供的几个链接继续探索。


    参考资料与推荐读物

    Wikipeida: Gradient descent

    Sebastian Ruder: An overview of gradient descent optimization algorithms

    吴恩达:机器学习

    吴恩达:深度学习

    Peter Flach:机器学习

    李宏毅 - ML Lecture 3-1: Gradient Descent

    PDF: 李宏毅 - Gradient Descent

    Intro to optimization in deep learning: Gradient Descent

    Intro to optimization in deep learning: Momentum, RMSProp and Adam

    Stochastic Gradient Descent – Mini-batch and more

    刘建平Pinard - 梯度下降(Gradient Descent)小结

    多元函数的偏导数、方向导数、梯度以及微分之间的关系思考

    [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD

    作者:阿Paul https://paul.pub/gradient-descent/
参考技术B

机器学习是一类使用数据和算法来改善系统性能的方法。其中计算机程序在学习过程中自动改进,而不是被明确地编程。它有许多不同的方法,常见的可以分为三大类: 监督学习,无监督学习和强化学习。

监督学习是最常用的机器学习方法之一。在监督学习中,算法从一组已知输入和输出数据中学习,并使用这些数据来预测未知数据的输出。 常见的监督学习算法有:

    线性回归

    逻辑回归

    支持向量机

    决策树和随机森林

    支持向量机

    朴素贝叶斯

    神经网络

    KNN

无监督学习是另一种常用的机器学习方法。在无监督学习中,算法从未标记的数据中学习,通常用于数据挖掘和聚类。常见的无监督学习算法有:

    聚类(如 k-means)

    降维(如 PCA)

    密度估计(如核密度估计)

强化学习是机器学习的另一种方法,它模拟了人类或智能体在环境中学习的过程。在强化学习中,算法在执行某些动作后获徖奖励或惩罚,并学习如何在未来采取最优动作。常见的强化学习算法有:Q学习,Sarsa,DQN等。 

还有一些算法是监督学习和非监督学习的结合,如半监督学习和集成学习。半监督学习是在大部分数据没有标签的情况下使用少量有标签的数据来进行训练,集成学习是将多个模型融合为一个最终模型。

机器学习算法非常多,具体使用哪种算法取决于问题的性质和数据特征。要选择合适的算法,需要充分了解问题和数据的特点,并对算法进行尝试和评估。此外,机器学习还可以和其他技术结合使用,如计算机视觉,自然语言处理等,来实现更加强大的系统。

机器学习面试总结————

目录

1、使用机器学习模型时,一般怎么处理数据集

2、什么是训练误差和测试误差

3、什么是过拟合与欠拟合?怎么解决

4、机器学习当中的回归模型有哪些

5、机器学习当中的分类模型有哪些

6、回归和分类模型的评价指标都有哪些

7、遇到高维数据怎么处理

8、常用的降维方法有哪些

9、常用的特征选择方法有哪些

10、什么是正则化?什么时候需要正则化

11、L1正则化与L2正则化的区别

12、线性回归的原理和适用条件

13、线性回归怎么解决多重共线性问题

14、逻辑回归的原理和适用条件

15、逻辑回归算法为何使用交叉熵损失函数

16、逻辑回归算法的优缺点是什么

17、什么是决策树模型?有哪些算法

18、什么是信息增益与基尼系数

19、什么是随机森林模型

20、决策树怎么解决过拟合问题

21、在构建决策树时,怎么处理连续属性和缺失值

22、决策树与随机森林的区别与联系

23、你知道集成学习吗

24、Boosting算法的基本原理是什么

25、boosting算法、bagging、随机森林三者的区别

26、GBDT和随机森林的区别

27、用过XGBoost模型吗?该模型与GBDT的联系是什么

28、常用的聚类算法有哪些?

29、什么是参数和超参数?

30、常用的参数优化方法有哪些

31、KNN算法的原理是什么?有何优缺点


1、使用机器学习模型时,一般怎么处理数据集

在使用机器学习模型时,处理数据集是非常重要的一步,通常的处理步骤如下:

数据清洗:检查数据集中的缺失值、异常值、重复值等问题,并根据具体情况进行处理。

特征工程:将原始数据转化为适合机器学习算法的特征,包括特征选择、特征提取、特征变换等。这一步需要考虑到特征的相关性、对模型的贡献以及数据的分布情况等。

数据划分:将数据集划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于调整模型参数和选择模型,测试集用于评估模型的性能。

数据归一化:将特征数据按照一定比例缩放,使得不同特征之间具有相同的重要性,避免因为不同的度量单位而对结果产生影响。

数据增强:通过一定的方式增加数据集的样本数量,以提高模型的鲁棒性和泛化能力。

数据平衡:对于非平衡数据集,采取一些方法如上采样、下采样等,使得正负样本数量接近,避免因为样本分布不均导致模型预测结果偏向于多数类。

数据预处理:将数据集进行预处理,如数据压缩、降维等,以便于在有限的计算资源下提高模型的效率和速度。

2、什么是训练误差和测试误差

在机器学习中,训练误差和测试误差是评估模型性能的两个重要指标。它们分别反映了模型在训练集和测试集上的表现。

训练误差(Training Error)是指模型在训练集上的误差,即模型预测的结果与训练集真实标签的差异。训练误差的大小通常反映了模型在拟合训练集上的能力。如果模型在训练集上表现很好,但在测试集上表现很差,就可能出现过拟合的情况,即模型在训练集上过度拟合,无法泛化到新数据。

测试误差(Test Error)是指模型在测试集上的误差,即模型预测的结果与测试集真实标签的差异。测试误差的大小通常反映了模型在泛化到新数据上的能力。如果模型在训练集和测试集上的表现都不好,就可能出现欠拟合的情况,即模型无法拟合训练集的真实标签。

因此,为了避免过拟合和欠拟合,需要在训练过程中监控训练误差和测试误差,并根据它们的变化调整模型的参数和结构,以提高模型的泛化能力和性能。

3、什么是过拟合与欠拟合?怎么解决

过拟合(Overfitting)是指机器学习模型在训练数据上表现良好,但在测试数据上表现较差的现象。过拟合的原因通常是模型过于复杂,使得模型过度学习了训练集中的噪声和细节信息,从而无法泛化到新的数据上。常见的解决过拟合的方法有以下几种:

数据增强(Data Augmentation):增加训练集的样本数量,可以缓解过拟合现象。

正则化(Regularization):通过对模型的复杂度进行惩罚,如 L1 正则化、L2 正则化等,可以避免模型过度学习训练集中的噪声。

提前停止训练(Early Stopping):在训练过程中,当模型在验证集上的性能开始下降时,提前停止训练,可以防止模型过拟合。

Dropout:在训练过程中,随机去掉一部分神经元,可以避免神经网络过拟合。

欠拟合(Underfitting)是指机器学习模型无法很好地拟合训练数据,导致在训练集和测试集上的表现都较差。欠拟合的原因通常是模型过于简单,无法捕捉训练集中的复杂关系。常见的解决欠拟合的方法有以下几种:

增加模型复杂度:可以增加模型的层数、节点数等,使其具有更强的拟合能力。

特征工程:可以增加更多的特征,以提高模型的表现。

降低正则化系数:对于使用正则化的模型,可以适当降低正则化系数,以提高模型的拟合能力。

增加训练轮数:增加模型的训练轮数,使其更好地学习数据的复杂关系。

需要注意的是,在解决过拟合和欠拟合的过程中,需要根据具体情况选择适当的方法,以提高模型的泛化能力和性能。

4、机器学习当中的回归模型有哪些

机器学习中的回归模型是一类用于预测连续型变量的模型,常用于数据建模、预测等应用场景。常见的回归模型包括以下几种:

线性回归模型(Linear Regression):最基本的回归模型,通过拟合一个线性方程来预测连续型变量。

逻辑回归模型(Logistic Regression):常用于分类问题,通过将连续型变量映射为概率值来进行分类预测。

支持向量回归模型(Support Vector Regression,SVR):基于支持向量机的回归模型,适用于非线性回归问题。

决策树回归模型(Decision Tree Regression):通过建立一棵决策树来预测连续型变量,适用于非线性回归问题。

随机森林回归模型(Random Forest Regression):基于随机森林的回归模型,通过组合多个决策树来提高预测精度。

梯度提升回归模型(Gradient Boosting Regression):基于梯度提升的回归模型,通过迭代地添加弱学习器来提高预测精度。

神经网络回归模型(Neural Network Regression):基于神经网络的回归模型,适用于高维非线性回归问题。

以上是常见的回归模型,不同的模型适用于不同的应用场景,选择合适的模型可以提高预测精度和泛化能力。

5、机器学习当中的分类模型有哪些

机器学习中的分类模型是一类用于分类问题的模型,常用于文本分类、图像分类、信用评分等应用场景。常见的分类模型包括以下几种:

逻辑回归模型(Logistic Regression):基于线性回归的分类模型,通过将连续型变量映射为概率值来进行分类预测。

决策树分类模型(Decision Tree Classification):通过建立一棵决策树来预测分类结果。

随机森林分类模型(Random Forest Classification):基于随机森林的分类模型,通过组合多个决策树来提高分类精度。

支持向量机分类模型(Support Vector Machine,SVM):通过构建最大边缘超平面来实现分类,适用于高维空间分类问题。

K近邻分类模型(K-Nearest Neighbors,KNN):通过找到样本空间中最接近目标点的K个样本,利用这些样本的标签进行分类预测。

朴素贝叶斯分类模型(Naive Bayes Classification):基于贝叶斯定理和特征独立假设的分类模型,适用于文本分类等问题。

神经网络分类模型(Neural Network Classification):基于神经网络的分类模型,适用于高维非线性分类问题。

6、回归和分类模型的评价指标都有哪些

回归模型的评价指标:

平均绝对误差(Mean Absolute Error,MAE):表示预测值和真实值之间的差异程度,越小越好。

均方误差(Mean Squared Error,MSE):平方差的平均值,比MAE更加重视误差较大的预测值。

均方根误差(Root Mean Squared Error,RMSE):MSE的平方根,与MAE类似,表示预测值和真实值之间的差异程度,越小越好。

R平方(Coefficient of Determination,R-Squared):用于衡量模型的拟合程度,取值范围为0到1,越接近1表示模型拟合效果越好。

分类模型的评价指标:

准确率(Accuracy):分类正确的样本数与总样本数之比,越高越好。

精确率(Precision):表示预测为正例的样本中,真正为正例的比例,用于解决误判为正例的问题。

召回率(Recall):表示所有正例中,被正确预测为正例的比例,用于解决漏判的问题。

F1值(F1-score):综合考虑了精确率和召回率,是二者的调和平均数,越高越好。

ROC曲线(Receiver Operating Characteristic Curve):以假正率(False Positive Rate,FPR)为横轴,真正率(True Positive Rate,TPR)为纵轴绘制的曲线,用于衡量分类器的性能。

AUC(Area Under Curve):ROC曲线下的面积,用于评估分类器的性能,取值范围为0.5到1,越接近1表示性能越好。

7、遇到高维数据怎么处理

特征选择(Feature Selection):选择最相关的特征,减少数据的维度。可以基于统计学或模型相关性进行选择,或者使用基于模型的特征选择方法,例如Lasso或决策树。

主成分分析(Principal Component Analysis,PCA):将高维数据转换为低维数据,同时保留数据的大部分信息。PCA通过将原始数据投影到主成分方向上来实现降维,主成分方向是数据中方差最大的方向。

独立成分分析(Independent Component Analysis,ICA):ICA假设原始数据是多个独立信号的混合,通过对混合信号的反混合来恢复出独立信号,实现对高维数据的降维。

t-SNE:一种非线性降维方法,可以将高维数据转换为低维数据,同时保留数据的局部结构。t-SNE通过将高维数据映射到低维空间中的概率分布来实现降维。

增量学习(Incremental Learning):通过逐步引入新的特征或数据,不断更新模型,实现对高维数据的建模。

集成学习(Ensemble Learning):将多个基学习器组合成一个强学习器,可以提高模型的预测性能,同时可以解决高维数据中噪声或冗余的问题。

8、常用的降维方法有哪些

主成分分析(Principal Component Analysis,PCA):将原始数据通过线性变换映射到低维空间中,保留尽可能多的原始数据的方差,实现数据的降维。

线性判别分析(Linear Discriminant Analysis,LDA):与PCA类似,也是通过线性变换映射到低维空间中,不同的是LDA同时考虑了数据的分类信息,保留了数据类别间的差异,可以实现分类任务中的降维。

非负矩阵分解(Non-negative Matrix Factorization,NMF):将数据矩阵分解成两个非负矩阵的乘积,实现数据的降维和特征提取。

局部线性嵌入(Locally Linear Embedding,LLE):基于局部信息,将数据映射到低维空间中,并保持数据在局部上的线性关系不变,实现数据的降维和特征提取。

t-SNE:一种非线性降维方法,可以将高维数据转换为低维数据,同时保留数据的局部结构,适用于可视化或聚类等任务。

自编码器(Autoencoder):通过训练一个神经网络来学习数据的压缩表示,实现数据的降维和特征提取。

9、常用的特征选择方法有哪些

Filter方法:根据特征本身的统计量或相关性对特征进行筛选。例如,基于方差或卡方检验等方法选择相关特征。

Wrapper方法:利用机器学习模型对不同特征子集进行训练和评估,并选择表现最好的特征子集。例如,使用递归特征消除(Recursive Feature Elimination,RFE)或遗传算法进行特征选择。

Embedded方法:将特征选择与机器学习模型的训练过程融合在一起。例如,使用Lasso回归、岭回归等惩罚项方法进行特征选择。

基于树的方法:通过决策树、随机森林等方法计算特征的重要性,根据重要性对特征进行筛选。

基于模型的方法:利用特定的机器学习模型对特征进行评估和选择,例如使用支持向量机、深度神经网络等模型进行特征选择。

10、什么是正则化?什么时候需要正则化

正则化是一种在机器学习中用于降低过拟合风险的方法。它通过在损失函数中加入正则项,限制模型的复杂度,从而避免模型过度拟合训练数据。

正则化方法通常有L1正则化和L2正则化两种。L1正则化通过加入L1范数惩罚项,使得模型参数中许多参数值变为0,从而实现特征选择和模型稀疏化;而L2正则化通过加入L2范数惩罚项,使得模型参数在正则化后的损失函数上取得更小的值,从而实现模型参数的缩小和模型权重的分布更加平滑。

需要进行正则化的情况包括:

模型存在过拟合现象,即模型在训练数据上表现很好,但在测试数据上表现较差。

数据集维度很高,容易出现维度灾难问题。

数据集中存在噪声或冗余特征,需要进行特征选择或稀疏化。

模型过于复杂,需要限制模型的复杂度。

11、L1正则化与L2正则化的区别

L1正则化和L2正则化是机器学习中常用的正则化方法,它们的主要区别在于正则化项的不同。

L1正则化通过加入L1范数(绝对值)惩罚项,使得模型参数中许多参数值变为0,从而实现特征选择和模型稀疏化。因为L1正则化可以将不重要的特征系数降为0,从而删除对应的特征,因此L1正则化在特征选择和降维方面表现较好。在数学上,L1正则化可以表示为:

L2正则化通过加入L2范数(平方和开根号)惩罚项,使得模型参数在正则化后的损失函数上取得更小的值,从而实现模型参数的缩小和模型权重的分布更加平滑。L2正则化在一定程度上可以防止过拟合,并且对于许多机器学习模型而言,L2正则化的求解更加容易。在数学上,L2正则化可以表示为:

总的来说,L1正则化和L2正则化在机器学习中具有重要的应用,具体选择哪种方法,需要根据具体情况来决定。如果想进行特征选择,可以优先考虑使用L1正则化;如果模型存在过拟合风险,可以使用L2正则化。

12、线性回归的原理和适用条件

线性回归是机器学习中常见的一种回归模型,它通过构建线性模型来预测连续型变量的值。线性回归的原理可以简单概括为以下三个步骤:

定义模型:线性回归假设目标变量和自变量之间存在线性关系,可以用如下的数学公式来表示:

其中,为目标变量的预测值,为截距,为各自变量的权重,为自变量的值,\\epsilon为误差项。

确定模型参数:线性回归的目标是最小化实际值和预测值之间的差距,通常使用最小二乘法来确定模型参数,即通过最小化误差平方和来求得最优的模型参数。

模型预测:最后,使用训练好的模型来预测新的样本,计算自变量的值并带入模型公式即可得到预测值。

线性回归适用于以下情况:

目标变量与自变量之间存在线性关系。

自变量之间相互独立,不存在多重共线性。

目标变量服从正态分布,即误差项满足独立同分布的正态分布假设。

数据集足够大,可以充分估计模型参数。

需要注意的是,当数据集中存在非线性关系时,线性回归的表现可能较差,此时需要使用非线性回归模型或者对数据进行转换和特征工程来处理非线性关系。

13、线性回归怎么解决多重共线性问题

多重共线性指的是自变量之间存在高度相关性的情况,这种情况下线性回归的参数估计可能不准确甚至不稳定,需要采取一些措施来解决。

以下是一些常见的解决多重共线性问题的方法:

增大样本量:多重共线性问题通常是因为样本量较小导致的,增大样本量可以降低自变量之间的相关性,从而减轻多重共线性问题。

特征选择:通过选择一部分相关性较小的自变量或者对自变量进行降维,可以减少自变量之间的相关性,从而降低多重共线性的问题。

正则化:L1正则化和L2正则化可以通过对模型参数进行惩罚来降低多重共线性的问题,L1正则化可以使得一部分参数变为0,从而实现特征选择的效果,L2正则化可以通过限制参数的大小来缓解多重共线性问题。

主成分分析(PCA):PCA是一种常用的降维方法,可以将高维的自变量转换为低维的主成分,通过对主成分的选取,可以减少自变量之间的相关性,从而降低多重共线性的问题。

岭回归:岭回归是一种正则化方法,通过引入L2正则化来限制参数的大小,从而降低多重共线性的问题。

需要注意的是,以上方法可以单独使用也可以组合使用,具体选择何种方法取决于数据的特点和具体问题的要求。

14、逻辑回归的原理和适用条件

逻辑回归是一种二分类算法,其原理基于线性回归模型,通过对线性函数进行sigmoid变换将输出转化为概率值,从而得到分类结果。

假设输入变量为,输出变量为y,逻辑回归模型可以表示为:

其中,是模型参数,$e$是自然常数。

逻辑回归的训练目标是最大化似然函数,即对于给定的样本$(x_1,x_2,...,x_n,y)$,使得最大化,可以通过梯度下降等优化算法来求解模型参数。

逻辑回归适用于二分类问题,特别是对于线性可分的情况,且自变量和因变量之间的关系呈现出一定的线性趋势。逻辑回归还具有较好的可解释性,可以用来探索自变量与因变量之间的关系,例如评估变量的影响程度、判断变量的作用方向等。

需要注意的是,在样本不平衡、特征空间非线性可分、特征维度过高等情况下,逻辑回归的表现可能会受到影响,需要针对具体问题选择合适的算法和优化方法。

15、逻辑回归算法为何使用交叉熵损失函数

交叉熵是一种常用的损失函数,特别是在分类问题中广泛应用。逻辑回归算法使用交叉熵损失函数的原因是为了最大化似然函数,即对于给定的样本,使得最大化。

在逻辑回归中,通过sigmoid函数将线性函数的输出映射为[0,1]之间的概率值,可以将分类问题转化为概率估计问题。交叉熵损失函数可以表示为

其中,$y_i$是实际标签值,$\\haty_i$是模型预测的概率值。当$y_i=1$时,第一项为1,第二项为0,当$y_i=0$时,第一项为0,第二项为1。因此,交叉熵损失函数可以用来衡量实际标签值和预测概率值之间的差距,最小化交叉熵损失函数相当于最大化似然函数。

在优化模型参数时,通过梯度下降等优化算法,不断更新模型参数,使得交叉熵损失函数最小化,从而得到最优的模型参数。

总之,交叉熵损失函数是逻辑回归中常用的损失函数,通过最大化似然函数,衡量实际标签值和预测概率值之间的差距,实现对模型参数的优化。

16、逻辑回归算法的优缺点是什么

逻辑回归是一种经典的二分类算法,具有以下优点和缺点:

优点:

实现简单:逻辑回归是一种线性模型,模型参数可以通过最小化损失函数求解得到,实现相对简单。

计算速度快:逻辑回归模型计算量小,可以高效处理大量数据集,适用于大规模的分类问题。

解释性强:逻辑回归模型具有较强的可解释性,可以通过模型参数对特征进行分析,发现对分类结果影响较大的特征。

可以处理线性可分问题:逻辑回归模型对于线性可分的二分类问题效果较好。

缺点:

容易受到异常值和噪声的影响:逻辑回归模型对于异常值和噪声敏感,会影响模型的性能。

只能处理二分类问题:逻辑回归模型只能处理二分类问题,无法处理多分类问题。

对于非线性可分问题效果不佳:逻辑回归模型对于非线性可分的二分类问题效果较差。

特征选择方面的能力较弱:逻辑回归模型对于高维数据的特征选择能力较弱,需要使用其他方法进行特征选择和降维。

总之,逻辑回归模型具有实现简单、计算速度快、解释性强等优点,但也存在容易受到异常值和噪声的影响、只能处理二分类问题、对于非线性可分问题效果较差等缺点。在实际应用中,需要结合具体场景选择合适的分类算法。

17、什么是决策树模型?有哪些算法

决策树是一种基于树结构进行决策的模型,通常用于分类和回归问题。在决策树中,每个节点表示一个特征,每个分支代表该特征的一个取值,叶子节点表示一个类别或一个数值。通过从根节点开始,沿着不同的分支逐步向下遍历,最终到达叶子节点,可以得到对应的分类或回归结果。

决策树算法主要包括以下几种:

ID3算法:基于信息增益选择最优特征进行分裂,适用于离散特征的分类问题。

C4.5算法:基于信息增益比选择最优特征进行分裂,相对于ID3算法更加稳定,同时支持连续特征的分类问题。

CART算法:既可以用于分类问题,也可以用于回归问题。在分类问题中,基于基尼指数选择最优特征进行分裂;在回归问题中,基于平方误差最小化选择最优特征进行分裂。

随机森林:是一种基于决策树的集成学习算法,通过随机选择特征和样本,构建多个决策树,最终将它们的预测结果进行投票或平均得到最终结果。

梯度提升树(GBDT):也是一种基于决策树的集成学习算法,通过迭代地训练一系列决策树,并将它们的预测结果进行加权累加得到最终结果。在训练过程中,每一次训练都会对前一次训练的误差进行优化,从而不断提升模型的预测能力。

决策树算法具有可解释性强、适用于离散和连续特征等优点,在实际应用中被广泛使用。

18、什么是信息增益与基尼系数

信息增益和基尼系数都是在决策树算法中用来评估特征重要性的指标。

信息增益是在ID3算法中使用的指标,表示通过选择某个特征进行分裂后,数据集的不确定性减少的程度。在计算信息增益时,需要先计算出数据集的熵,然后计算每个特征的条件熵,两者相减就是信息增益。信息增益越大,表示选择该特征进行分裂后能够带来更多的信息量,更有利于决策树的构建。

基尼系数是在CART算法中使用的指标,表示在所有可能的分类中,一个样本被分到错误的分类中的概率。在计算基尼系数时,需要先计算出数据集的基尼指数,然后计算每个特征的加权基尼指数,选择加权基尼指数最小的特征进行分裂。基尼系数越小,表示选择该特征进行分裂后能够更好地提高模型的预测准确率。

信息增益和基尼系数都是衡量特征重要性的指标,不同的算法使用不同的指标,但都有相同的目的,即在决策树的构建过程中选择最优的特征进行分裂。

19、什么是随机森林模型

随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,它是由多个决策树组成的分类器。随机森林通过在数据集上进行有放回的随机抽样,并在每个节点上使用随机选择的一部分特征来构建多棵决策树,最后将多棵决策树的结果进行综合,以得到最终的预测结果。

具体来说,随机森林的构建过程包括以下步骤:

从训练集中随机抽取一部分样本,作为每棵决策树的训练集,每个样本可以重复抽取。

对于每个节点,随机选择一部分特征进行计算,而不是使用全部特征。

根据选定的特征,使用决策树算法对每个节点进行分裂。

重复步骤2和3,构建多棵决策树。

对于新的样本,通过每棵决策树得到一个预测结果,然后按照一定的规则综合多棵决策树的结果,得到最终的预测结果。随机森林模型具有以下

优点:

随机森林可以处理高维数据,并且对缺失值和异常值具有鲁棒性。

随机森林能够自动进行特征选择,不需要手动进行特征选择。

随机森林可以处理非线性关系,并且不容易过拟合。

随机森林在训练过程中可以进行并行计算,处理速度较快。

缺点:

随机森林对于少数类别的分类效果不如支持向量机或神经网络等算法。

随机森林在解决回归问题时效果不如决策树回归。

20、决策树怎么解决过拟合问题

决策树是一种容易出现过拟合的模型,因为它可以根据训练集的细节特征进行分裂,这可能会导致模型在训练集上表现很好,但在测试集上表现较差。

为了解决决策树模型的过拟合问题,通常采取以下几种方法:

剪枝:决策树剪枝是通过裁剪决策树来降低模型复杂度的一种技术。剪枝方法分为预剪枝和后剪枝两种,其中预剪枝是在决策树构建过程中进行剪枝,而后剪枝是在决策树构建完成后进行剪枝。

减少树的深度:减少决策树的深度可以降低模型复杂度,从而减少过拟合。可以通过设置最大深度、最小叶子节点数等参数来控制决策树的深度。

增加样本数量:通过增加样本数量,可以使模型更加鲁棒,从而减少过拟合。可以使用一些数据增强技术,如随机翻转、旋转、缩放等,来增加数据集的大小。

特征选择:通过特征选择,可以去除决策树中不重要的特征,从而减少过拟合。可以使用信息增益、基尼系数等指标来选择最优的特征。

综上所述,通过剪枝、减少树的深度、增加样本数量和特征选择等方法,可以有效地减少决策树模型的过拟合问题。

21、在构建决策树时,怎么处理连续属性和缺失值

连续属性处理:决策树算法通常处理分类问题,而连续属性在分类问题中通常需要进行离散化处理,将连续属性转换为离散属性。常用的离散化方法有等频率离散化和等距离离散化。等频率离散化将连续属性的值域划分为相等的区间,使得每个区间中包含相同数量的样本;等距离离散化将连续属性的值域划分为相等长度的区间,使得每个区间的长度相同。离散化后,连续属性的离散化值可以用来作为决策树节点的分裂点。

缺失值处理:决策树算法通常不能处理带有缺失值的数据,因为无法对缺失值进行划分。对于带有缺失值的数据,可以采用以下几种方法:

(1) 删除缺失值:删除缺失值可以简化模型,但会丢失一部分信息。

(2) 插值法:插值法是一种常用的缺失值处理方法,常用的插值方法有均值插值、中位数插值、众数插值等。插值法可以在一定程度上保留数据的完整性,但也有可能引入噪声。

(3) 构建一个缺失值专用的分支:对于缺失值,可以构建一个专门的分支用于处理缺失值。

(4) 基于规则的方法:根据实际问题的特点,可以设计一些基于规则的方法来处理缺失值,例如根据领域知识或者推理方法来填补缺失值。

综上所述,对于连续属性可以采用离散化的方法来处理,在处理缺失值时,可以采用插值法、构建专用分支、基于规则的方法等方法来处理。

22、决策树与随机森林的区别与联系

原理不同:决策树是基于树形结构进行分类和回归,通过递归的方式对数据进行划分;而随机森林是一种基于决策树的集成算法,通过构建多个决策树来提高预测的准确性和鲁棒性。

处理数据方式不同:决策树适合于处理连续和离散的数据类型,但是在面对高维稀疏数据时,效果不佳;而随机森林采用自助采样和随机特征选择等技术,可以更好地处理高维稀疏数据,提高模型的泛化能力。

预测结果不同:决策树容易出现过拟合,模型的泛化能力较差,预测结果不够稳定;而随机森林通过集成多个决策树的结果,可以有效地降低过拟合的风险,提高预测的准确性和稳定性。

计算效率不同:决策树的构建和预测比较简单,计算效率较高;而随机森林需要构建多个决策树,计算效率相对较低。

参数调优不同:决策树参数比较少,主要是决策树的深度、划分准则等;而随机森林需要调整的参数更多,包括决策树个数、特征选择方式、自助采样比例等。

23、你知道集成学习吗

是的,集成学习是一种通过结合多个学习器来改善预测准确性和稳定性的机器学习技术。它是一种“组合”的方法,即将多个学习器组合成一个更强大的学习器。通过将多个学习器的预测进行加权平均或投票,集成学习可以降低单个学习器的方差和提高整体预测准确性。

集成学习可以分为两类:bagging和boosting。在bagging中,每个学习器独立地从训练集中随机采样,然后基于这些子集训练多个学习器。在boosting中,学习器是按顺序训练的,每个学习器都试图修正前面学习器的错误。

集成学习常用的算法包括随机森林、Adaboost、Gradient Boosting等。

24、Boosting算法的基本原理是什么

Boosting是一种集成学习方法,其基本原理是通过多个弱分类器的组合,来构建一个更为准确的分类器。

Boosting算法的基本思路是,通过对训练数据集进行多轮迭代,每轮迭代训练一个新的弱分类器,并根据分类器的表现进行样本的调整,使得下一轮迭代的分类器能够更加关注先前分类错误的样本,从而最终获得一个强分类器。在每轮迭代中,将上一轮迭代分类错误的样本的权重加大,而分类正确的样本的权重则减小,使得在下一轮迭代中分类器能够更加关注上一轮分类错误的样本。最终将多个弱分类器的结果进行加权组合,得到一个准确性更高的分类器。

Boosting算法的代表性算法包括AdaBoost、Gradient Boosting等。这些算法通常采用决策树作为弱分类器,通过对多个决策树的加权组合,得到一个准确性更高的分类器。Boosting算法具有较高的分类准确率,但也容易出现过拟合的问题,因此需要对参数进行调节。

25、boosting算法、bagging、随机森林三者的区别

Boosting、Bagging和随机森林都是集成学习方法,可以用于提高分类准确率和回归预测的准确性。它们之间的主要区别如下:

基础模型:Boosting和Bagging都是基于决策树或其他分类算法的集成学习方法,而随机森林只使用决策树作为基础模型。

训练方式:Boosting和Bagging的训练方式不同。Boosting是序列化的,每个基础模型的训练依赖于上一个基础模型的结果,因此更容易受到训练数据中的噪声影响;而Bagging是并行的,所有基础模型可以同时训练,因此对于训练数据中的噪声不太敏感。

样本处理:在样本处理方面,Boosting是对训练数据集中分类错误的样本进行加权,以便更加关注这些错误的样本,而Bagging则是使用自助采样法(bootstrap)对数据进行采样,随机从训练集中有放回的抽取样本,以生成多个新的训练集,然后对每个训练集训练一个基础模型。随机森林在Bagging的基础上,进一步加入了特征的随机选择,即每个决策树节点仅考虑一个随机的特征子集,从而降低了各个决策树之间的相关性。

预测方式:Boosting、Bagging和随机森林都采用了基础模型的投票机制,但是Boosting和Bagging对基础模型的权重进行加权,而随机森林中的所有基础模型都具有相同的权重。

总体而言,Boosting的准确性更高,但对于训练数据中的噪声比较敏感;Bagging的鲁棒性更高,但准确性较低;而随机森林具有较高的鲁棒性和准确性,是一种较为稳健的集成学习方法。

26、GBDT和随机森林的区别

GBDT(Gradient Boosting Decision Tree)和随机森林是两种常见的集成学习算法,它们的主要区别在于以下几个方面:

基分类器:GBDT采用决策树作为基分类器,而随机森林采用多个决策树作为基分类器。

采样方式:在随机森林中,每个基分类器都是在不同的样本子集上进行训练的(通过Bagging采样),而在GBDT中,每个基分类器都是在所有样本上进行训练的。

特征选择方式:在随机森林中,每个基分类器是在不同的特征子集上进行训练的(通过Random Subspace采样),而在GBDT中,每个基分类器都是在所有特征上进行训练的。

预测方式:随机森林是通过所有基分类器的投票结果来预测最终结果的,而GBDT则是通过将所有基分类器的预测结果进行加权求和来预测最终结果的。

并行度:由于随机森林的基分类器是相互独立的,因此可以并行训练和预测,而GBDT的基分类器是顺序训练的,无法并行。

综上所述,随机森林和GBDT的主要区别在于基分类器的选择和采样方式、特征选择方式以及预测方式。随机森林具有并行训练和预测的优势,而GBDT则可以更好地处理非线性关系和分类问题。

27、用过XGBoost模型吗?该模型与GBDT的联系是什么

作为GBDT的一种改进模型,XGBoost模型在

以上是关于机器学习的常用方法都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

常用机器学习模型都有哪些?

Response对象的常用方法都有哪些?

大数据常用的形式有哪些

大数据常用的形式有哪些

java IO的常用类都有哪些?

机器学习面试题