写点什么

入门有监督学习:数据、模型、度量

  • 2023-09-22
    北京
  • 本文字数:9185 字

    阅读完需:约 30 分钟

1. 引言

在当今信息爆炸的时代,我们面临着大量的数据,这些数据蕴含着宝贵的信息和洞察。然而,要从这些数据中提取有用的知识并做出准确的预测是一项艰巨的任务,这就是机器学习的力量所在。

机器学习是一种人工智能的分支,它探索,开发算法,训练模型,使计算机能够从数据中学习并自动进行决策和预测,而无需明确编程。它的目标是通过统计分析和模式识别来发现数据背后的隐含规律,并用这些规律来做出准确的预测和决策。

在机器学习中,有监督学习是最常见和重要的分支之一。它利用具有标记的训练数据来训练模型,并使用这些模型对未标记的数据进行预测。有监督学习的核心思想是根据已知的输入和输出样本之间的关系,从中学习一个函数,以便对新的输入样本进行预测。

有监督学习在各个领域都有广泛的应用,如自然语言处理、图像识别、推荐系统、金融预测等。它可以帮助我们理解数据中的模式和趋势,预测未来的趋势,并为决策提供有力的支持。

通过本博客,我们将初步探讨有监督学习的基本概念和流程,包括数据的准备和预处理、模型的选择和训练、性能度量和评估等。我们还将使用 Python 作为示例编程语言,展示如何在实践中应用这些概念和技术。

让我们一起踏上有监督学习的旅程,探索数据的奥秘,构建强大的预测模型,并在现实世界中解决各种问题。

2. 数据

有监督机器学习的本质是从数据中学习,因此,数据是机器学习里最重要的一部分。机器学习和深度学习的最近这一波繁荣,本质上也是因为互联网时代数据量的与日俱增带来的。

2.1 数据类型

在有监督学习中,我们通常有两类数据:输入数据(也称为特征)和输出数据(也称为目标变量)。输入数据包含用于预测的特征,而输出数据则是我们要预测或分类的目标。输入数据可以是定量数据(如数值型数据)或定性数据(如分类变量或标签)。目标变量可以是连续值(用于回归问题)或离散类别(用于分类问题)。数据可能包含噪声、缺失值或异常值,需要进行预处理以消除这些问题。

特征和目标变量:特征是描述输入数据的属性或变量。它们可以是数值型、分类型或二进制型。例如,在房价预测问题中,特征可以是房屋的面积、卧室数量、地理位置等。目标变量是我们希望预测或分类的输出变量。它可以是连续值(如预测销售额)或离散类别(如分类图像中的物体类型)。

常见的机器学习模型一般只能使用数值型的特征。对于类别型的特征,大多数模型无法直接使用,需要转成数值变量,这个转换的过程称为类别编码(Categorical Encoding)。考虑一个最简单的情况,如果一个类别特征只有两种类别,那实际上可以直接用 0/1 编码来表示。把这个方法扩展一下的话,即对一个具有 k 种不同类别的变量,使用 k 维 0/1 编码来表示,每一维代表是不是其中的某一类。在每条样本在这 k 维编码中,只会有一维被激活,这个编码方法被称为独热编码(One-Hot Encoding)。

至于序数变量,实践中比较少见,很多时候都当成类别特征来使用。也可以利用序数的性质,把它们按顺序编码成 {0, 1, 2, …} 的连续整数。需要注意的是,这样的编码方式并不是完美的,因为它有一个不一定正确的假设:假定了相近的序数两两之间都是等间隔的。

2.2 数据集

在有监督机器学习里,一个数据集会包含多条样本。每条样本都带有标签和特征,标签也就是模型需要学习的目标,特征是其他的可以获取和利用的信息,并作为模型的输入。用符号来表示的话,我们可以把一个数据集定义成 D=(X,Y)=\{(x_i,y_i ) | 1≤i≤n \},n 表示这个数据集的大小,x_i 表示第 i 个样本的特征,y_i 表示第 i 个样本的标签(又称训练标签)。其中,x_i=\{x_{ij} | 1≤j≤m\},m 表示特征的维度数量,x_{ij} 表示第 i 个样本的第 j 维特征。特征一般是机器可以容易得到的信息,比如一张图像的所有像素点,而标签则是不容易得到的信息(否则就没有学习的必要),比如未来的房价。

