🤵♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍
🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨
数据标准化和归一化
在使用梯度下降算法进行模型训练时,对输入特征进行比例缩放(或归一化)有以下几个原因:
- 加速收敛:梯度下降的目标是找到损失函数最小化的参数值,而不同特征可能具有不同的尺度和范围。如果某些特征具有较大的值范围,那么**其相关权重更新也会更大,这可能导致算法收敛过程变得非常缓慢甚至无法收敛。**通过对输入特征进行比例缩放,可以使各个特征都处于相似的尺度范围内,从而加快算法收敛速度。
- 防止数值溢出:在计算过程中,**涉及到较大或较小数值时容易发生数值溢出问题。**通过将输入特征进行比例缩放,可以有效地避免这种情况的发生。
- 提高模型性能:某些机器学习模型(如支持向量机、K近邻等)对输入数据中不同尺度和范围非常敏感。当存在明显差异的尺度时,在距离计算、权重分配等方面可能会产生偏差,并且影响模型性能。通过比例缩放输入特征,可以确保模型能够更好地利用每个特征的信息,提高模型性能。
在线性回归中,尤其是多变量回归模型,由于各个的数据之间量化纲位不同,如果说两个参数尺度范围分别是是【0~1000,0 ~5】或者【-0.00004 ~ 0.00002,10 ~ 30】, 那么在使用梯度下降算法时,他们的等高线是一个又窄又高的等高线,如下图:
因为一个他们量化纲位不同会出现 (1,299),(3,800) 这种特征实例,那么等高线就会又窄又高,在梯度下降算法中,参数更新就会如上图左右震荡(权重更新一点就会导致输出变大,对大尺度的特征更加敏感,不利于学习)如果等高线如下图,参数更新就能更快收敛与更新了
如下图:代价函数(如MSE: 回归模型的预测值和实际值的差的平方和)的3D图,就像下山一样,为了达到局部最优点或全局最优点,作为下山者,你肯定希望地形比较平缓,比较清楚的知道往哪里走能够最快下山,而如果这个山又陡又窄,那下山者是不是下山肯定速度慢很多(更新中不能较快收敛,左右震荡),往哪里都是下降,不能准确找到方向。
理想的代价函数
但实际往往都是下图的情况 (有许多局部最优)
数据标准化和归一化是常见的数据预处理技术,它们在以下情况下使用:
- 特征缩放:当特征的取值范围差异较大时,可以使用数据标准化或归一化来将其缩放到相似的范围。这有助于避免某些特征对模型训练产生过大影响。
- 收敛加速:在某些机器学习算法(如梯度下降)中,如果不进行数据标准化或归一化,则可能需要更多迭代次数才能收敛到最优解。通过使特征具有类似的尺度,可以提高算法收敛速度(不再左右震荡,权重更新性价比相同,特征之前模型一视同仁)并加快训练过程。
- 防止数值溢出:当输入数据包含非常大或非常小的值时,计算中可能会发生数值溢出或舍入误差。通过将数据缩放到合理范围内,可以避免这些问题,并提高计算稳定性。
- 算法要求:某些机器学习算法(如K均值聚类、支持向量机等)对输入数据进行了假设,例如假设样本服从正态分布。(机器学习算法最重要的概率统计,如果尺度和范围不同,显然很难拟合分布)在这种情况下,对于满足这些假设的算法而言,数据标准化或归一化是必要的预处理步骤。
尽管数据标准化和归一化在许多情况下都很有用,但并不是所有算法都需要进行这些操作。例如,决策树和随机森林等基于树的模型通常不受特征缩放影响(这种是基于不同类别的信息增益(信息熵)或者基尼指数(类别纯度)确定阈值,而图像识别等深度学习任务则通常对原始输入进行归一化处理。
在实践中,可以使用以下方法来进行数据标准化和归一化:
- 数据标准化(Standardization):通过将每个特征值减去其均值,并除以其标准差来使特征具有零均值和单位方差。(这也是我们在平时数学上求正态分布的算法,使其均值为0,方差为1)
- 数据归一化(Normalization):通过将每个特征值按比例缩放到给定范围内(如0到1之间)来保持相对关系。
请注意,在应用这些技术时,应该先分割出训练集和测试集,并且仅使用训练集上的统计信息来对整个数据集进行转换。然后将相同的变换应用于测试集以确保结果的可靠性。
在选择数据标准化(Standardization)和数据归一化(Normalization)之前,需要根据具体情况来评估它们的优劣。
- 数据标准化的优点:
- 保留了原始数据分布的形状,不会改变特征的相对关系。
- 对异常值不敏感。由于使用均值和标准差进行缩放,异常值对结果影响较小。
- 在某些机器学习算法中表现较好,如逻辑回归、线性回归等基于距离计算或梯度下降的模型。
- 数据归一化的优点:
- 将特征缩放到固定范围内有利于比较不同单位或取值范围的特征。
- 有助于加速收敛过程,在某些机器学习算法中可能提高训练速度。
- 在某些算法要求输入数据处于特定范围时非常有用,如支持向量机、K均值聚类等。
因此,在选择数据标准化还是数据归一化时可以考虑以下因素:
- 特征类型:如果特征之间具有明显的大小差异,并且你希望保留其相对关系,则可以选择使用数据标准化(比如人体大小与头发大小,人体总体一定远远大于头发的关系)。如果你更关心特征的绝对值或需要将其缩放到固定范围内,则可以选择数据归一化。
- 算法要求:某些算法对输入数据有特定的要求,例如支持向量机需要使用归一化后的数据。在这种情况下,你应该根据算法要求来选择适当的预处理方法。
- 实验结果:尝试不同的预处理方法并比较它们在模型性能上的效果。根据实际结果来选择最佳方法。
总而言之,没有单一正确答案。选择数据标准化还是归一化取决于你所面临问题和具体需求,并且可能需要进行试验和评估以确定最佳方案。(实践是证明真理的唯一标准!!! —— 伽利略)
BatchNormalization
在深度学习上,Batch Normalization(批标准化)可以在某种程度上替代数据归一化和标准化。
Batch Normalization 是一种用于加速深度神经网络收敛、防止梯度消失/爆炸等问题的技术。它通过对每个小批量样本进行均值和方差的归一化来规范输入数据,并将其缩放和平移以恢复数据分布。
Batch Normalization 的优点包括:
- 自适应性:相比于单纯的数据预处理方法,如标准化或归一化,Batch Normalization 能够自动学习适合当前训练批次的均值和方差。
- 抑制梯度问题:通过将每层输入进行规范化,Batch Normalization 有助于解决梯度消失/爆炸问题(如权重问题,数据尺度和范围问题导致的上溢下溢等问题),使得神经网络更容易训练。
- 正则化效果:由于 Batch Normalization 引入了额外参数来调整特征缩放和平移(比如比例缩放偏置移动),它具有正则化效果,并且能够稍微提高模型泛化能力。
因此,在使用深度神经网络时,可以考虑直接使用 Batch Norm 进行特征处理而不需要显式地对输入进行标准化或归一化。但请注意以下事项:
- 执行顺序:如果使用 Batch Normalization,通常应该在每个隐藏层的激活函数之前进行批标准化。这样可以确保网络从输入层到输出层的所有中间特征都受益于规范化。
- 数据分布:Batch Normalization 是基于小批量数据的统计信息来进行归一化操作的,因此对于较小规模或不均衡的数据集可能效果不佳。
- 预训练模型:如果你使用了预训练好的模型(如 ImageNet 上预训练过的卷积神经网络),则需要根据原始模型是否已经包含 Batch Norm 来决定是否需要进一步处理。
总结而言,Batch Normalization 在深度神经网络中是非常有用和有效的技术,并且可以部分替代传统的数据归一化和标准化方法。但具体选择还要根据实际情况和实验结果来确定。
数据划分
对于机器学习模型的训练,通常需要将数据集划分为训练集和测试集。而验证集是用于模型调优和选择最佳超参数的辅助数据集。
下面是对训练集、验证集和测试集的解释及其区别:
- 训练集(Training Set):训练集是用于训练机器学习模型的数据集。模型通过对训练集的样本进行学习和参数调整,以最小化训练集上的损失函数。训练集通常占整个数据集的大部分比例。
- 验证集(Validation Set):验证集是用于模型调优和选择最佳超参数的数据集(如果没有测试集,对着验证集炼丹反而有可能拟合验证集)。在训练过程中,使用验证集评估模型在未见过的数据上的性能,并进行模型参数的调整。通过在验证集上的表现,可以选择最佳的模型配置和超参数,以获得更好的泛化能力。
- 测试集(Test Set):测试集是用于评估训练好的模型的性能和泛化能力的数据集。测试集是模型未曾见过的数据,用于模拟模型在实际应用中遇到的新样本。通过测试集上的表现,可以得出对模型的客观评价。
区别:
- 训练集用于训练模型的参数,目标是使模型能够对训练数据进行准确拟合。
- 验证集用于模型调优和选择超参数,目标是选择最佳的模型配置,使模型具有良好的泛化能力。
- 测试集用于评估模型的性能和泛化能力,目标是得出对模型的客观评价。
重要的一点是,验证集和测试集都是在训练阶段以外的数据上进行评估,以避免模型在训练数据上过度拟合。它们的目的是验证和衡量模型的性能,但验证集用于模型调优,而测试集则用于最终评估模型的性能。