要回答这3 个问题,首先要了解泛化,或者学习一个可以在以前从未见过的新数据上表现良好的模型。这就引出了欠拟合和过拟合的概念。前者意味着模型无法捕获训练数据的所有变化,后者意味着模型过多关注训练数据但对新数据的泛化性能较差。下面将讨论几个经典模型在泛化问题上的优缺点:knn、线性、贝叶斯、决策树、支持向量机、随机森林(开始结合随机森林(RF)梯度提升决策树的变体(GBDT) )),神经网络。
下面我们就从knn开始进行描述。 Iris使用的knn的k第一次只使用了k=1的情况,即只考虑一个邻居。有时我们在调整参数时会多考虑几个k。不考虑k很容易犯错误,就像我们写论文时,如果只有一个参考文献,我们就无法清楚地理解问题。如果k太多,我们就无法把握方向。它也非常耗时且计算复杂。所以我们比较一下不同k对knn精度的影响。
(黑与白!)比较之前,需要安装一个分析库mglearn(有时候会出问题,安装几次)mglearn库。这个库集成了sklearn和data的很多操作方法。获取相应的数据非常方便。该库中的绘图模块有许多现成的数据视图。易于查看,帮助您省略施工过程。
需要安装mglearn库的配套库。
当我们用mglearn调用不同值的k时(就是看看他们旁边有多少个点,他们是什么,你就是他们是什么,他们是朱,你是朱,他们是红的,你为红色),可以看到k=1,判断圆为五角星,k=3,判断圆为三角形。
当k=1且k=3时
一般认为KNN只能用于分类,但KNN也可以用于回归。
knn可以利用回归KNN的优点、缺点和参数
一般来说,KNeighbors分类器有两个重要的参数:邻居的数量和数据点之间的距离测量方法。在实践中,使用较少数量的邻居(例如3 或5)通常会产生更好的结果,但您应该调整此参数。选择适当的距离测量超出了本书的范围。默认值是欧几里得距离,在许多情况下效果很好。
KNN 的优点之一是模型易于理解,通常不需要太多调整即可获得良好的性能。在考虑更高级的技术之前,尝试此算法是一个很好的基线方法。构建最近邻模型通常很快,但如果训练集很大(无论是具有大量特征还是大量样本),预测速度可能会更慢。使用KNN算法时,对数据进行预处理很重要。该算法通常不适用于具有许多特征(数百个或更多)的数据集。该算法对于大多数特征大多数值为0的数据集(所谓的稀疏数据集)效果不佳。效果特别不好。
尽管k近邻算法很容易理解,但由于其预测速度慢且无法处理具有许多特征的数据集,因此在实际中常常不被使用。下面描述的方法不存在这两个缺点。
线性回归:也称为普通最小二乘法(OLS),是回归问题最简单、最经典的线性方法。线性回归寻找使训练集的预测值与真实回归目标值y 之间的均方误差最小化的参数w 和b。均方误差是预测值与真实值之差除以样本数的平方和。线性回归没有参数,这是一个优点,但也导致无法控制模型的复杂度。
波士顿房价的L2优化导致线性预测:在机器学习中,如果参数过多,模型过于复杂,很容易导致过拟合。即模型在训练样本数据上表现很好,但在实际测试样本上表现较差,不具备良好的泛化能力。为了避免过度拟合,最常见的方法之一是使用正则化,例如L1和L2正则化。 OLS 上的L2 优化称为岭回归。
L1正则化公式也很简单。它直接将权重参数的绝对值与原始损失函数相加:
L1正则化优化L2正则化公式直接将权重参数的平方和添加到原始损失函数中:
L2正则优化了Ridge回归调整的参数,很明显测试集的准确率有所提高。
用户可以通过设置alpha 参数来指定岭回归简单性和训练集性能对模型的重要性。在前面的示例中,我们使用默认参数alpha=1.0。但没有理由认为这给出了最好的权衡。 alpha 的最佳值取决于所使用的特定数据集。增加alpha会使系数趋于接近0,从而降低训练集性能,但可能会提高泛化性能。评估两个模型(将模型性能绘制为数据集大小的函数称为学习曲线):
在模型学习曲线下方,我们看到另一个线性回归Lasso,它仅使用105 个特征中的4 个,并且在训练集和测试集上表现都很差。这表明存在欠拟合。 Lasso还有一个正则化参数alpha,可以控制系数趋于0的强度。在前面的例子中,我们使用了默认值alpha=1.0。为了减少欠拟合,我们尝试减少alpha。这样做的同时,我们还需要增加max_iter的值(运行的最大迭代次数,这个特别重要)
lasso的中间结果最好,但如果alpha设置太小,正则化效果就会被消除,出现过拟合,其次是最低结果。
好,现在来回答第一个问题:训练集和测试集到底是什么关系?
为了了解模型对新样本的泛化能力,唯一的方法就是让训练好的模型真正处理新样本。
解决方案: 将原始数据分为两部分: 训练集和测试集。您可以使用训练集来训练模型,然后使用测试集来测试模型。通过在测试集上评估模型,您可以了解模型的泛化误差。
如果训练误差很低(模型在训练集上误分类样本的比例,说明训练集结果很好),但是泛化误差很高(西瓜书中有解释,学习器在训练集上的误差训练集成为“训练误差”)。误差”或“经验误差”。新样本上的误差称为“泛化误差”(即测试集不好),表明模型已经过拟合训练数据。例如,在第二个和上图中Lasso的第三次测试,训练误差非常好,准确率达到90%以上,虽然版本2不如版本3准确。但是版本2的泛化误差比版本低。 3.在评估模型时,版本2 更好。
现在我们来回答第二个问题:训练集越来越好是否意味着模型越来越好?
我们正在研究mglearn 中默认乳腺癌数据集在LR 逻辑回归上的不同参数性能。
不同C值在LR逻辑回归上的表现,默认C值为1,敲黑板!那么既然有了这3个值,那么C中哪一个更好呢?第一个训练集是0.953,测试集是0.958,看起来非常接近。初学者肯定会觉得非常好。当没有其他结果时可能很好,但由于训练集和测试集的性能非常接近,模型很可能欠拟合。我们尝试增加C以适应更灵活的模型,结果发现当我们调整第二次和第三次时,它第二次增加,第三次开始减少。特别是第三次时,测试集与第二次相比开始下降。对比下图。说明第二次应该是最好的模型。
确定最优值的方法
现在回答第三个问题:如何选取最优模型,如何调整模型中最优参数?
先说模型选择的结论:
最近邻:适合小数据集,是一个很好的基线模型,并且易于解释。 (我认为RecSys推荐系统经常使用kNN进行基准测试)
线性模型:非常可靠的算法选择,适用于非常大的数据集,也适用于高维数据。
朴素贝叶斯:仅适用于分类问题。比线性模型更快,适用于非常大的数据集和高维数据。精度通常低于线性模型。
决策树:速度快,不需要数据缩放,可以可视化,并且易于解释。
随机森林:几乎总是比单个决策树表现更好,非常鲁棒,而且非常强大。不需要数据缩放。不适合高维稀疏数据。
梯度提升决策树:通常比随机森林具有稍高的精度。与随机森林相比,训练速度较慢,但预测速度更快且需要更少的内存。比随机森林需要更多的参数调整。
支持向量机:对于具有相似特征含义的中等规模数据集功能强大。需要数据缩放并且对参数敏感。
神经网络:可以构建非常复杂的模型,特别是对于大型数据集。对数据缩放和参数选择敏感。大型网络需要较长的训练时间。
当面对新的数据集时,通常最好从一个简单的模型开始,例如线性模型、朴素贝叶斯或最近邻分类器,然后看看会得到什么结果。随着您对数据有了更好的了解,您可以考虑使用算法来构建更复杂的模型,例如随机森林、梯度增强决策树、SVM 或神经网络。
接下来,结合本章的主题“泛化”,我们继续看看上述算法中乳腺癌数据的提醒效果是否与结论描述一致。
3.1 首先,看一下决策树。从下图来看,依然是之前的乳腺癌数据。训练集上的准确率是100%,因为叶子节点都是纯的,并且树足够深,可以完美记住训练数据的所有标签。测试集精度略低于之前讨论的线性模型,其精度约为95%。有人肯定会奇怪,为什么会出现100%的情况呢?这就好比训练集是我们的模拟试卷,测试集是我们的高考。如果我做所有的训练集,准确率很可能是100%,因为不可能再出错了。这就是过拟合,为什么呢?因为训练集做得很好,并不意味着模型转移到测试集就很好。如图所示,第一个测试集精度为0.937,第二个达到0.951。
如果我们不限制决策树的深度,它的深度和复杂性可能会变得非常大。因此,未剪枝的树容易过度拟合,并且对新数据的泛化性能较差。现在,我们对决策树应用预剪枝,这可以防止树展开,直到它完全适合训练数据。一种选择是在达到一定深度后停止树展开。这里我们设置max_depth=4,也就是说连续只能问4个问题。结论:限制树的深度可以减少过度拟合。这降低了训练集的准确性,但提高了测试集的准确性。
决策树的过度拟合
很少有人单独使用决策树。他们使用集成决策树。当然是最流行的GBDT,即梯度提升决策树。随机森林也不错,也是一个集成原理,但是我们的重点是GBDT。
决策树的一个主要缺点是它们经常与训练数据过度拟合。随机森林是解决这个问题的一种方法。随机森林本质上是许多决策树的集合,其中每棵树都与其他树略有不同。随机森林背后的想法是,每棵树的预测效果可能相对较好,但可能会过度拟合部分数据。如果构建许多树,并且每棵树的预测都很好,但以不同的方式过度拟合,那么我们可以对这些树的结果进行平均以减少过度拟合。它可以减少过度拟合,同时保持树的预测能力,这可以在数学上得到严格证明。
GBDT,通过合并多个决策树构建更强大的模型。尽管名称中有“回归”,但该模型既可用于回归,也可用于分类。与随机森林方法不同,梯度提升以连续的方式构造树,每棵树都试图纠正前一棵树的错误。默认情况下,梯度提升回归树没有随机化,但使用了强预剪枝。梯度提升树通常使用深度非常小的树(1 到5 之间),以便模型占用更少的内存并使预测更快。
梯度提升背后的主要思想是结合许多简单的模型(在这种情况下称为弱学习器,adboost 也相同),例如深度较小的树。每棵树只能对部分数据做出良好的预测,因此添加越来越多的树可以不断迭代以提高性能。
梯度提升树是机器学习竞赛的常胜者,在业界得到广泛应用。一般来说,它对参数设置比随机森林更敏感,但如果参数设置正确,模型精度更高。
GBDT 三个参数调整:默认、剪枝、学习率上面是在乳腺癌数据集上应用GradientBoostingClassifier 的示例。默认使用100棵树,最大深度为3,学习率为0.1:由于训练集精度达到100%,很可能会出现过拟合。为了减少过拟合,我们可以限制最大深度来增强预剪枝(红框),或者我们可以降低学习率(红框)。正如预期的那样,两种降低模型复杂性的方法都会降低训练集的准确性。在这个例子中,减少树的最大深度显着提高了模型性能,而降低学习率仅略微提高了泛化性能。
(敲黑板!)我们还可以使用一些有用的属性来总结树的工作原理。其中最常用的是特征重要性,它将每个特征对树决策的重要性进行排序。对于每个特征,它是一个介于0 和1 之间的数字,其中0 表示“根本没有使用”,1 表示“完美预测目标值”。请注意,梯度提升树的特征重要性与其他算法(随机森林、线性、knn)的特征重要性有些相似(可以自己测试),但其他算法完全忽略了一些特征。
使用GBDT寻找最佳特征优点、缺点和参数。 GBDT 是监督学习中最强大、最常用的模型之一。它的主要缺点是需要仔细调整参数并且训练时间可能相对较长。与其他基于树的模型类似,该算法不需要对数据进行缩放即可表现良好,并且也适用于存在二元特征以及连续特征的数据集。与其他基于树的模型一样,它通常也不适用于高维稀疏数据。
梯度boosting树模型的主要参数包括树的数量n_estimators和学习率learning_rate,用于控制每棵树纠正前一棵树的错误的强度。这两个参数高度相关,因为learning_rate越低,需要更多的树来构建具有相似复杂度的模型。随机森林的n_estimators值越大越好,但是梯度提升则不同。增加n_estimators 会使模型变得更加复杂,这可能会导致过度拟合。通常的做法是根据时间和内存预算选择合适的n_estimators,然后遍历不同的learning_rate。
另一个重要参数是max_depth(或max_leaf_nodes),它用于降低每棵树的复杂度。梯度提升模型的max_深度通常设置得很小,一般不超过5。
3.2 核化支持向量机(kernelized support vector machine) 核化支持向量机(通常称为SVM)是一种扩展,可以推广到输入空间中无法由超平面定义的更复杂的模型。尽管支持向量机可用于分类和回归,但我们仅介绍在SVC 中实现的分类情况。类似的概念适用于在SVR 中实现的支持向量回归。
我不会详细介绍SVM是如何定义的。很多网站和资料都提到过。这主要是讲技巧。
(敲黑板!)在数据表示中添加非线性特征使得线性模型更加强大。然而,通常我们不知道要添加哪些特征,并且添加许多特征(例如100 维特征空间中所有可能的交互)可能会导致计算成本高昂。幸运的是,有一个聪明的数学技巧,可以让我们在更高维空间中学习分类器,而无需实际计算可能非常大的新数据表示。这种技术称为核技巧,它的工作原理是直接计算扩展特征表示中数据点之间的距离(更准确地说,是内积),而不实际计算扩展。
对于支持向量机来说,将数据映射到更高维空间的常用方法有两种:一种是多项式核,计算原始特征在一定阶数内所有可能的多项式(如feature1 ** 2 * feature2 ** 5);另一种是径向基函数(RBF)核,也称为高斯核。高斯核有点难以解释,因为它对应于无限维的特征空间。高斯核的一种解释是,它考虑所有阶数的所有可能多项式,但阶数越高,特征越不重要。 12
然而,在实践中,核SVM 背后的数学细节并不是很重要,可以简单地总结一下使用RBF 核SVM 进行预测的方法。重要参数调整,SVM有两个参数需要调整:gamma参数用于控制高斯核的宽度。它决定了点彼此之间的接近程度。 C 参数是类似于线性模型中使用的正则化参数。它限制了每个点的重要性。
svc上的乳腺癌数据显示,该模型在训练集上的得分是完美的,但在测试集上的准确率只有63%,这意味着存在相当严重的过拟合。虽然SVM通常表现良好,但它对参数设置和数据缩放非常敏感。特别是,它要求所有特征具有相似的变化范围。
输入乳腺癌的特征数据。特征量级的差异非常大,都在10的数量级。从这张图我们可以判断,乳腺癌数据集的特征有着完全不同的数量级。这对于其他模型(例如线性模型)来说可能是一个小问题,但对内核SVM 影响巨大。解决这个问题的一种方法是缩放每个特征,使其大致处于相同的范围内。核SVM常见的缩放方法是将所有特征缩放到0到1之间。网上有很多自动“归一化”处理方法。这里是“手动”操作。
第一段调参svm中,利用训练集的最小值和极差对测试集进行同样的变换。在第二段中,数据扩展起着很大的作用!实际上,该模型现在欠拟合,因为训练集和测试集的性能非常接近,但尚未接近100% 的准确度。从这里开始,我们可以尝试增加C 或gamma 以适应更复杂的模型。第三段,在这个例子中,增加C可以显着改善模型,导致97.2%的准确率。
内核支持向量机是非常强大的模型,可以在各种数据集上表现良好。 SVM 允许决策边界变得复杂,即使数据只有几个特征。它在低维和高维数据(即很少的特征和很多特征)上都表现良好,但在缩放样本数量方面表现不佳。在样本数高达10 000 的数据上运行SVM 可能会表现良好,但如果数据量达到100 000 或更多,则可能会面临运行时和内存使用方面的挑战。
SVM 的另一个缺点是预处理数据和调整参数需要非常小心。这就是为什么当今许多应用程序使用基于树的模型,例如随机森林或梯度提升(需要很少或不需要预处理)。此外,SVM 模型很难检查,很难理解它们为什么预测它们所做的事情,也很难向非专家解释该模型。
然而,SVM 仍然值得尝试,特别是如果所有特征都以相似的单位(例如像素密度)测量并且具有相似的范围。
核SVM的重要参数是正则化参数C、核的选择以及核相关参数。
3.3 神经网络
隐藏层(即神经网络)的多层感知需要比逻辑回归学习更多的系数(也称为权重):每个输入和每个隐藏单元(隐藏单元组成隐藏层)之间都存在联系系数,有也是每个隐藏单元和输出之间的系数。从数学的角度来看,计算一系列加权和与仅计算一个加权和完全相同,因此为了使这个模型真正比线性模型更强大,我们需要一个技巧。在计算每个隐藏单元的加权和之后,对结果应用非线性函数——,通常校正非线性(也称为校正线性单元或relu)。然后将该函数的结果用于加权求和。通过这种非线性函数,神经网络可以学习比线性模型复杂得多的函数。
简单回归和单隐层多层感知器的区别我们使用了另一个sklearn数据集moons。很明显,神经网络学习到的决策边界是完全非线性的,但相对平滑。我们使用solver="lbfgs"。
默认情况下,MLP 使用100 个隐藏节点,这对于这个小数据集来说相当多了。我们可以减少它们的数量(从而降低模型复杂性)并仍然获得良好的结果
隐藏层为100 最后,我们还可以通过使用L2惩罚来控制神经网络的复杂度,使权重趋于0,就像我们在岭回归和线性分类器中所做的那样。 MLPClassifier中调整L2惩罚的参数是alpha(与线性回归模型中相同),其默认值很小(弱正则化)。图2-52展示了不同alpha值对two_moons数据集的影响。使用具有2 个隐藏层的神经网络。每层包含10 或100 个单元。由于只有10 个隐藏单元,决策边界看起来更加锯齿状。甚至没有。结论是:参数使用得越好,分类就越平滑。但杀鸡没必要用大锤。应根据具体数据进行选择。
隐藏层有10-100层,有4个alpha,组合成8张图片。最后我们来看看神经网络对乳腺癌的作用。
默认神经网络对乳腺癌的影响MLP 的准确性相当不错,但不如其他模型。与前面的SVC 示例一样,原因可能在于数据的缩放。神经网络还要求所有输入特征具有相似的变化范围。理想的情况是均值为0,方差为1。我们必须对数据进行缩放以满足这些要求(第一段)。同样,我们将在这里手动完成,但我们将在第3 章中使用StandardScaler 自动覆盖它。缩放后的结果要好得多,并且相当有竞争力。然而,模型给出了警告(第二段),告诉我们已经达到了最大迭代次数。这是用于学习模型的Adam 算法的一部分,它告诉我们应该增加迭代次数。
最终的神经网络参数调整(第三段)将迭代次数增加到1000次,但仅提高了训练集性能,而没有提高泛化性能。但该模型的表现相当不错。由于训练性能和测试性能之间仍然存在一定差距,我们可以尝试降低模型复杂度以获得更好的泛化性能。在这里,我们选择增加alpha 参数(变化范围很大,从0.0001 到1),从而为权重添加更强的正则化(第4 段):这会产生与我们当前最佳模型相同的性能!
在机器学习的许多应用中,神经网络再次成为最先进的模型。它的主要优点之一是能够捕获大量数据中包含的信息并构建极其复杂的模型。如果有足够的计算时间和数据,并仔细调整参数,神经网络通常可以击败其他机器学习算法(无论是分类还是回归任务)。
这导致了下面讨论的缺点。神经网络——尤其是强大的大型神经网络——通常需要很长的训练时间。正如我们在这里所看到的,它还需要仔细预处理数据。与SVM 类似,神经网络在“均匀”数据上表现最佳,其中“均匀”意味着所有特征都具有相似的含义。如果数据包含不同类型的特征,基于树的模型可能会表现更好。神经网络参数调整本身也是一门艺术。调整神经网络模型和训练模型的方法有很多,我们只简单尝试了几种。
估计神经网络的复杂性。最重要的参数是层数和每层隐藏单元的数量。您应该从1 或2 个隐藏层开始,然后可以逐渐添加更多。每个隐藏层中的节点数量通常接近输入特征的数量,但当节点数达到数千时很少超过特征数量。
当考虑神经网络的模型复杂性时,一个有用的指标是学习的权重(或系数)的数量。如果您有一个包含100 个特征的二元分类数据集,并且模型有100 个隐藏单元,则输入层和第一个隐藏层之间有100 * 100=10 000 个权重。隐藏层和输出层之间还有100 * 1=100 个权重,总共约10 100 个权重。如果添加具有100 个隐藏单元的第二个隐藏层,则第一个隐藏层和第二个隐藏层之间还有另外100 * 100=10 000 个权重,使权重总数约为20 100 个。如果使用具有1000 个隐藏单元的单个隐藏层,则输入层和隐藏层之间需要学习100 * 1000=100 000 个权重,隐藏层和隐藏层之间需要学习1000 * 1=1000 个权重输出层,总共101 000个权重。如果添加第二个隐藏层,则将添加1000 * 1000=1 000 000 个权重,使权重总数达到巨大的1 101 000 个权重,这比具有2 个隐藏层且每层100 个单元的模型要大。 50次。
调整神经网络参数的常见方法是首先创建一个足够大的网络以确保网络能够学习任务。一旦你知道训练数据是可以学习的,你就可以缩小网络或增加alpha 来增强正则化,这可以提高泛化性能。
在我们的实验中,我们主要关注模型的定义:层数、每层节点数、正则化和非线性。这些内容定义了我们想要学习的模型。还有一个问题是如何学习模型或者用来学习参数的算法,这些参数是由求解器参数设置的。求解器有两个有用的选项。默认选项是“adam”,在大多数情况下效果很好,但对数据的缩放非常敏感(因此始终将数据缩放为均值0 和方差1 非常重要)。另一个选项是“lbfgs”,它非常强大,但在大型模型或大型数据集上需要更长的时间。还有一个更高级的“sgd”选项,许多深度学习研究人员都使用它。 “sgd”选项还有许多其他参数需要调整才能获得最佳结果。您可以在用户指南中找到所有这些参数及其定义。当您开始使用MLP 时,我们建议使用“adam”和“lbfgs”。
(章节结束)
参考:
如何安装mglearn网上有介绍:https://blog.csdn.net/qq_41185868/article/details/80941207
网上介绍如何使用mglearn:https://blog.csdn.net/az9996/article/details/86490496
【深入解析:模型训练中的过拟合与欠拟合问题】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
机器学习真的好考验人啊,有时候模型练得过火就过拟合了。
有12位网友表示赞同!
训练数据不多的时候容易出现欠拟合问题,我遇见过几次,好郁闷。
有5位网友表示赞同!
过拟合确实很让人抓狂,感觉模型只会在训练数据上跑得优秀,其他地方就不行。
有15位网友表示赞同!
现在好多机器学习入门教程都没有细讲过这些坑啊!
有17位网友表示赞同!
我最近在搞一个项目,担心会遇到过拟合的状况。
有17位网友表示赞同!
模型训练参数调得好不好好像对防止过拟合很重要了。
有13位网友表示赞同!
感觉过拟合和欠拟合都是学习曲线上的两个极端啊!
有14位网友表示赞同!
看到很多前辈说,遇到过拟合要增大数据集大小。
有9位网友表示赞同!
不知道有没有什么trick可以避免模型训练太深导致过拟合?
有7位网友表示赞同!
感觉正则化技巧对防止过拟合可能挺好用!
有12位网友表示赞同!
还是得好好理解过拟合和欠拟合,才能选到合适的算法啊!
有6位网友表示赞同!
学习曲线图确实能快速看得出模型训练的好坏。
有5位网友表示赞同!
看来还需要多看一些机器学习的经典论文,深入了解这些概念。
有17位网友表示赞同!
有经验的前辈们说过,有时候模型过拟合了反而比欠拟合更难调试?
有17位网友表示赞同!
我记得之前做项目的时候遇到过多次欠拟合的情况啊,每次都很头疼!
有6位网友表示赞同!
感觉训练好一个模型的成功率挺低的啊,要不断调试,平衡好各种因素。
有10位网友表示赞同!
机器学习知识面确实太广了,还有很多地方需要学习!
有20位网友表示赞同!
想要了解过拟合和欠拟合,还得自己去看书籍、论文,才能真正明白!
有17位网友表示赞同!