根据标签的变量类型,有监督机器学习可以分为两大类,一类是学习数值型标签的回归(Regression)问题,另一类是学习类别型标签的分类(Classification)问题。对于这两类问题,一般要使用不同的损失函数 (Loss Function) 。

2.3 同构和非同构数据

根据数据中特征的分布一致性,我们可以把数据分成两大类。一类是同构数据,即特征的分布基本一致,如常见的图象、语音、文本等;另一类是非同构数据,又称表格数据(Tabular Data)或结构化数据 ,如各种推荐广告系统中的数据。同构数据一般有比较明显的模式和规律:如图像数据里面,每个像素会和与自己相邻的位置上的像素的关系更大一点,这也就是在空间上的局部性;在语音数据中,数据有时序上的依赖,这是时间上的局部性。而表格数据一般是在实际的业务场景中收集到的数据,因各种业务繁多,这些表格数据没有一个共有的规律。即使是一样的业务,因不同的公司和企业也有很大的区别,也很难有一致的模式。因此,表格数据实际上没有明显的规律可以挖掘,也更难从中学习。表格数据里面的特征一般都是人工赋予的,每一维表示一些具体的属性,常见的如用户的性别、年龄,或商品的价格、品类等等。在表格数据中,一条样本一般表示一次事件,比如某个用户买了某个商品,这时候我们就把用户的属性、商品的属性,及该用户与该商品交互历史,当成这条样本的特征。在表格数据中,特征一般具有排列不变性(Permutation Invariant)。举个例子来说明的话,比如用户的年龄、性别、职业等,在数据中无论用那种排列方式(需要保证不同样本的排列方式是一样的),数据包含的信息都是一致的。这是因为在表格数据中,每一维特征都是一个独立的概念,其信息不因为其所在位置而改变。相比之下,同构数据一般没有这个性质,因为在这些数据中,特征一般不独立,它们之间有很强的依赖。比如文本中,同样的一个词在不同的上下文有不同的含义,随机改变一个句子中的词语顺序也会造成完全不一样的意思。又比如图像中,随机排列一张图片中的像素,会让这图像变得不可辨认。

正确认识这些数据的不同,在机器学习的实践中是非常重要的。在机器学习中,我们常说的一句话是,天下没有免费的午餐。因此,在机器学习实践的时候,需要具体问题具体分析。而正确认识这些数据的差异和区别,并正确选择适用的模型,是机器学习实践中的第一步,也是最重要的一步。

2.4 数据切分

最后需要介绍的是,数据的使用和切分。在实践中,为了客观地评测模型的效果,我们一般会把数据切成三个不重叠的数据集:训练集、验证集和测试集。训练集直接用于模型的训练;验证集不直接参与训练,但用于训练过程的调优;测试集用于验证模型调优后的效果。之所以需要测试集,是因为验证集在调优过程中或多或少会泄露信息,模型可能会过拟合到验证集上,因此无法用验证集客观地评价模型地效果。因此,如果模型几乎没有调优过程,可以只切成训练集和验证集,然后直接用验证集当成测试集来用。并且,需要注意的一点是,一定不能对着测试集的结果调优模型,不然就是作弊,也自欺欺人。比较常见的训练集、验证集和测试集的比例是 8: 1: 1。另外,数据的切分也有需要注意的地方,大多数情况下,只需要随机切分就可以,但有时也需要根据实际的场景调整。例如当数据的分布如果会随时间变化时,这常常发生在各种线上业务场景。这时候切分数据也往往需要按照时序来切,即最旧的数据作为训练集,较新的作为验证集,最新的那部分作为测试集。这样训练出来的模型也会更符合真实的业务场景。

当数据量不充足的时候,可以在验证完模型的效果后,固定住模型的所有设置,然后用所有的数据重新训练一次。这样可以更充分的利用数据,可以带来一些效果的提高,但需要额外的训练代价。


