对于机器学习来说,初学者最难理解的莫过于过拟合和欠拟合,我们会经常听到我们会对模型进行调参,减少模型的过拟合,但是这个过拟合到底是什么意思呢?

    先举个例子吧,如果我们现在给予神经网络一些有毛动物的图像(比如猫和狗),让模型对其反复训练,这时候模型对其拟合程度很高,但是我们会发现,我们把去毛的动物图片(去毛的猫狗)放进神经网络,发现它竟然识别的准确率超级低,这就说明了,由于模型对有毛发的图片进行过度学习,导致它只认有毛发的动物,没有毛发的动物统统不认识,这就是我们所说的过拟合,同样,如果我们训练得太少,无法比较准确识别出动物的种类,这就是模型的欠拟合。如果我们能够寻找合适的训练的量,发现它的效果很好—它可以从各个方面特征去识别动物(头型,眼睛,鼻子等等),不完全受有无毛发的影响,我们想要的模型就是这样子的。

    所以说,机器学习和深度学习之所以称为人工智能,正是因为它和人的思考方式真的是一样的,当我们对于一道题过于研究,盲目的按照它的格式和解题思路,不懂得变通,那么我们也将失去随机应变的能力了!!而如果我们学好基础和各种解题能力,就有能力去尝试各种各样的题,不会被局限到,虽然可能出错,但是我们仍可以解出一些题目!!

    我们可以从下面这个图先入门
    image.png
    我们现在运用一条简单的线性神经网络对模型进行训练,红色虚线是比较理想的情况,能够使红色的点大多数都落在其旁边,这时候我们会在想,不是红色的点全部落在函数上会比较好吗,其实并不是,对于我们自然采集的数据对其进行预测分析,我们得到的数据不可能完全拟合于一种完全确定的关系,而是一种总体上的联系集合,换句话说,预测之所以叫作预测,便是它只是预测出大概的样子,而不是完全精确,而我们要做的,便是是这个大概尽可能的去接近于精确,但是又不能过度训练,找到这个契合的点,便是我们的调参。在进行对模型的训练中,我们会划分训练集和测试集,我们模型对于训练集进行训练,用测试集来检测模型的优劣!

    假设上面三个图的蓝线便是我们分别训练出来的模型:第一种情况下,蓝线相对于红色虚线有明显的偏移,说明对于数据的趋势和走向没有很好的捕捉,对于预测出来的结果必定不是很好,这便是欠拟合,第二种情况蓝线对于红色虚线比较接近,效果较好,训练效果好预测效果也好;第三种情况,蓝线对于数据的拟合程度过高,说明模型对于训练集过度训练(甚至对于异常值也进行拟合),可能对于测试集来说,并不会有一个很好的结果!

    对于机器学习,我们一般分为两个步骤,建模和调参。调参能够帮助我们建立更好的模型。现阶段我们有两个方法进行调参,那就是画学习曲线和进行网格搜索,但是刚开始用这两个方法都过于局限性,用起来还是会比较盲目,所以,我们有必要对调参的思想进行学习,才能更快熟悉调参。

    首先,我们要先知道调参的目的是什么:那就是提高模型的泛化误差(Genelization error)

    泛化误差:我们用来衡量模型在未知数据上的准确率的指标,也就是在训练集和测试集上的误差,叫做泛化误差(Genelization error)
    泛化误差的背后其实是“偏差-方差困境”,原理十分复杂,但是思想比较简单:

    1)模型太复杂或者太简单,都会让泛化误差高,我们追求的是位于中间的平衡点
    2)模型太复杂就会过拟合,模型太简单就会欠拟合
    3)对树模型和树的集成模型来说,树的深度越深,枝叶越多,模型越复杂
    **4)树模型和树的集成模型的目标,都是减少模型复杂度,把模型往图像的左边移动

    仔细观察下面这张图,偏差和方差与泛化误差最低点有一个平衡点,模型越简单 ,偏差小方差大,模型越复杂,偏差大方差小。**
    image.png

    我们调参的目标是,达到方差和偏差的完美平衡!虽然方差和偏差不能同时达到最小值,但他们组成的泛化误差却可以有一个最低点,而我们就是要寻找这个最低点。对复杂度大的模型,要降低方差,对相对简单的模型,要降低偏差。
    以随机森林为例:随机森林的基评估器都拥有较低的偏差和较高的方差,因为决策树本身是预测比较高,比较容易过拟合的模型,装袋法本身也要求基分类器的准确率必须要有50%以上。所以以随机森林为代表的装袋法的训练过程旨在降低方差,即降低模型复杂度,所以随机森林参数的默认设定都是假设模型本身在泛化误差最低点的右边

    集成模型的泛化误差:
    一个集成模型(f)在未知数据集(D)上的泛化误差 ,由方差 (var),偏差(bais)和噪声(ε)共同决定。其中偏差就是训练集上的拟合程度决定,方差是模型的稳定性决定,噪音是不可控的。而泛化误差越小,模型就越理想。
    image.png

    在过去我们往往直接取学习曲线获得的分数的最高点,即考虑偏差最小的点,是因为模型极度不稳定,方差很大的情况其实比较少见。但假如我们的数据量非常少,模型会相对不稳定,因此我们应当将方差也纳入考虑的范围。在绘制学习曲线时,我们不仅要考虑偏差的大小,还要考虑方差的大小,更要考虑泛化误差中我们可控的部分。

    1. #偏差和方差一起考虑进来时,可以选择共同画学习曲线
    2. axisx = range(50,1050,50)
    3. rs = []
    4. var = []
    5. ge = []
    6. for i in axisx:
    7. reg = XGBR(n_estimators=i,random_state=420)
    8. cvresult = CVS(reg,Xtrain,Ytrain,cv=cv)
    9. #记录1-偏差
    10. rs.append(cvresult.mean())
    11. #记录方差
    12. var.append(cvresult.var())
    13. #计算泛化误差的可控部分
    14. ge.append((1 - cvresult.mean())**2+cvresult.var())
    15. #打印R2最高所对应的参数取值,并打印这个参数下的方差
    16. print(axisx[rs.index(max(rs))],max(rs),var[rs.index(max(rs))])
    17. #打印方差最低时对应的参数取值,并打印这个参数下的R2
    18. print(axisx[var.index(min(var))],rs[var.index(min(var))],min(var))
    19. #打印泛化误差可控部分的参数取值,并打印这个参数下的R2,方差以及泛化误差的可控部分
    20. print(axisx[ge.index(min(ge))],rs[ge.index(min(ge))],var[ge.index(min(ge))],min(ge))
    21. plt.figure(figsize=(20,5))
    22. plt.plot(axisx,rs,c="red",label="XGB")
    23. plt.legend()
    24. plt.show()

    看到这里,相信对于调参,你会有进一步的了解!