除了用独立的训练集和验证集,还有一种方法,叫 K 折交叉验证(K-Fold Cross Validation)。具体来说,这种方法会把数据平均且随机地切成 K 块。然后进行 K 次训练,轮流地使用其中 1 块作为验证集,剩下的 K-1 块作为训练集。最终的验证结果为这 K 次验证的结果的均值。交叉验证一般可以更客观的验证模型的效果,但也带了比较大的训练代价,因此在实践中也要根据自己的需求来选择合适的验证方式。

2.5 数据预处理

数据预处理是有监督学习流程中的关键步骤。它有助于准备和清洗数据,以确保模型的性能和准确性。

数据清洗是指处理缺失值、异常值和噪声等问题。这可以包括填充缺失值、删除异常值或使用统计方法来处理噪声。

特征选择是选择最相关和有意义的特征,以减少数据维度和模型复杂性。这可以提高模型的泛化能力和解释性。

特征缩放是将不同范围的特征值缩放到相似的范围,以确保模型不会因为某些特征值的数值差异而受到影响。常见的特征缩放方法包括标准化和归一化。

3. 模型

在有监督学习中,选择合适的模型是构建高效预测模型的关键一步。在有监督学习中,有许多常用的模型类型可供选择。以下是其中一些常见的模型类型:

  1. 线性回归:线性回归是一种用于解决回归问题的模型。它基于线性关系建立模型,通过拟合最佳的直线或超平面来预测连续目标变量的值。

  2. 逻辑回归:逻辑回归是一种用于解决分类问题的模型。它基于逻辑函数(如 sigmoid 函数)建立模型,通过拟合最佳的决策边界来预测离散目标变量的类别。

  3. 决策树:决策树是一种用于解决分类和回归问题的模型。它基于树状结构建立模型,通过一系列的分裂节点和规则来进行预测和分类。

  4. 支持向量机(SVM):支持向量机是一种用于解决分类和回归问题的模型。它通过寻找最佳的超平面或决策边界来进行分类和预测,并具有较强的泛化能力。

  5. 神经网络:神经网络是一种用于解决复杂问题的模型。它模仿人脑的神经网络结构,通过多个层次的神经元和连接权重来进行学习和预测。

每种模型都有其自身的特点和适用场景,接下来,我们将解释每种模型的基本原理和适用场景。

  1. 线性回归:线性回归假设输入特征和目标变量之间存在线性关系。它适用于预测连续值的回归问题,如房价预测、销售额预测等。

  2. 逻辑回归:逻辑回归使用逻辑函数将输入特征映射到概率值,并进行分类。它适用于解决二元分类问题,如垃圾邮件分类、疾病预测等。

  3. 决策树:决策树使用一系列的分裂节点和规则来进行分类和回归。它适用于解决分类和回归问题,尤其在特征具有离散或类别型属性时效果较好。

  4. 支持向量机(SVM):支持向量机通过寻找最佳的超平面或决策边界来进行分类和回归。它适用于解决二元分类和多类分类问题,尤其在数据维度较高时表现良好。

  5. 神经网络:神经网络通过多层神经元和连接权重进行学习和预测。它适用于解决复杂问题,如图像分类、自然语言处理等。神经网络在大规模数据和计算资源充足的情况下表现出色。

在选择模型时,应考虑问题的性质和数据的特点。以下是一些重要的考虑因素:

  1. 数据类型:根据数据的类型(连续、离散、类别等),选择适合的模型。例如,线性回归适用于连续数值,决策树适用于离散或类别型数据。

  2. 数据规模:根据数据集的规模,选择合适的模型。例如,当数据集较小且特征较少时,简单的线性回归或逻辑回归可能足够。而当数据集较大且特征复杂时,神经网络或支持向量机等复杂模型可能更合适。

  3. 特征与目标关系:分析特征与目标之间的关系,选择能够捕捉到这种关系的模型。例如,如果特征与目标之间存在非线性关系,决策树或神经网络等非线性模型可能更适合。

  4. 解释能力和预测性能:考虑模型的解释能力和预测性能之间的权衡。例如,线性回归可以提供可解释的系数,而神经网络则可以具有更高的预测性能但解释性较弱。

  5. 预处理需求:考虑数据的预处理需求,如特征缩放、特征选择等。某些模型对数据的预处理要求较高,例如支持向量机对于特征缩放的敏感性。

综上所述,模型选择应该综合考虑问题的性质和数据的特点。没有一种通用的最佳模型,选择合适的模型需要根据具体情况进行权衡和实验


4. 度量

评估有监督学习模型的性能是评估其预测能力和效果的关键。首先,我们将介绍准确率、精确率、召回率和 F1 分数等常见的度量指标。接着,我们将强调根据问题的要求选择适当的度量指标。

在有监督学习中,有许多度量指标可用于评估模型的性能。以下是一些常见的度量指标:

  1. 准确率(Accuracy):准确率是衡量模型分类准确性的指标,定义为正确预测的样本数总样本数之比。准确率高表示模型的整体预测能力较好,但当数据不平衡时可能会产生误导。

  2. 精确率(Precision):精确率是衡量模型预测为正类的样本中实际为正类的比例。它关注的是模型预测的准确性,适用于对误报(False Positive)敏感的情况,如疾病诊断。

  3. 召回率(Recall):召回率是衡量模型正确预测为正类的样本实际正类样本的比例。它关注的是模型对正类样本的覆盖程度,适用于对漏报(False Negative)敏感的情况,如安全检测。

  4. F1 分数(F1 Score):F1 分数综合考虑了精确率和召回率,是二者的调和平均值。它可以平衡精确率和召回率之间的权衡,适用于同时关注准确性和覆盖性的情况。

这些度量指标代表了评估有监督学习模型性能的一小部分,每个指标都有其独特的优势和适用场景。接下来,我们将强调根据问题的要求选择适当的度量指标。

在选择度量指标时,应根据问题的要求和关注点选择适当的指标。以下是一些重要的考虑因素:

  1. 问题类型:根据问题是分类问题还是回归问题,选择相应的度量指标。对于分类问题,可以使用准确率、精确率、召回率和 F1 分数等指标。而对于回归问题,可以使用平均绝对误差(MAE)均方根误差(RMSE)等指标。

  2. 类别不平衡:如果数据集中的类别分布不平衡,应当谨慎选择度量指标。准确率可能会误导,因为模型可能倾向于预测多数类别。在这种情况下,精确率、召回率和 F1 分数可以提供更全面的评估。

  3. 业务需求:根据具体的业务需求选择度量指标。不同的业务场景对模型性能的要求有所不同。例如,对于医疗诊断,精确率可能更为重要,而对于航空安全,召回率可能更重要。

  4. 模型比较:在比较不同模型之间的性能时,应选择同一度量指标进行比较。使用相同的度量指标可以确保公平的比较,以确定哪个模型更适合题目中的要求。


5. 模型训练

模型训练是有监督学习中的关键步骤,它涉及到模型的初始化、损失函数的定义、优化算法的选择以及训练集和验证集的划分。

模型初始化、损失函数和优化算法

  1. 模型初始化:在模型训练之前,需要对模型的参数进行初始化。模型的初始化可以是随机的,也可以根据先验知识进行设置。常见的初始化方法包括零初始化、随机初始化和预训练初始化。

  2. 损失函数:损失函数用于衡量模型预测结果与真实标签之间的差异。常见的损失函数包括均方误差(Mean Squared Error, MSE)、交叉熵损失(Cross-Entropy Loss)和对数损失(Log Loss)。选择适当的损失函数取决于问题的类型和模型的输出。

  3. 优化算法:优化算法用于更新模型的参数以最小化损失函数。常见的优化算法包括梯度下降法(Gradient Descent)、随机梯度下降法(Stochastic Gradient Descent, SGD)以及其改进版,如动量优化(Momentum)、自适应学习率优化(Adaptive Learning Rate)算法(如 Adam 和 RMSProp)等。选择适当的优化算法可以加快模型的收敛速度和提高性能。

训练集和验证集的划分和交叉验证

  1. 训练集和验证集的划分:在模型训练过程中,通常需要将数据集划分为训练集和验证集。训练集用于模型的参数更新和训练,而验证集用于评估模型的性能和调整超参数。合理的训练集和验证集的划分可以避免模型对训练数据过拟合的问题。

  2. 交叉验证:为了更准确地评估模型的性能和鲁棒性,可以采用交叉验证的方法。交叉验证将数据集划分为多个互斥的子集,然后进行多轮训练和验证,每一轮使用不同的子集作为验证集。通过多次交叉验证,可以得到更稳定和可靠的模型评估结果。

模型训练的步骤


  1. 准备数据集:包括数据的加载、预处理和划分。

    定义模型:选择适当的模型结构和网络架构。

    初始化模型参数:对模型的参数进行初始化。

    定义损失函数:选择适当的损失函数。

    选择优化算法:选择合适的优化算法进行模型参数的更新。

    进行训练:使用训练数据进行模型的训练和参数更新。

    评估模型:使用验证集评估模型的性能。

    调整超参数:根据验证集的结果调整模型的超参数。

训练技巧

  1. 批量训练(Batch Training):将训练数据划分为小批量进行训练,而不是逐个样本训练。这样可以减少参数更新的频率,提高计算效率,并且可以利用硬件加速如 GPU 的并行计算能力。

  2. 学习率调度(Learning Rate Scheduling):随着模型训练的进行,逐渐降低学习率可以使模型更好地收敛到最优解。常见的学习率调度策略包括固定的衰减率、按照一定的时间表进行衰减、根据验证集的性能动态调整学习率等。

    正则化(Regularization):为了防止模型过拟合训练数据,可以采用正则化技术。常见的正则化方法包括 L1 正则化、L2 正则化和 dropout 等,它们可以通过对模型参数引入惩罚项或随机失活来减少过拟合的风险。

    数据增强(Data Augmentation):通过对训练数据进行随机变换和扩增,可以增加数据的多样性,提高模型的泛化能力。常见的数据增强操作包括随机裁剪、旋转、平移、翻转等。

    梯度裁剪(Gradient Clipping):为了避免梯度爆炸的问题,可以对梯度进行裁剪,即限制梯度的范围在一个合理的范围内,常见的裁剪方法包括通过设置阈值对梯度进行缩放或截断。

    提前停止(Early Stopping):在模型训练过程中,如果验证集的性能不再提升,可以通过提前停止训练来避免过拟合。可以设置一个阈值或监控验证集的性能变化,当性能不再改善时停止训练,选择性能最好的模型参数。

    参数初始化策略(Parameter Initialization):合适的参数初始化可以帮助模型更快地收敛和避免陷入局部最优。常用的初始化策略包括随机初始化、预训练初始化(如使用预训练的模型权重)以及 Xavier 初始化等。

这些训练技巧可以根据具体问题和数据集的特点进行选择和调整,以提高模型的性能和泛化能力。同时,模型训练也是一个迭代的过程,需要不断尝试和优化,根据实验结果进行调整和改进。

6. 模型选择

我们有各种各样的机器学习模型,每一种模型都对数据有着不同的假设,也有着不同的适应场景。换句话说,不存在一个万能的模型,可以适用于各种场景和数据。因此,知道如何根据数据和实际场景选择不同的模型,是模型选择中的第一步,也是最重要的一步。

同构数据

  • 图像 - CNN、Transformer

  • 文本、语音 - RNN、Transformer

  • 图 - CNN、Transformer

非同构数据

  • 推荐系统 GBDT

  • 股票预测 GBDT

数据的类型,包括图像、序列和表格数据。对于每一类数据,都有其各自适用的模型。如图像数据,可以使用卷积神经网络(Convolution Neural Network)及其衍生出来的各种模型。卷积神经网络为了处理图像而生,它利用了图像数据中的空间局部性,即相邻位置的特征(即图像中的像素)具有更强的相关性,降低了网络中的运算量和参数量,因而可以高效且有效地处理图像数据。再比如序列数据,如自然语言文本数据等,可以使用循环神经网络(Recurrent Neural Network)或如今更常用的基于 Transformer 的模型。无论是图像数据还是序列数据,都具有很明显的模式。而神经网络适合这种数据组织规律很明显的数据,因为我们可以利用这些明显的模式设计相对应的网络结构,从而更高效地从这些数据中学习。

但对于表格数据而言,由于其数据没有固定的模式,很难设计对其有效的神经网络结构。虽然我们对每一个数据都重新设计一个结构,但这样需要额外花费大量的人力。并且,在表格数据相关的业务中,特征可以随时改动,而每一次改动都可能需要重新设计结构。因此,对于表格数据而言,使用神经网络并不是一个好的选择。对于表格数据,GBDT(梯度提升树)是一个在实践中被广泛使用的模型。GBDT 具有很多对表格数据友好的性质,如非线性,自动的特征选择、贪心自适应的模型复杂度、速度快等各种优点,堪称是个在表格数据上的万金油模型。当然, GBDT 也不是万能的。对于表格数据而言,往往还需要特征工程来进一步提高效果。

除了数据,也还要根据实际的应用场景选择合适的模型。比如有些业务对模型的实时性要求非常高,那就很可能需要最简单的线性模型。又或者模型需要可以跑在内存很小的移动设备上, 这时候就需要用容量很小的模型。简而言之,不同的模型适用于不同的数据和场景,我们首先要选择合适的模型。

模型选择和调优的策略

  1. 简单模型优先原则:通常情况下,简单的模型比复杂的模型更具有泛化能力,因为它们更不容易过拟合训练数据。因此,在选择模型时,应首先考虑使用简单的模型。

    领域知识指导:了解问题领域的先验知识可以帮助选择合适的模型。根据问题的特点和领域知识,可以确定适合解决问题的模型类型,并选择相应的算法。

    调优策略:模型调优是指通过调整模型的超参数来改善模型性能。超参数是在模型训练之前设置的参数,例如学习率、正则化参数等。调优策略包括手动调整、网格搜索、随机搜索、贝叶斯优化等方法。

模型复杂度和泛化能力的关系

  1. 模型复杂度指的是模型所能表达的函数空间的大小。复杂的模型具有更大的函数空间,可以拟合更多种类的数据模式,但也更容易过拟合。

    泛化能力是模型对未见过的数据的适应能力。简单模型通常具有较好的泛化能力,因为它们更容易从有限的数据中提取出一般化的模式,并避免对噪声和不相关特征的过拟合。

    在模型选择中,需要权衡模型复杂度和泛化能力。过于简单的模型可能无法捕捉到数据的复杂性,而过于复杂的模型可能会过拟合训练数据。因此,需要通过调整模型的复杂度来平衡模型的拟合能力和泛化能力。

使用交叉验证和网格搜索等技术选择最佳模型参数

  1. 交叉验证是一种评估模型性能和选择最佳参数的技术。它将数据集划分为训练集和验证集,并多次进行训练和验证,每次使用不同的子集作为验证集。通过交叉验证,可以得到对模型性能的更稳定和可靠的评估。

    网格搜索是一种系统地搜索参数空间以找到最佳参数组合的方法。它通过指定一组候选参数的取值范围,并在这些参数上进行穷举搜索,然后通过交叉验证评估每个参数组合的性能,最终选择性能最好的参数组合作为最佳模型参数。

    除了网格搜索,还可以使用随机搜索和贝叶斯优化等技术来进行参数调优。随机搜索在参数空间中随机抽样,而贝叶斯优化通过建立参数的概率模型,利用贝叶斯推断来选择最佳参数。

模型选择和调优是一个迭代的过程,需要根据实验结果不断调整和改进。通过合适的模型选择和调优策略,可以选择出最适合解决问题的模型,并优化模型的性能和泛化能力。

7. 简单示例

from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score
# 载入鸢尾花数据集iris = load_iris()X = iris.datay = iris.target
# 将数据集拆分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建逻辑回归分类模型model = LogisticRegression()
# 在训练集上训练模型model.fit(X_train, y_train)
# 在测试集上进行预测y_pred = model.predict(X_test)
# 计算准确率accuracy = accuracy_score(y_test, y_pred)print("准确率:", accuracy)
复制代码


发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2019-07-02 加入

还未添加个人简介

评论

发布
暂无评论
入门有监督学习:数据、模型、度量_机器学习_麦田的守望者_InfoQ写作社区