测试和验证数据集之间有什么区别?
原文:
machinelearningmastery.com/difference-test-validation-datasets/
验证数据集是训练模型时保留的数据样本,用于在调整模型的超参数时对模型技能进行估计。
验证数据集不同于测试数据集,该测试数据集也从模型的训练中退回,而是用于在最终模型之间进行比较或选择时给出最终调整模型的技能的无偏估计。
在应用机器学习中,关于验证数据集的确切内容以及它与测试数据集的不同之处存在很多混淆。
在这篇文章中,您将发现训练,测试和验证数据集的清晰定义,以及如何在您自己的机器学习项目中使用每个数据集。
阅读这篇文章后,你会知道:
- 机器学习领域的专家如何定义训练,测试和验证数据集。
- 实践中验证和测试数据集之间的区别。
- 在评估模型时,可用于充分利用验证和测试数据集的过程。
让我们开始吧。
测试和验证数据集之间有什么区别?
veddderman 的照片,保留一些权利。
教程概述
本教程分为 4 个部分;他们是:
- 什么是专家的验证数据集?
- 训练,验证和测试数据集的定义
- 验证数据集不够用
- 验证和测试数据集消失
什么是专家的验证数据集?
我发现确切地看到从业者和专家如何描述数据集很有用。
在本节中,我们将根据一些顶级机器学习文本和参考资料,查看训练,测试和验证数据集的定义方式以及它们的区别。
通常,术语“_ 验证集 ”可与术语“ 测试集 _”互换使用,并且是指从训练模型中阻止的数据集的样本。
对训练数据集的模型技能的评估将导致偏差得分。因此,在保留的样本上评估模型,以给出模型技能的无偏估计。这通常称为算法评估的训练测试分割方法。
假设我们想要估计与在一组观察上拟合特定统计学习方法相关的测试误差。验证集方法[…]是一项非常简单的策略。它涉及将可用的观察组随机分成两部分,即训练集和验证集或保持集。该模型适合训练集,拟合模型用于预测验证集中观察的响应。得到的验证集错误率 - 通常在定量响应的情况下使用 MSE 评估 - 提供测试错误率的估计。
- Gareth James 等,第 176 页,统计学习导论:应用于 R ,2013。
我们可以直接在 Kuhn 和 Johnson 的优秀文本“Applied Predictive Modeling”中看到可互换性。在这个例子中,他们清楚地指出,最终的模型评估必须在先前未使用过的数据集上进行,用于训练模型或调整模型参数。
理想情况下,应该对未用于构建或微调模型的样本评估模型,以便它们提供无偏见的模型有效性。当手头有大量数据时,可以留出一组样本来评估最终模型。 “训练”数据集是用于创建模型的样本的通用术语,而“测试”或“验证”数据集用于限定表现。
- Max Kuhn 和 Kjell Johnson,第 67 页, Applied Predictive Modeling ,2013
传统上,用于评估最终模型表现的数据集可称为“测试集”。 Russell 和 Norvig 在其开创性的 AI 教科书中重申了保持测试集完全分离的重要性。他们指的是以任何方式使用来自测试集的信息“偷看”。他们建议完全锁定测试装置,直到所有模型调整完成。
偷看是使用测试集表现来选择假设并对其进行评估的结果。避免这种情况的方法是真正保持测试集的锁定,直到你完全完成学习,并希望获得对最终假设的独立评估。 (然后,如果你不喜欢结果…如果你想回去找一个更好的假设,你必须获得并锁定一个全新的测试集。)
- Stuart Russell 和 Peter Norvig,第 709 页,人工智能:现代方法,2009(第 3 版)
重要的是,Russell 和 Norvig 评论说,用于拟合模型的训练数据集可以进一步分为训练集和验证集,并且它是训练数据集的这个子集,称为验证集,可用于获取早期估计模型的技能。
如果测试集被锁定,但您仍希望测量未见数据的表现,作为选择良好假设的一种方法,则将可用数据(不包括测试集)划分为训练集和验证集。
- Stuart Russell 和 Peter Norvig,第 709 页,人工智能:现代方法,2009(第 3 版)
验证集的这一定义得到了该领域其他开创性文本的证实。一个好的(和更老的)例子是 Ripley 的书“模式识别和神经网络”中的术语表。具体来说,训练,验证和测试集的定义如下:
训练集:用于学习的一组示例,即适合分类器的参数。
验证集:用于调整分类器参数的一组示例,例如,用于选择神经网络中隐藏单元的数量。
测试集:一组仅用于评估完全指定分类器表现的示例。
- Brian Ripley,第 354 页,模式识别和神经网络,1996
这些是这些术语的推荐定义和用法。
这些定义是规范的一个很好的例子是它们在着名的神经网络常见问题解答中的重复。除了重申 Ripley 的词汇表定义之外,它继续讨论在应用机器学习中常见的滥用术语“测试集”和“验证集”。
关于机器学习的文献经常颠倒“验证”和“测试”集的含义。这是人工智能研究中最常见的术语混淆的例子。
关键的一点是,根据 NN [神经网络]文献中的标准定义,测试集从不用于在两个或更多网络中进行选择,因此测试集上的误差提供了对泛化误差的无偏估计(假设测试集代表人口等)。
- 主题:人口,样本,训练集,设计集,验证集和测试集是什么?
您是否知道这些术语的任何其他明确定义或用法,例如:论文或教科书中的引用?
请在下面的评论中告诉我。
训练,验证和测试数据集的定义
为了重申研究上述专家的研究结果,本节提供了对这三个术语的明确定义。
- Training Dataset :用于拟合模型的数据样本。
- 验证数据集:用于在调整模型超参数的同时提供适合训练数据集的模型的无偏估计的数据样本。随着验证数据集上的技能被合并到模型配置中,评估变得更加偏向。
- 测试数据集:用于提供适合训练数据集的最终模型的无偏估计的数据样本。
我们可以使用伪代码草图制作这个具体内容:
# split data
data = ...
train, validation, test = split(data)
# tune model hyperparameters
parameters = ...
for params in parameters:
model = fit(train, params)
skill = evaluate(model, validation)
# evaluate final model for comparison with other models
model = fit(train)
skill = evaluate(model, test)
以下是一些额外的澄清说明:
- 验证数据集还可以在其他形式的模型准备中发挥作用,例如特征选择。
- 最终模型可以适合训练和验证数据集的总和。
这些定义对您的用例是否清楚?
如果没有,请在下面提问。
验证数据集不够用
还有其他方法可以计算无偏见的(或在验证数据集的情况下逐渐更偏向)对未见数据的模型技能的估计。
一个流行的例子是使用 k-fold 交叉验证来调整模型超参数而不是单独的验证数据集。
在他们的书中,库恩和约翰逊有一个标题为“数据拆分建议”的部分,其中列出了使用唯一“测试集”(或验证集)的限制:
如前所述,针对单个独立测试集有一个强大的技术案例:
- 测试集是对模型的单一评估,并且对表征结果中的不确定性的能力有限。
- 按比例大的测试集将数据划分为增加表现估计偏差的方式。
- 样本量小:
- 模型可能需要每个可能的数据点来充分确定模型值。
- 测试集的不确定性可能相当大,以至于不同的测试集可能产生非常不同的结果。
- 重采样方法可以合理预测模型在未来样本上的表现。
- Max Kuhn 和 Kjell Johnson,第 78 页, Applied Predictive Modeling ,2013
由于表现估计的理想低偏差和方差特性,他们继续推荐使用 10 倍交叉验证的小样本量。在比较模型表现的情况下,他们建议使用自举法,因为表现估计的方差很小。
对于较大的样本量,他们再次建议采用 10 倍交叉验证方法。
验证和测试数据集消失
在现代应用机器学习中,您很可能不会看到对训练,验证和测试数据集的引用。
如果从业者选择使用与训练数据集的 k 折交叉验证来调整模型超参数,则对“验证数据集”的引用消失。
我们可以使用伪代码草图使这个具体如下:
# split data
data = ...
train, test = split(data)
# tune model hyperparameters
parameters = ...
k = ...
for params in parameters:
skills = list()
for i in k:
fold_train, fold_val = cv_split(i, k, train)
model = fit(fold_train, params)
skill_estimate = evaluate(model, fold_val)
skills.append(skill_estimate)
skill = summarize(skills)
# evaluate final model for comparison with other models
model = fit(train)
skill = evaluate(model, test)
如果使用训练数据集的模型超参数的交叉验证嵌套在模型的更广泛的交叉验证中,则对“测试数据集”的引用也可能消失。
最终,您剩下的就是来自域的数据样本,我们可能会继续将其称为训练数据集。
进一步阅读
如果您要深入了解,本节将提供有关该主题的更多资源。
- 维基百科上的测试集
- 主题:人口,样本,训练集,设计集,验证集和测试集是什么? 神经网络常见问题解答
- 统计学习简介:应用于 R ,2013
- Applied Predictive Modeling ,2013
- 人工智能:现代方法,2009
- 模式识别和神经网络,1996
你知道关于这个主题的任何其他好资源吗?请在下面的评论中告诉我。
摘要
在本教程中,您发现围绕术语“验证数据集”和“测试数据集”存在很多混淆,以及在评估您自己的机器学习模型的技能时如何正确导航这些术语。
具体来说,你学到了:
- 在评估模型时,“训练数据集”,“验证数据集”和“测试数据集”指的是明确的先例。
- “验证数据集”主要用于描述调整超参数和数据准备时的模型评估,“测试数据集”主要用于描述最终调整模型在与其他最终模型进行比较时的评估。
- 当采用 k-fold 交叉验证等替代重采样方法时,“验证数据集”和“测试数据集”的概念可能会消失,尤其是在重采样方法嵌套时。
你有任何问题吗?
在下面的评论中提出您的问题,我会尽力回答。
为什么机器学习每次得到的结果都不一样?
原文:https://machinelearningmastery.com/different-results-each-time-in-machine-learning/
最后更新于 2020 年 8 月 27 日
你的机器学习算法是否得到了不同的结果?
也许你的结果不同于教程,你想知道为什么。
也许你的模型在每次训练时都会做出不同的预测,即使每次都是在相同的数据集上训练。
这是意料之中的,甚至可能是算法的一个特征,而不是一个错误。
在本教程中,您将发现为什么在使用机器学习算法时会期望不同的结果。
完成本教程后,您将知道:
- 如果训练数据集发生变化,机器学习算法将训练不同的模型。
- 随机机器学习算法在学习过程中使用随机性,确保每次运行都训练不同的模型。
- 开发环境的差异,如软件版本和中央处理器类型,会导致预测和模型评估中的舍入误差差异。
我们开始吧。
为什么我每次在机器学习中都得到不同的结果?
图片由邦妮·莫兰提供,版权所有。
教程概述
本教程分为五个部分;它们是:
- 救命,我得到了不同的结果!?
- 训练数据引起的差异
- 学习算法引起的差异
- 评估程序引起的差异
- 平台导致的差异
1.救命,我得到了不同的结果!?
别慌。机器学习算法或模型可以给出不同的结果。
不是你的错。事实上,它通常是一个特性,而不是一个 bug。
我们会明确说明和解释你的问题。
首先,让我们掌握基本知识。
在应用机器学习中,我们在数据集上运行机器学习“算法,得到机器学习“模型”然后,可以对训练期间未使用的数据或用于对新数据进行预测的数据(也是训练期间未看到的数据)评估该模型。
- 算法:对产生模型的数据运行的程序(例如训练或学习)。
- 模型:用于对数据进行预测的数据结构和系数。
有关机器学习算法和模型之间区别的更多信息,请参见教程:
监督机器学习意味着我们有输入和输出变量(列)的例子(行)。我们不能编写代码来预测给定输入的输出,因为这太难了,所以我们使用机器学习算法来学习如何从给定历史示例的输入中预测输出。
这被称为函数近似,我们正在学习或搜索一个函数,该函数在我们的特定预测任务上将输入映射到输出,以使其具有技能,这意味着映射的表现优于随机的,理想情况下优于我们尝试过的所有其他算法和算法配置。
- 监督学习:自动学习从输入示例到输出示例的映射函数。
从这个意义上说,机器学习模型是我们打算用于某个项目或应用的程序;碰巧的是,这个程序是从例子中学习的(使用一种算法),而不是用 if 语句等显式编写的。这是一种自动编程。
- 机器学习模型:一个“程序”自动从历史数据中学习。
与我们可能习惯的编程不同,这些程序可能不是完全确定的。
每次训练机器学习模型时,它们可能是不同的。反过来,模型可能会做出不同的预测,并且在评估时,可能会有不同程度的误差或准确性。
至少有四种情况你会得到不同的结果;它们是:
- 不同的结果是因为训练数据的不同。
- 不同的结果是因为随机学习算法。
- 不同的结果是因为随机评估程序。
- 因为平台不同,结果也不同。
让我们依次仔细看看每一个。
我是否遗漏了导致结果差异的可能原因?
在下面的评论里告诉我。
2.训练数据引起的差异
在不同的数据上运行相同的算法,会得到不同的结果。
这被称为机器学习算法的方差。你可能在偏差-方差权衡的背景下听说过它。
方差是衡量算法对训练过程中使用的特定数据的敏感度。
- 方差:算法对训练时使用的具体数据有多敏感。
更敏感的算法具有更大的方差,这将导致模型中更大的差异,进而导致模型的预测和评估。相反,不太敏感的算法具有较小的方差,并且将导致具有不同训练数据的结果模型中的较小差异,并且反过来,导致结果预测和模型评估中的较小差异。
- 高方差:算法对训练时使用的具体数据更加敏感。
- 低方差:算法对训练时使用的具体数据不太敏感。
有关方差和偏差-方差权衡的更多信息,请参见教程:
所有有用的机器学习算法都会有一些方差,一些最有效的算法也会有很高的方差。
与方差较小的算法相比,方差较大的算法通常需要更多的训练数据。如果我们考虑从输入和输出近似映射函数的模型和大数定律,这是直观的。
然而,当你在不同的训练数据上训练机器学习算法时,你会得到一个不同的模型,它有不同的行为。这意味着不同的训练数据将给出做出不同预测的模型,并具有不同的表现估计(例如误差或准确性)。
结果的差异程度将与每个模型的训练数据的差异程度以及您选择的特定模型和模型配置的差异有关。
我该怎么办?
您通常可以通过更改算法的超参数来减少模型的方差。
例如, k 中的k-最近邻控制算法的方差,其中像 k=1 这样的小值导致高方差,像 k=21 这样的大值导致低方差。
您可以通过更改算法来减少方差。例如,像线性回归和逻辑回归这样更简单的算法比其他类型的算法具有更低的方差。
您也可以通过增加训练数据集的大小来降低高方差算法的方差,这意味着您可能需要收集更多的数据。
3.学习算法引起的差异
由于学习算法的性质,当您对相同的数据运行相同的算法时,可能会得到不同的结果。
这很可能是你阅读本教程的原因。
你在同一个数据集上运行相同的代码,得到的模型每次都做出不同的预测或者有不同的表现,你认为这是一个 bug 什么的。 ***我说的对吗?*T3】
这不是 bug,这是特性。
一些机器学习算法是确定性的。就像你习惯的编程一样。这意味着,当算法被赋予相同的数据集时,它每次都学习相同的模型。一个例子是线性回归或逻辑回归算法。
有些算法是不确定的;相反,它们是随机的。这意味着他们的行为包含了随机性的元素。
随机不代表随机。随机机器学习算法不是学习随机模型。他们正在学习一个以你提供的历史数据为条件的模型。相反,算法在学习过程中做出的具体小决策可以随机变化。
其影响是,每次随机机器学习算法在相同的数据上运行时,它都会学习到稍微不同的模型。反过来,模型可能会做出稍微不同的预测,并且当使用误差或准确性进行评估时,可能会有稍微不同的表现。
有关随机及其在机器学习中的意义的更多信息,请参见教程:
给算法做出的一些决策增加随机性可以提高解决难题的表现。用域中有限的数据样本学习监督学习映射函数是一个非常困难的问题。
为数据集找到一个好的或最好的映射函数是一种搜索问题。我们测试定义搜索空间形状的不同算法和测试算法配置,并在搜索空间中给我们一个起点。然后,我们运行算法,然后将搜索空间导航到单个模型。
添加随机性可以帮助避免好的解决方案,并帮助在搜索空间中找到真正好的和伟大的解决方案。它们允许模型避开局部最优或欺骗性的局部最优(学习算法可能会遇到这种情况),并帮助找到更好的解决方案,甚至全局最优。
有关将监督学习视为搜索问题的更多信息,请参见教程:
在学习过程中使用随机性的算法的一个例子是神经网络。它以两种方式使用随机性:
- 随机初始权重(模型系数)。
- 每个时期的随机抽样。
神经网络(深度学习)是一种随机机器学习算法。随机初始权重允许模型在每次算法运行时尝试从搜索空间的不同起点进行学习,并允许学习算法在学习过程中“T0”打破对称性。训练期间示例的随机混洗确保每个梯度估计和权重更新略有不同。
有关神经网络随机特性的更多信息,请参见教程:
另一个例子是随机的集成机器学习算法,例如 bagging。
随机性用于训练数据集的采样过程,以确保为集合中的每个贡献成员准备不同的决策树。在集成学习中,这被称为集成多样性,是一种从单个训练数据集模拟独立预测的方法。
有关打包集合的随机性质的更多信息,请参见教程:
我该怎么办?
学习算法使用的随机性是可以控制的。
例如,您设置伪随机数发生器使用的种子,以确保每次运行算法时,它都获得相同的随机性。
有关随机数生成器和设置固定种子的更多信息,请参见教程:
这可能是教程的一个好方法,但在实践中不是一个好方法。它会引发这样的问题:
- 伪随机数发生器的最佳种子是什么?
随机机器学习算法没有最佳种子。你在对抗算法的本质,迫使随机学习成为确定性的。
您可以使用一个固定的种子来证明最终模型是合适的,以确保在进行任何部署前系统测试之前,在生产中使用相同的数据创建相同的模型。然而,一旦训练数据集改变,模型就会改变。
更好的方法是接受机器学习算法的随机特性。
考虑到您的数据集没有单一的模型。相反,有一个随机过程(算法管道)可以为您的问题生成模型。
有关这方面的更多信息,请参见教程:
然后,您可以将这些模型(算法管道)的表现总结为具有平均预期误差或精确率以及标准偏差的分布。
然后,您可以通过在数据集上拟合多个最终模型,并在需要对新数据进行预测时对它们的预测进行平均,来确保实现模型的平均表现。
有关最终模型的集成方法的更多信息,请参见教程:
4.评估程序引起的差异
由于评估过程,在使用相同数据运行相同算法时,您可能会得到不同的结果。
两种最常见的评估程序是列车测试分割和 k 倍交叉验证。
一个训练-测试分割包括随机分配用于训练模型或评估模型以满足预定义的训练或测试集大小的行。
有关列车测试分割的更多信息,请参见教程:
k 折叠交叉验证过程包括将数据集划分为 k 个不重叠的分区,并将一个折叠用作测试集,将所有其他折叠用作训练集。模型适合训练集,并在保持折叠上进行评估,此过程重复 k 次,使每个折叠都有机会用作保持折叠。
有关 k-fold 交叉验证的更多信息,请参见教程:
这两种模型评估程序都是随机的。
同样,这并不意味着它们是随机的;这意味着在这个过程中做出的小决定包含随机性。具体来说,选择将哪些行分配给给定的数据子集。
这种随机性的使用是一个特性,而不是一个 bug。
在这种情况下,随机性的使用允许重采样近似模型表现的估计,该估计独立于从域中提取的特定数据样本。这种近似是有偏差的,因为我们只有一小部分数据样本,而不是全部可能的观测值。
当对训练期间未看到的数据进行领域预测时,表现估计提供了模型的预期或平均能力的概念。不考虑用于训练或测试模型的特定数据行,至少在理想情况下是这样。
有关更一般的统计抽样主题的更多信息,请参见教程:
因此,确定性机器学习算法的每个评估,像线性回归或逻辑回归,可以给出不同的误差或精确率估计。
我该怎么办?
这种情况下的解决方案很像随机学习算法的情况。
伪随机数发生器的种子可以是固定的,或者可以包含过程的随机性。
与随机学习算法不同,两种解决方案都相当合理。
如果在预测建模任务中系统地评估大量机器学习算法和算法配置,修复评估过程的随机种子可能是一个好主意。任何价值都行。
其思想是,每个候选解决方案(每个算法或配置)将以相同的方式进行评估。这确保了苹果对苹果的比较。如果需要,它还允许以后使用成对的统计假设检验来检查算法之间的差异是否具有统计学意义。
拥抱随机性也是合适的。这包括多次重复评估程序,并报告绩效分数分布的摘要,如平均值和标准偏差。
也许重复评估中偏差最小的方法是使用重复的 k 倍交叉验证,例如三次重复 10 倍(3×10),这很常见,或者五次重复两次(5×2),这在比较算法和统计假设检验时很常用。
有关使用统计假设检验来比较算法的简单介绍,请参见教程:
有关比较平均算法表现和假设检验的教程,请参见教程:
5.平台导致的差异
在不同的计算机上对相同的数据运行相同的算法时,可以得到不同的结果。
即使您固定随机数种子来解决学习算法和评估过程的随机性质,这也可能发生。
这种情况下的原因是用于运行示例的平台或开发环境,结果通常会有细微的不同,但并不总是如此。
这包括:
- 系统架构的差异,例如 CPU 或 GPU。
- 操作系统的差异,如 MacOS 或 Linux。
- 基础数学库的差异,例如 LAPACK 或 BLAS。
- Python 版本的差异,例如 3.6 或 3.7。
- 库版本的差异,例如 Sklearn 0.22 或 0.23。
- …
机器学习算法是一种数值计算。
这意味着它们通常涉及大量浮点值的数学运算。体系结构和操作系统等方面的差异可能会导致舍入误差的差异,这可能会与执行的计算数量相加,从而产生非常不同的结果。
此外,库版本的差异可能意味着错误的修复和功能的改变,这也会导致不同的结果。
此外,这也解释了为什么在由不同语言(如 R 和 Python)实现的同一台机器上,相同的算法会得到不同的结果。实现中的微小差异和/或使用的底层数学库的差异将导致最终模型和该模型所做预测的差异。
我该怎么办?
这并不意味着平台本身可以被视为一个超参数,并针对预测建模问题进行调整。
相反,这意味着在评估机器学习算法时,平台是一个重要因素,并且应该是固定的或完全描述的,以确保从开发到生产或在学术研究中报告表现时的完全再现性。
一种方法可能是使用虚拟化,如 docker 或虚拟机实例,以确保环境保持不变,如果完全再现性对项目至关重要的话。
老实说,在实践中,只要主要软件版本足够好或足够接近,效果往往很小(至少在我有限的经验中是这样)。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
相关教程
- 机器学习中算法和模型的区别
- 机器学习中偏差-方差权衡的温和介绍
- 随机在机器学习中意味着什么?
- 作为搜索问题的应用机器学习的温和介绍
- 为什么用随机权重初始化神经网络?
- 如何用 Python 开发打包套装
- 如何减少最终机器学习模型中的方差
- Python 机器学习随机数生成器介绍
- 统计采样和重采样的简单介绍
- 用于比较机器学习算法的统计显著性测试
摘要
在本教程中,您发现了为什么在使用机器学习算法时会出现不同的结果。
具体来说,您了解到:
- 如果训练数据集发生变化,机器学习算法将训练不同的模型。
- 随机机器学习算法在学习过程中使用随机性,确保每次运行都训练不同的模型。
- 开发环境的差异,如软件版本和中央处理器类型,会导致预测和模型评估中的舍入误差差异。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
探索特征工程,如何设计特征以及如何获得它
特征工程是一个非正式的主题,但绝对众所周知并且同意成为应用机器学习成功的关键。
在创建本指南的过程中,我进行了广泛深入的研究,并综合了所有可能的材料。
您将发现什么是特征工程,它解决了什么问题,重要的原因,如何设计功能,谁做得好以及您可以去哪里学习更多并擅长它。
如果您阅读一篇关于特征工程的文章,我希望它是这一篇。
特征工程是另一个主题,似乎不值得任何评论论文或书籍,甚至书籍章节,但它对 ML 的成功绝对至关重要。 […]机器学习的大部分成功实际上是学习器可以理解的工程特征的成功。
- Scott Locklin,“被忽视的机器学习思路”
特征工程解决的问题
特征工程很难。
摄影: Vik Nanda ,保留一些权利
当您的目标是从预测模型中获得最佳结果时,您需要从所拥有的内容中获得最大收益。
这包括从您使用的算法中获得最佳结果。它还涉及充分利用您的算法使用的数据。
如何充分利用数据做出预测性建模?
这是特征工程的过程和实践解决的问题。
实际上,所有机器学习算法的成功取决于您呈现数据的方式。
- Mohammad Pezeshki,回答“每个数据科学家应该知道的关于特征选择和工程的一些一般技巧是什么? “
特征工程的重要性
数据中的功能将直接影响您使用的预测模型以及您可以实现的结果。
您可以这样说:您准备和选择的功能越多,您获得的结果就越好。这是事实,但也有误导性。
您获得的结果是您选择的模型,您可用的数据和您准备的功能的一个因素。即使你对问题的框架和你用来估计准确率的客观措施起了作用。您的结果取决于许多相互依赖的属性。
您需要很好的功能来描述数据中固有的结构。
更好的功能意味着灵活性。
您可以选择“错误的模型”(低于最佳模型)并仍然可以获得良好的结果。大多数模型可以在数据中获得良好的结构。良好功能的灵活性允许您使用运行速度更快,更易于理解且更易于维护的不太复杂的模型。这是非常理想的。
更好的功能意味着更简单的模型。
凭借精心设计的功能,您可以选择“错误的参数”(低于最佳值)并仍然获得良好的结果,原因大致相同。您不需要努力选择正确的模型和最优化的参数。
通过良好的功能,您可以更接近底层问题,并可以表示您可用的所有数据,并可用于最好地表征潜在问题。
更好的功能意味着更好的结果。
我们使用的算法对于 Kagglers 来说非常标准。 […]我们将大部分精力投入到功能工程中。
- Xavier Conort,在“ Q& A 与 Xavier Conort ”上赢得了对 Kaggle 的 Flight Quest 挑战
什么是特色工程?
以下是我定义特征工程的方法:
特征工程是将原始数据转换为更能代表预测模型的基础问题的特征的过程,从而提高了对看不见的数据的模型准确率。
您可以在此定义中查看依赖项:
- 您选择的绩效指标(RMSE?AUC?)
- 问题的框架(分类?回归?)
- 你正在使用的预测模型(SVM?)
- 您选择和准备的原始数据(样本?格式化?清洁?)
特征工程是手动设计输入 x 应该是什么
- Tomasz Malisiewicz,回答“什么是特征工程? “
特征工程是一个表示问题
机器学习算法从样本数据中学习问题的解决方案。
在此上下文中,特征工程要求:学习问题解决方案的样本数据的最佳表示是什么?
它太深了。在机器学习方面做得很好,即使在人工智能方面,也可以回到表示问题。知道要使用的最佳表示,_ 先验 _,这可能是不可知的(或者至多是难以处理的)。
你必须把你的输入变成算法可以理解的东西
- Shayne Miel,回答“机器学习中特征工程的直观解释是什么? “
特色工程是一门艺术
这是一门艺术,就像工程学是一门艺术,就像编程是一门艺术,就像医学是一门艺术。
有明确定义的程序是有条理的,可证明的和理解的。
数据是变量,每次都不同。通过练习,您可以擅长决定使用哪些程序以及何时使用。通过实证学徒制。就像工程学一样,像编程一样,就像医学,就像机器学习一般。
对特征工程的掌握伴随着实践,并且研究其他正在做得好的人正在练习。
…一些机器学习项目成功,有些失败。有什么区别?很容易,最重要的因素是使用的功能。
- Pedro Domingos,“关于机器学习的一些有用的事情”(PDF)
特征工程的子问题
将特征工程视为一件事是很常见的。
例如,对我来说很长一段时间,特征工程是特征构造。
我想我自己“_ 我现在正在进行特征工程 ”并且我会追问“ 我如何分解或聚合原始数据以更好地描述潜在问题?_ “目标是正确的,但这种做法是其中之一。
在本节中,我们将介绍这些方法以及它们要解决的具体子问题。每个都可以是他们自己的深度文章,因为它们是实践和研究的重要和重要领域。
功能:对建模任务有用的属性
让我们从数据开始,什么是特征。
表格数据是根据观察或由变量或属性(列)组成的实例(行)来描述的。属性可以是一个功能。
与属性分离的特征的概念在问题的上下文中更有意义。功能是对您的问题有用或有意义的属性。它是了解正在建模的问题结构的观察的重要部分。
我使用“_ 有意义的 _”来区分属性和属性。有些人可能没有。我认为没有一个没有意义的功能。如果某个功能对问题没有影响,则不是问题的一部分。
在计算机视觉中,图像是观察,但是特征可以是图像中的线。在自然语言处理中,文档或推文可以是观察,并且短语或单词计数可以是特征。在语音识别中,话语可以是观察,但是特征可以是单个单词或音素。
特征重要性:对特征有用性的估计
您可以客观地估计要素的有用性。
这可以作为选择要素的前提。功能分配分数,然后可以按其分数进行排名。可以选择具有最高分数的那些特征以包括在训练数据集中,而可以忽略那些剩余的特征。
功能重要性分数还可以为您提供可用于提取或构建新功能的信息,这些功能与估计有用的功能类似但不同。
如果特征与因变量(被预测的事物)高度相关,则该特征可能是重要的。相关系数和其他单变量(每个属性被独立考虑)方法是常用方法。
更复杂的预测性建模算法在构建模型时在内部执行特征重要性和选择。一些例子包括 MARS, Random Forest 和 Gradient Boosted Machines。这些模型还可以报告在模型准备过程中确定的变量重要性。
特征提取:从原始数据自动构建新特征
一些观察结果在其原始状态下过于庞大,无法直接通过预测性建模算法进行建模。
常见的例子包括图像,音频和文本数据,但可以很容易地包含具有数百万属性的表格数据。
特征提取是一个将这些类型的观察的维度自动降低为可以建模的更小集合的过程。
对于表格数据,这可能包括主成分分析和无监督聚类方法等投影方法。对于图像数据,这可能包括线或边缘检测。根据域,图像,视频和音频观察结果适用于许多相同类型的 DSP 方法。
特征提取的关键是方法是自动的(尽管可能需要用更简单的方法设计和构造)并解决难以管理的高维数据的问题,最常用于以数字格式存储的模拟观测。
功能选择:从许多功能到一些有用的功能
并非所有功能都是平等的。
需要删除与问题无关的那些属性。对于模型的准确率,将会有一些功能比其他功能更重要。在其他功能的上下文中还将存在多余的功能。
功能选择通过自动选择对问题最有用的子集来解决这些问题。
特征选择算法可以使用评分方法来排序和选择特征,例如相关性或其他特征重要性方法。
更高级的方法可以通过反复试验来搜索特征子集,自动创建和评估模型以追求客观上最具预测性的子特征组。
还有一些方法可以烘焙特征选择或将其作为模型的副作用。逐步回归是一种算法的示例,该算法自动执行特征选择,作为模型构建过程的一部分。
像 LASSO 和岭回归这样的正则化方法也可以被认为是具有特征选择的算法,因为它们积极地寻求去除或折扣特征的贡献作为模型构建过程的一部分。
在帖子中阅读更多内容:功能选择简介。
特征构造:从原始数据手动构建新特征
最好的结果归结于你,从业者,制作功能。
功能重要性和选择可以告诉您功能的客观效用,但这些功能必须来自某个地方。
您需要手动创建它们。这需要花费大量时间来处理实际样本数据(而不是聚合),并考虑问题的基本形式,数据结构以及如何最好地将它们暴露给预测性建模算法。
对于表格数据,它通常意味着聚合或组合功能以创建新功能,分解或拆分功能以创建新功能。
对于文本数据,它通常意味着设计与问题相关的文档或上下文特定指标。对于图像数据,它通常意味着大量的时间规定自动过滤器来挑选相关结构。
这是特征工程的一部分,经常被作为一种艺术形式进行讨论,这一部分归功于重要性,并标志着它是机器学习竞赛的差异化因素。
它是手动的,它很慢,它需要大量的人脑力量,它会产生很大的不同。
特征工程和特征选择不是互斥的。它们都很有用。我会说功能工程更重要,特别是因为你不能真正自动化它。
- 罗伯特·诺伊豪斯,回答“你认为哪些能提高准确率,功能选择还是特征工程? “
特征学习:自动识别和使用原始数据中的特征
我们是否可以避免手动加载规定如何从原始数据构造或提取特征?
表示学习或特征学习是朝着这个目标努力的方向。
现代深度学习方法在该领域取得了一些成功,例如自编码器和受限制的玻尔兹曼机器。它们已经被证明是自动的,并且以无监督或半监督的方式,学习特征的抽象表示(压缩形式),这反过来又支持了诸如语音识别,图像分类等领域的最新结果。物体识别和其他领域。
我们没有自动特征提取或构造,但我们可能永远不会有自动特征工程。
抽象表示是自动准备的,但除了以黑盒方式之外,您无法理解和利用所学知识。他们不能(但是,或者很容易)告知您和过程如何创建更多相似和不同的功能,例如那些表现良好,未来某个特定问题或类似问题的功能。获得的技能被困。
然而,它是令人着迷,令人兴奋的,也是功能工程的一个重要而现代的部分。
特征工程过程
在更广泛的应用机器学习过程中最好地理解特征工程。
你需要这个背景。
机器学习的过程
应用机器学习的过程(缺乏更好的名称)在广泛的刷子意义上涉及许多活动。前面是问题定义,接下来是数据选择和准备,中间是模型准备,评估和调整,最后是结果的呈现。
像数据挖掘和 KDD 这样的过程描述有助于更好地理解任务和子任务。您可以按照自己喜欢的方式挑选和选择流程。 在之前我已经谈了很多这个。
与我们关于特征工程的讨论相关的图片是此过程的前端。它可能类似于以下内容:
- (此前的任务…)
- 选择数据:整合数据,将其去标准化为数据集,一起收集。
- 预处理数据:对其进行格式化,清理,对其进行采样,以便您可以使用它。
- 转换数据:_ 特征工程师在这里发生 _。
- 模型数据:创建模型,评估它们并调整它们。
- (此后的任务…)
将“_ 转换数据 _”从原始状态转换为适合建模的状态的传统观念是特征工程适用的地方。转换数据和特征工程实际上可能是同义词。
这张照片在某些方面有所帮助。
您可以看到,在特征工程之前,我们正在将数据转换为我们甚至可以查看的格式,就在此之前,我们正在将数据从数据库整理和非规范化为某种中心图像。
当我们确定数据的新观点时,我们可以而且应该回过头来完成这些步骤。
例如,我们可能有一个属性,即聚合字段,如总和。我们可能决定创建特征来描述按时间间隔(例如季节)的数量,而不是一笔总和。我们需要通过预处理,甚至选择数据来向后退一步,以获取对“真实原始数据”的访问并创建此功能。
我们可以看到特征工程之后是建模。
它暗示了与建模的强烈互动,提醒我们设计功能的相互作用,并根据我们的测试工具和最终表现测量的表面进行测试。
这也表明我们可能需要以适合所选建模算法的形式保留数据,例如将特征标准化或标准化作为最后一步。这听起来像是一个预处理步骤,它可能是,但它有助于我们在有效建模之前考虑数据需要哪些类型的最后润色。
特征工程的迭代过程
了解特征工程在应用机器学习过程的上下文中的位置突出表明它不是独立的。
这是一个迭代过程,一次又一次地与数据选择和模型评估相互作用,直到我们的问题耗尽时间。
该过程可能如下所示:
- 头脑风暴功能:真正深入研究问题,查看大量数据,研究其他问题的特征工程,看看你能偷什么。
- 设计功能:取决于您的问题,但您可以使用自动特征提取,手动功能构建和两者的混合。
- 选择功能:使用不同的功能重要性评分和功能选择方法为模型准备一个或多个“视图”以进行操作。
- 评估模型:使用所选特征估算未见数据的模型准确率。
您需要一个明确定义的问题,以便您知道何时停止此过程并继续尝试其他模型,其他模型配置,模型集合等。一旦你对想法或准确度增加达到稳定水平,那么后来在管道中就会有所收获。
您需要经过深思熟虑和设计的测试工具,以客观地估计看不见的数据的模型技能。这将是您对功能工程流程的唯一衡量标准,您必须相信它不要浪费您的时间。
特征工程的一般例子
让我们使特征工程的概念更具体。
在本节中,我们将考虑您可能在 Excel 电子表格中使用的表格数据。我们将看一些您可能想要考虑自己的问题的手动功能构建示例。
当我听到“_ 特征工程至关重要 _”时,这就是我想到的特征工程类型。这是我熟悉和实践的最常见的形式。
哪个最好?你事前无法知道。您必须尝试它们并评估结果以实现您的算法和表现测量。
分解分类属性
想象一下你有一个分类属性,比如“Item_Color
”可以是Red
,Blue
或Unknown
。
_ 未知 _ 可能很特别,但对于模型来说,它看起来只是另一种颜色选择。更好地公开这些信息可能是有益的。
您可以创建一个名为“Has_Color
”的新二进制功能,并在项目有颜色时为其分配值“1
”,当“0
”时颜色未知。
更进一步,您可以为Item_Color
具有的每个值创建二进制功能。这将是三个二进制属性:Is_Red
,Is_Blue
和Is_Unknown
。
可以使用这些附加功能代替Item_Color
功能(如果您想尝试更简单的线性模型)或者除此之外(如果您想从决策树中获得更多功能)。
分解日期时间
日期时间包含很多信息,模型很难利用它的原生形式,例如 ISO 8601 (即 2014-09-20T20:45:40Z)。
如果您怀疑时间与其他属性之间存在关系,则可以将日期时间分解为可能允许模型发现和利用这些关系的组成部分。
例如,您可能怀疑时间与其他属性之间存在关系。
您可以创建一个名为Hour_of_Day
的新数字特征,该小时可能有助于回归模型。
您可以使用 4 个值Morning
,Midday
,Afternoon
,Night
创建名为Part_Of_Day
的新序数功能你认为相关的小时边界。这可能对决策树有用。
您可以使用类似的方法来选择一周中的时间关系,一个月的时间关系以及一年中各种季节性结构。
日期时间结构丰富,如果您怀疑数据存在时间依赖性,请花点时间将其取出。
重构数值量
您的数据很可能包含数量,可以重新定义以更好地暴露相关结构。这可以是转换为新单元或将速率分解为时间和数量的组件。
您可能拥有重量,距离或时间等数量。线性变换对于回归和其他依赖于尺度的方法可能是有用的。
例如,您可以以克为单位Item_Weight
,其值为 6289.您可以创建一个新的要素,其中此数量(公斤)为 6.289 或舍入公斤(如 6)。如果域名是运输数据,可能是公斤Item_Weight
的精度足够或更有用(噪音更小)。
Item_Weight
可以分为两个特征:Item_Weight_Kilograms
和Item_Weight_Remainder_Grams
,示例值分别为 6 和 289。
可能存在领域知识,即权重大于 4 的项目会产生更高的税率。该魔术域号可用于创建新的二进制特征Item_Above_4kg
,其值为“1
”,我们的示例为 6289 克。
您还可以将数量存储为间隔的费率或总数量。例如,Num_Customer_Purchases
汇总了一年。
在这种情况下,您可能希望返回数据收集步骤并创建除此聚合之外的新功能,并尝试在购买中公开更多时间结构,例如季节性。例如,可以创建以下新的二进制特征:Purchases_Summer
,Purchases_Fall
,Purchases_Winter
和Purchases_Spring
。
特征工程的具体例子
研究特征工程示例的一个好地方是机器学习竞赛的结果。
比赛通常使用来自现实世界问题领域的数据。在比赛结束时需要记录方法和方法。这些文章为有效的现实世界机器学习过程和方法提供了宝贵的见解。
在本节中,我们将介绍几个关注特征工程的有趣且值得注意的赛后写作示例。
预测 2010 年 KDD 杯的学生考试成绩
KDD 杯是每年为知识发现和数据挖掘会议的 ACM 特别兴趣小组的与会者举办的机器学习竞赛。
2010 年,比赛的重点是对学生的学习方式进行建模。提供了一个关于代数问题的学生语料库,用于预测学生未来的表现。
比赛的获胜者是国立台湾大学的一群学生和学者。他们的方法在论文“特征工程和 KDD 杯 2010 分类器集合”中有所描述。
本文将特色工程作为获胜的关键方法。特征工程以创建数百万个二进制特征为代价简化了问题的结构。简单的结构使团队能够使用高表现但非常简单的线性方法来实现获胜的预测模型。
本文详细介绍了问题结构中特定的时间和其他非线性如何简化为简单的复合二元指标。
这是简单属性分解可能实现的极端和有益的例子。
预测遗产健康奖的患者准入
遗产健康奖获得了 300 万美元的奖金,该奖项可以最好地预测哪些患者将在明年入院。
该奖项每年都会获得里程碑奖,其中顶级团队将获得奖项,其流程和方法将公开。
我记得读过三个里程碑中的第一个发布的论文,并对所涉及的特征工程的数量印象深刻。
具体来说,菲尔·布里尔利,大卫沃格尔和兰迪阿克塞尔罗德的论文“第 1 轮里程碑奖:我们如何做到 - 团队市场创造者”。大多数竞赛都涉及大量的特征工程,但令我印象深刻的是这篇论文的重点。
本文提供了构造属性所需的属性和 SQL 表。
本文通过简单分解给出了一些很好的现实世界的特征工程实例。有很多计数,分钟,最大值,大量二进制属性和离散化的数字属性。非常简单的方法用于很好的效果。
更多关于特征工程的资源
我们在本文中介绍了很多内容,并希望您对功能工程是什么,它适合哪些以及如何实现这一功能有了更多的了解。
这真的是你旅程的开始。您需要练习特征工程,并且需要学习优秀的特征工程从业者。
本节提供了一些可能对您的旅程有所帮助的资源。
图书
我找不到关于这个主题的任何书籍或书籍章节。
然而,有一些关于特征提取的好书。如果您正在使用模拟观察的数字表示,如图像,视频,声音或文本,您可能希望深入了解一些特征提取文献。
还有很多关于特色选择的书籍。如果您正在努力通过删除冗余或不相关的功能来减少功能,请深入了解功能选择。
论文和幻灯片
找到论文是一个难题。
同样,有很多关于特征提取和特征选择书籍章节的论文,但功能工程并不多。特征工程也具有软件工程的意义,与我们的讨论无关。
以下是一些普遍相关的论文:
以下是一些通常相关且有趣的幻灯片:
- 特色工程(PDF),知识发现和数据挖掘 1,作者:Roman Kern,知识技术研究所
- 特色工程与选择(PDF),CS 294:实用机器学习,伯克利
- 特色工程工作室,课程讲座幻灯片和材料,哥伦比亚
- 特色工程(PDF),Leon Bottou,Princeton
链接
有博客帖子到处都有。最有用的链接是解决问题的教程,并清楚地表达了有意的特征工程。
以下是一些有趣的链接:
- 特色工程:如何在泰坦尼克号竞赛(Kaggle 的入门竞赛)上进行特色工程。有比特征工程更多的数据,但它仍然具有指导意义。
IPython 笔记本由 Guibing Guo ,致力于解释特征工程。有点乱,但值得一撇。 (链接看起来很糟糕,对不起。)
影片
关于特征工程的主题有几个视频。迄今为止最好的是由 Ryan Baker 命名为“特征工程”。它很短(大约 9 分钟),我建议观看一些很好的实用技巧。
<iframe allow=“autoplay; encrypted-media” allowfullscreen=“” frameborder=“0” height=“281” src=“https://www.youtube.com/embed/drUToKxEAUA?feature=oembed” width=“500”></iframe>
如果您认为我错过了一个关键概念或资源,请发表评论。
更新 2015 :我注意到现在有一篇关于特色工程的维基百科文章,它复制了这篇文章的大部分内容。那好吧。
如何开始使用 Kaggle
入门和擅长
机器学习竞赛的四步流程。
Kaggle 是一个托管机器学习竞赛的社区和网站。
有竞争力的机器学习可以成为开发和练习技能的好方法,也可以展示您的能力。
在这篇文章中,您将发现一个简单的 4 步骤过程,以便在 Kaggle 上进行有竞争力的机器学习。
让我们开始吧。
如何开始使用 Kaggle
照片由 David Mulder 拍摄,保留一些权利。
关于 Kaggle 的建议?
我通过电子邮件询问了很多问题:
我如何开始使用 Kaggle?
我对这个问题做了最后的回答,并决定把它变成这篇博文。我希望你发现它很有用。
希望对你有帮助。
为什么 Kaggle?
有许多方法可以学习和练习应用机器学习。
Kaggle 有一些特别的好处,你应该认真考虑:
- 问题已明确定义,所有可用数据均直接提供。
- 考虑到公共和私人排行榜的严酷事实,用一个糟糕的测试设置来欺骗自己更难。
- 每个比赛都经常进行很好的讨论和分享,您可以从中学习并为此做出贡献。
- 您可以在可以展示您的技能的困难的真实世界数据集上构建项目组合。
- 这是一个完整的精英管理,提供能力和技能是决定因素,而不是你去学校的地方,你知道的数学,或你有多少学位。
概观
我推荐一个简单的 4 步骤过程。步骤是:
- 选择一个平台。
- 练习标准数据集。
- 练习旧的 Kaggle 问题。
- 在 Kaggle 上竞争。
该过程易于描述,但难以实现。这需要时间和精力。这将是艰苦的工作。
但…
它会得到回报,如果你有条不紊并且坚持下去,你将成为世界级的机器学习从业者。
你可以直接进入第 4 步,这可能适合你,但我设计了这个过程,以最大限度地提高你坚持下去并获得高于平均水平的结果。
让我们更详细地看一下每一步。
1.选择一个平台
有许多机器学习平台可供选择,你最终可能会使用其中许多,但从一开始。
我推荐 Python。
为什么?
- 对 Python 机器学习技能的需求正在增长。
- Python 是一种功能齐全的编程语言(与 R 不同)。
- 生态系统已经足够成熟(sklearn,pandas,statsmodels,xgboost 等)
- 该平台拥有一些最好的深度学习工具(theano,tensorflow,keras)
选择一个平台并开始学习如何使用它。
这里有一些进一步的阅读:
2.标准数据集的实践
选择平台后,您需要非常擅长在真实数据集上使用它。
我建议在 UCI 机器学习库或类似工具上完成一套标准的机器学习问题。
将每个数据集视为迷你竞争对手。
- 将其拆分为训练并保留测试集,将测试集拆分为公共和私人排行榜集。
- 概述了处理每个数据集的过程,坚持下去,添加到该数据集,直到您可以轻松获得要处理的任何小数据集的最佳结果。
- 将每个数据集的时间框设置为一个或几个小时。
- 利用数据集上和与数据集相关的出版物来帮助更好地定义给定问题并解释这些特征。
- 了解如何充分利用工具,算法以及数据集。
把这部分想象成演习。好起来
将项目作为项目组合的一部分,以利用您处理的每个新项目。
这里有一些进一步的阅读:
3.练习旧的 Kaggle 问题
现在您已经了解了工具以及如何使用它们,现在是时候练习旧的 Kaggle 数据集了。
您可以访问过去 Kaggle 比赛的数据集。您还可以发布候选解决方案,并在公共和私人排行榜上对其进行评估。
我建议在过去的几年中解决一系列 Kaggle 问题。
此步骤旨在帮助您了解最佳表现者如何处理机器学习竞赛并学习如何将他们的方法集成到您的流程中。
- 选择各种不同的问题类型,迫使您学习和应用新的和不同的技术。
- 研究论坛帖子,获胜者写作博客文章,GitHub 存储库以及问题的所有其他信息,并将这些方法合并到您的流程中。
- 目标是在公共或私人排行榜中获得前 10%或更高的分数。
- 尝试将尽可能多的获胜者方法纳入您的候选解决方案。
把它想象成先进的钻头。善于像竞争获胜者一样思考并使用他们的方法和工具。
再次,将每个已完成的项目添加到您的投资组合中,以利用未来的项
这里有一些进一步的阅读:
4.在 Kaggle 上竞争
你现在准备在 Kaggle 上竞争了。
得到它。
- 考虑一次处理一个问题,直到你出现问题或陷入困境。
- 旨在为您所处理的每个竞赛在私人排行榜上取得前 25%或前 10%的成绩。
- 在论坛上自由分享;这将导致合作。
- 最大限度地缩短阅读或思考好主意与实现之间的时间(例如分钟)。
玩得开心。
他们可能是比赛,但你参与学习和分享。
这里有一些进一步的阅读:
摘要
在这篇文章中,您发现了一个简单的 4 步过程,用于开始并在 Kaggle 上进行有竞争力的机器学习。
你参加过 Kaggle 比赛吗?
你是怎么开始的?
你决定按照这个过程吗?
你好吗?
超越预测
您使用预测模型进行的预测并不重要,而是使用那些重要的预测。
Jeremy Howard 是机器学习竞赛平台 Kaggle 的总裁兼首席科学家。 2012 年,他在 O’reilly Strata 会议上发表了他所谓的动力传动系统方法,用于构建超越预测的“_ 数据产品 _”。
在这篇文章中,您将发现 Howard 的动力传动系统方法以及如何使用它来构建系统的开发而不是做出预测。
动力传动系统方法
图片来自 O’Reilly ,保留所有权利
激励方法
在投资和加入公司之前,Jeremy Howard 是一位顶级的 Kaggle 参与者。在像数据科学运动的形成谈话中,您可以深入了解霍华德在深入挖掘数据和建立有效模型方面的敏锐能力。
在 2012 年的 Strata 演讲中,霍华德曾在 Kaggle 工作了一两年,并且看过很多比赛和很多竞争数据科学家。你不能不认为他更加全面的方法论是由于他对专注于预测及其准确率的沮丧而产生的。
预测是可访问的部分,它们是竞争的焦点是有道理的。我看到了他的动力传动系统方法,因为他放下了手套,并挑战社区以争取更多。
动力传动系统方法
霍华德在 Strata 2012 上发表了一个 35 分钟的演讲,名为“ _ 从预测性建模到优化:下一个前沿 _ ”。
<iframe allowfullscreen=“” frameborder=“0” height=“281” src=“https://www.youtube.com/embed/vYrWTDxoeGg?feature=oembed” width=“500”></iframe>
该方法还在博客文章“ _ 设计出色的数据产品:动力传动系统方法:构建数据产品的四步流程 _ ”中进行了描述,该工艺也可作为[使用]独立的免费电子书](http://shop.oreilly.com/product/0636920026082.do)(完全相同的内容,我可以告诉)。
在演讲中,他介绍了他的动力传动系统方法的四个步骤:
- 定义目标:我想要实现什么结果?
- 杠杆:我们可以控制哪些输入?
- 数据:我们可以收集哪些数据?
- 模型:杠杆如何影响目标?
他描述了收集数据,因为他真正指的是对因果关系数据的需求,大多数组织都没有收集这些数据。必须通过执行大量随机实验来收集此数据。
这是关键。它超越了测试新页面标题的粉状 A / B,它涉及对无偏行为的评估,例如对随机选择的建议的响应。
建模的第四步是包含以下子流程的管道:
- 目标:我想要达到什么样的结果。
- 原始数据:无偏见的因果数据
- 建模器:数据中因果关系的统计模型。
- 模拟器:插入临时输入(移动控制杆)并评估对目标的影响的能力。
- 优化器:使用模拟器搜索输入(离开值)以最大化(或最小化)所需结果。
- 切实可行的结果:用结果实现目标
实例探究
这种方法有点抽象,需要用一些例子来澄清。
在演示中,霍华德以谷歌搜索为例:
- 目标:您想阅读哪个网站?
- 杠杆:您可以在 SERP 上访问的网站的排序。
- 数据:页面之间的链接网络。
- 模型:未讨论,但人们会假设正在进行的实验和页面权限指标的改进。
扩展此示例,Google 很可能通过注入其他结果并了解用户的行为来在 SERP 中执行随机体验。这将允许基于点击的可能性,用户点击的模拟以及针对给定用户的 SERP 中的最可点击条目的优化来构建预测模型。现在,我希望谷歌的广告可以使用像这样的方法,这可能是一个更清晰的例子。
霍华德还将营销作为建议的改进领域。他评论说,目标是 CLTV 的最大化。杠杆包括产品,优惠,折扣和客户服务电话的推荐。可以作为原始数据收集的因果关系将是概率或购买以及喜欢产品的概率,但不了解产品。
他还给出了最佳决策小组之前启动的例子,以最大化保险利润。他还将谷歌自动驾驶汽车作为另一个例子,而不是像现在的 GPS 显示那样进行粉状路线搜索。
我觉得有更多机会详细阐述这些想法。我认为,如果通过一步一步的例子以更清晰的方式介绍方法,那么对这些想法的反应就会更大。
摘要
超越预测的概念需要经常重复。很容易陷入一个特定的问题。我们讨论了很多关于预先定义问题的尝试,以减少这种影响。
霍华德的动力传动系统方法是一种工具,您可以使用它来设计一个系统来解决使用机器学习的复杂问题,而不是使用机器学习来做出预测并将其称为一天。
这些想法与响应面法(RSM)有很多重叠。虽然没有明确说明,但 Irfan Ahmad 在他的预测模型分类中同时暗示了相关帖子中的链接,需要澄清霍华德的一些术语。
如何在评估机器学习算法时选择正确的测试选项
当评估机器学习算法时使用的测试选项可能意味着过度学习,平庸的结果和可用的最先进结果之间的差异,您可以自信地从屋顶上呼喊(您真的觉得有时这样做)。
在本文中,您将发现可在算法评估测试工具中使用的标准测试选项,以及下次如何选择正确的选项。
随机性
选择正确的测试选项的困难的根源是随机性。大多数(几乎所有)机器学习算法都以某种方式使用随机性。随机性可以在算法中是明确的,或者可以在选择用于训练算法的数据的样本中。
随机性
摄影: afoncubierta ,保留一些权利
这并不意味着算法产生随机结果,这意味着它们产生具有一些噪声或方差的结果。我们称这种类型的有限方差,随机和利用它的算法,随机算法。
对相同数据进行训练和测试
如果您有数据集,则可能需要在数据集上训练模型,然后在该数据集上报告模型的结果。那个模型有多好,对吧?
这种评估算法的方法的问题在于,您确实会知道算法在数据集上的表现,但是没有任何关于算法将如何对未训练模型的数据执行的指示(所谓的看不见的数据) )。
这很重要,只有当您想使用该模型对未见数据做出预测时。
分裂测试
使用一个数据集来训练和估计算法在看不见的数据上的表现的一种简单方法是拆分数据集。您获取数据集,并将其拆分为训练数据集和测试数据集。例如,您随机选择 66%的实例进行训练,并将剩余的 34%用作测试数据集。
该算法在训练数据集上运行,并在测试数据集上创建和评估模型,并获得表现准确度,即 87%的分类准确度。
当您拥有大量数据或训练模型时(特别是资源或时间),吐痰测试速度非常快。对非常大的数据集进行拆分测试可以准确估计算法的实际表现。
算法对数据有多好?我们可以自信地说它可以达到 87%的准确度吗?
问题是如果我们再次将训练数据集吐出到不同的 66%/ 34%分割中,我们将得到与我们的算法不同的结果。这称为模型方差。
多个拆分测试
分裂测试在数据集的不同拆分中获得不同结果的问题的解决方案是减少随机过程的方差并多次执行。我们可以从相当数量的运行中收集结果(比如 10)并取平均值。
例如,假设我们将数据集分成 66%/ 34%,运行我们的算法并得到准确度,我们用 10 次不同的分割完成了 10 次。我们可能有 10 个准确度分数如下:87,87,88,89,88,86,88,87,88,87。
我们模型的平均表现为 87.5,标准偏差约为 0.85。
硬币折腾
照片由 ICMA 照片,保留一些权利
多个拆分测试的一个问题是,某些数据实例可能永远不会包含在训练或测试中,而其他数据实例可能会多次选择。结果是,这可能会使结果产生偏差,并且可能无法对算法的准确率给出有意义的概念。
交叉验证
确保每个实例用于训练和测试相同次数同时减少准确度得分的方差的问题的解决方案是使用交叉验证。特别是 k 折交叉验证,其中 k 是数据集中要进行的拆分数。
例如,让我们选择 k = 10 的值(非常常见)。这将数据集分成 10 个部分(10 倍),算法将运行 10 次。每次运行算法时,它将在 90%的数据上进行训练,并在 10%的数据上进行测试,每次运行算法将改变算法测试的 10%的数据。
在此示例中,每个数据实例将恰好用作训练实例 9 次,并作为测试实例 1 次。准确度不是平均值和标准偏差,而是精确的准确度得分,表示进行了多少次正确的预测。
k 折交叉验证方法是用于评估算法在数据集上的表现的首选方法。您希望选择 k 值,为您的算法提供大小合适的训练和测试数据集。不太不成比例(对于训练或测试来说太大或太小)。如果您有大量数据,则可能不得不采用数据采样或恢复分割测试。
交叉验证确实可以对未见数据的算法表现进行无偏估计,但如果算法本身使用随机性会怎样。每次用不同的随机数种子(伪随机序列的开始)训练时,该算法将对相同的训练数据产生不同的结果。交叉验证不考虑算法预测的方差。
另一个值得关注的问题是交叉验证本身使用随机性来决定如何将数据集拆分为 k 个折叠。交叉验证不会估计算法如何使用不同的折叠集合执行。
这只有在您想要了解算法在数据集上的稳健性时才有意义。
多重交叉验证
考虑算法本身方差的一种方法是多次运行交叉验证,并从每次运行中获取算法精度的均值和标准差。
这将为您提供算法在数据集上的表现估计,以及对表现的稳健性(标准偏差的大小)的估计。
如果算法 A 有一个均值和标准差,算法 B 有另一个均值和标准差,并且它们不同(例如,算法 A 具有更高的准确度),您如何知道差异是否有意义?
这只有在您想比较算法之间的结果时才有意义。
统计学意义
当使用多次 k 次交叉验证时,比较算法表现测量的解决方案是使用统计显着性测试(如T 检验)。
多次运行 k 折交叉验证的结果是一个数字列表。我们希望使用均值和标准差来总结这些数字。您可以将这些数字视为来自基础人群的样本。统计显着性检验回答了这个问题:两个样本来自同一群体吗? (没有不同)。如果答案是“是”,则即使平均值和标准偏差不同,也可以说差异在统计上不显着。
我们可以使用统计显着性检验来表示在使用多次运行时算法结果之间的差异(或缺乏差异)(如使用不同随机数种子的多次 k 次交叉验证)。这可以在我们想要对结果做出准确的声明时(算法 A 优于算法 B 且差异具有统计显着性)
这不是故事的结尾,因为这些测试(p 值)有不同的统计显着性检验(参数和非参数)和参数。我打算在这里画线,因为如果你已经跟我走了这么远,你现在已经足够了解选择测试选项以产生严格的(可发布的!)结果。
摘要
在这篇文章中,您发现了在设计测试工具以评估机器学习算法时可用的主要测试选项之间的区别。
具体来说,您了解了实用程序和问题:
- 对同一数据集进行训练和测试
- 拆分测试
- 多次拆分测试
- 交叉验证
- 多重交叉验证
- 统计学意义
如有疑问,请使用 k 折交叉验证(k = 10),并在想要有意义地比较数据集上的算法时,使用多次 k-fold 交叉验证和统计显着性检验。
如何定义机器学习问题
原文:
machinelearningmastery.com/how-to-define-your-machine-learning-problem/
任何项目的第一步都是定义您的问题。您可以使用最强大,最闪亮的算法,但如果您正在解决错误的问题,结果将毫无意义。
在这篇文章中,您将学习在开始之前深入思考问题的过程。这无疑是应用机器学习的最重要方面。
问题是什么?
照片归属于 Eleaf ,保留一些权利
问题定义框架
我在定义一个新问题时使用一个简单的框架来解决机器学习问题。该框架帮助我快速了解问题的要素和动机,以及机器学习是否合适。
该框架涉及回答三个问题,以达到不同程度的彻底性:
- 第 1 步:有什么问题?
- 第 2 步:为什么需要解决问题?
- 第 3 步:我该如何解决这个问题?
第 1 步:问题是什么
第一步是定义问题。我使用了许多策略来收集这些信息。
非正式的描述
描述问题,就像您向朋友或同事描述一样。这可以为突出显示您可能需要填充的区域提供一个很好的起点。它还提供了一个句子描述的基础,您可以使用它来分享您对问题的理解。
例如:_ 我需要一个程序来告诉我哪些推文会转发。_
形式主义
在之前的博客文章定义机器学习中,您了解了 Tom Mitchell 的机器学习形式。这里再次刷新你的记忆。
据说一个计算机程序可以从经验
E
中学习某类任务T
和表现测量P
,如果它在 _ 的任务中的表现通过P
测量的 T_ 随经验E
而改善。
使用这种形式来定义T
,P
和E
来解决您的问题。
例如:
- 任务(
T
):将尚未发布的推文分类为转发或不转发。 - 经验(
E
):一个帐户的推文语料库,其中一些有转推,有些则不转。 - 表现(
P
):分类准确率,所有推文中正确预测的推文数量被视为百分比。
假设
创建一个关于问题及其措辞的假设列表。这些可能是经验法则和特定于域的信息,您认为这些信息可以让您更快地获得可行的解决方案。
突出可以针对实际数据进行测试的问题可能很有用,因为当假设和最佳实践在实际数据面前被证明是错误的时候会出现突破和创新。突出可能需要挑战,放松或收紧的问题规范区域也是有用的。
For example:
- 推文中使用的特定词语与模型有关。
- 转发的特定用户与模型无关。
- 转推的数量可能对模型有影响。
- 较早的推文比最近的推文更不具有预测性。
质疑一切!
照片归于 dullhunk ,保留一些权利
类似的问题
您看到了哪些其他问题或者您能想到的问题就像您要解决的问题一样?其他问题可以通过强调问题措辞的局限性来解决您试图解决的问题,例如时间维度和概念漂移(建模的概念随着时间的推移而变化)。其他问题也可以指向可用于检查表现的算法和数据转换。
例如:一个相关问题是电子邮件垃圾邮件歧视,它使用文本消息作为输入数据,需要二分类决策。
第 2 步:为什么需要解决问题?
第二步是深入思考为什么你想要或者需要解决问题。
动机
考虑一下解决问题的动机。问题解决后需要满足什么?
例如,您可能正在将问题解决为学习练习。这有助于澄清,因为您可以决定不想使用最合适的方法来解决问题,而是想要探索您不熟悉的方法以学习新技能。
或者,您可能需要将问题作为工作职责的一部分来解决,最终是为了保住您的工作。
解决方案优势
考虑解决问题的好处。它能够实现哪些功能?
重要的是要清楚解决问题的好处,以确保您充分利用它们。这些好处可用于将项目出售给同事和管理层以获得购买和额外的时间或预算资源。
如果它对您个人有益,那么请明确这些好处是什么以及您何时获得这些好处。例如,如果它是一个工具或实用程序,那么你可以用你现在不能做的那个实用程序做什么,为什么这对你有意义?
解决方案使用
考虑如何使用问题的解决方案以及您期望解决方案具有的生命周期类型。作为程序员,我们经常认为工作是在程序编写完成后立即完成的,但实际上项目只是开始维护生命周期。
解决方案的使用方式将影响您采用的解决方案的性质和要求。
考虑您是否要编写报告以显示结果,或者您希望操作解决方案。如果要实现解决方案,请考虑解决方案的功能和非功能需求,就像软件项目一样。
第 3 步:我如何解决问题?
在问题定义的第三步也是最后一步,探索如何手动解决问题。
逐步列出您将收集哪些数据,如何准备它以及如何设计程序来解决问题。这可能包括您需要执行的原型和实验,这些都是金矿,因为它们将突出您对可以探索的领域的问题和不确定性。
这是一个强大的工具。它可以突出显示使用手动实现的解决方案可以令人满意地解决的问题。它还刷新了迄今为止存在的重要领域知识,例如数据实际存储的位置,哪些类型的功能有用以及许多其他细节。
收集所有这些细节,并更新问题定义的前几部分。特别是假设和经验法则。
在描述为什么机器学习很重要中的复杂问题之前,我们已经考虑过手动指定的解决方案。
摘要
在这篇文章中,您了解了明确解决问题的价值。您发现了一个三步框架,用于在步骤中使用实用策略定义您的问题:
- 第 1 步:有什么问题? 非正式地和正式地描述问题并列出假设和类似问题。
- 第 2 步:为什么需要解决问题? 列出解决问题的动机,解决方案提供的好处以及解决方案的使用方法。
- 第 3 步:我该如何解决这个问题? 描述如何手动解决问题以刷新领域知识。
你如何定义机器学习的问题?您是否使用过上述任何一种策略?如果是,您的经历是什么?发表评论。
如何评估机器学习算法
原文:
machinelearningmastery.com/how-to-evaluate-machine-learning-algorithms/
一旦定义了您的问题和准备好您的数据,您需要将机器学习算法应用于数据以解决您的问题。
您可以花费大量时间选择,运行和调整算法。您希望确保有效利用时间来更接近目标。
在这篇文章中,您将逐步完成一个过程,快速测试算法并发现问题中是否存在用于学习算法以及哪些算法有效的结构。
测试线束
照片归属于 NASA Webb 望远镜,部分版权所有
测试线束
您需要定义测试工具。测试工具是您将训练和测试算法的数据,以及您将用于评估其表现的表现测量。重要的是要很好地定义测试工具,以便您可以专注于评估不同的算法并深入思考问题。
测试工具的目标是能够快速一致地测试算法,以反映正在解决的问题的公平表示。针对线束测试多种算法的结果将是对各种算法如何针对所选表现度量对问题执行的估计。您将知道哪些算法可能值得调整问题,哪些算法不应该进一步考虑。
结果还将告诉您问题的可学习性。如果各种不同的学习算法大学在这个问题上表现不佳,那么可能表明缺乏可用于学习算法的结构。这可能是因为在所选数据中实际上缺乏可学习的结构,或者它可能是尝试不同变换以将结构暴露给学习算法的机会。
表现指标
表现度量是您希望评估问题解决方案的方式。它是您对测试数据集上受过训练的模型所做的预测所做的测量。
表现度量通常专用于您正在使用的问题类,例如分类,回归和聚类。许多标准表现指标将为您提供对您的问题域有意义的分数。例如,分类的分类准确率(总校正校正除以总预测数乘以 100 将其变为百分比)。
您可能还需要更详细的表现细分,例如,您可能想知道垃圾邮件分类问题的误报,因为好的电子邮件将被标记为垃圾邮件并且无法读取。
有许多标准的表现指标可供选择。您很少需要自己设计一个新的表现指标,因为您通常可以找到或调整一个能够最好地捕获所解决问题要求的指标。查看您发现的类似问题以及用于查看是否可以采用的表现指标。
测试和训练数据集
从转换后的数据中,您需要选择一个测试集和一个训练集。将在训练数据集上训练算法,并将针对测试集进行评估。这可能就像选择随机数据分割一样简单(66%用于训练,34%用于测试)或者可能涉及更复杂的采样方法。
训练期间训练的模型不会暴露于测试数据集,并且对该数据集进行的任何预测都被设计为通常指示模型的表现。因此,您需要确保选择数据集代表您正在解决的问题。
交叉验证
比使用测试和训练数据集更复杂的方法是使用整个变换数据集来训练和测试给定算法。您可以在测试工具中使用的方法执行此操作称为交叉验证。
它首先涉及将数据集分成多个大小相等的实例组(称为折叠)。然后对所有折叠进行训练,除了遗漏之外的所有折叠,并且在遗漏折叠处测试所准备的模型。重复该过程,以便每个折叠都有机会被遗漏并充当测试数据集。最后,在所有折叠中对表现度量进行平均,以估计算法对问题的能力。
例如,3 次交叉验证将涉及 3 次训练和测试模型:
- #1:在折叠 1 + 2 上训练,在折叠 3 上进行测试
- #2:在折叠 1 + 3 上训练,在折叠 2 上进行测试
- #3:训练 2 + 3 折叠,在折叠 1 上测试
折叠数量可能因数据集的大小而异,但常见数字为 3,5,7 和 10 倍。目标是在训练和测试集中的数据大小和表示之间取得良好的平衡。
当您刚入门时,坚持使用简单的训练和测试数据(例如 66%/ 34%)并在您更有信心后进行交叉验证。
测试算法
当您遇到问题并定义了测试工具时,您很满意,现在是时候检查各种机器学习算法了。采样检查很有用,因为它可以让您快速查看数据中是否有任何可学习的结构,并估计哪些算法可能对问题有效。
采样检查还可以帮助您解决测试工具中的任何问题,并确保所选的表现测量是合适的。
最好的第一种采样检查算法是随机的。插入随机数生成器以生成适当范围内的预测。这应该是您实现的最差的“算法结果”,并且将成为评估所有改进的措施。
选择适合您的问题的 5-10 种标准算法,并通过测试工具运行它们。通过标准算法,我的意思是流行的方法没有特殊配置。适合您的问题意味着如果您有回归问题,算法可以处理回归。
从我们已经审查过的算法的分组中选择方法。我喜欢包含多种混合,并且有多种算法类型的 10-20 种不同的算法。根据我使用的库,我可能会检查 50 多种流行的方法来快速清除有前景的方法。
如果要运行许多方法,可能必须重新访问数据准备并减小所选数据集的大小。这可能会降低您对结果的信心,因此请使用各种数据集大小进行测试。您可能希望使用较小尺寸的数据集进行算法点检查,并使用更完整的数据集进行算法调整。
摘要
在这篇文章中,您了解了设置值得信赖的测试工具的重要性,该测试工具涉及选择测试和训练数据集以及对您的问题有意义的表现测量。
您还了解了使用测试工具对您的问题进行各种机器学习算法的现场检查策略。您发现此策略可以快速突出显示数据集中是否存在可学习的结构(如果不是,您可以重新访问数据准备)以及哪些算法在问题上表现良好(可能是进一步调查和调整的候选者)。
资源
如果您希望深入了解此主题,可以从以下资源中了解更多信息。
- 数据挖掘:实用机器学习工具和技术(会员链接),第五章:可信度:评估所学知识
- 机器学习:神经和统计分类(会员链接),第七章:比较方法
如何获得基线结果及其重要性
原文:
machinelearningmastery.com/how-to-get-baseline-results-and-why-they-matter/
在我的课程和指南中,我在深入研究现场检查算法之前教授基线结果的准备。
我的一名学生最近问:
如果没有针对问题计算基线,是否会使其他算法的结果有问题?
他继续问:
如果其他算法没有提供比基线更好的准确度,我们应该从中得到什么教训?它是否表明数据集没有预测能力?
这些都是很好的问题,它们解释了为什么我们首先创建基线以及它提供的过滤能力。
在本文中,您将了解为什么我们创建基线预测结果,如何创建基线以及特定问题类型,以及如何使用它来通知您可用的数据和您正在使用的算法。
基线机器学习结果
照片由特雷西惊人,保留一些权利
查找可以建模的数据
当您练习机器学习时,每个问题都是独一无二的。您很可能以前没有看到它,您无法知道要使用哪些算法,哪些数据属性将是有用的,甚至是否可以有效地建模问题。
我个人认为这是最激动人心的时刻。
如果您处于这种情况,您很可能自己从不同的来源收集数据并选择您认为可能有价值的属性。 将需要特征选择和特征工程。
在此过程中,您需要了解您迭代尝试定义和收集数据的问题为做出预测提供了有用的基础。
一个有用的比较点
您需要针对问题的采样检查算法,看看您是否有一个有用的基础来建模您的预测问题。但是你怎么知道结果有什么好处呢?
您需要一个比较结果的基础。您需要一个有意义的参考点来进行比较。
一旦开始从不同的机器学习算法中收集结果,基线结果可以告诉您更改是否正在增加值。
它如此简单,却如此强大。获得基线后,您可以添加或更改数据属性,正在尝试的算法或算法参数,并了解您是否已改进了问题的方法或解决方案。
计算基线结果
您可以使用常用方法计算基线结果。
基线结果是最简单的预测。对于某些问题,这可能是随机结果,而在其他问题中可能是最常见的预测。
- 分类:如果您有分类问题,可以选择观察次数最多的类,并将该类用作所有预测的结果。在 Weka 中,这被称为 ZeroR 。如果训练数据集中所有类的观察数相等,则可以选择特定类或枚举每个类,并查看哪个类在测试工具中提供了更好的结果。
- 回归:如果您正在处理回归问题,您可以使用集中趋势度量作为所有预测的结果,例如均值或中位数。
- 优化:如果您正在处理优化问题,则可以在域中使用固定数量的随机样本。
您可以将宝贵的时间用于集体讨论可以测试问题的所有最简单的结果,然后继续评估它们。结果可以是非常有效的过滤方法。如果更高级的建模方法不能胜过简单的中心趋势,那么您就知道自己有工作要做,最有可能更好地定义或重构问题。
您使用的准确度分数很重要。在计算基线之前,您必须选择计划使用的准确度分数。分数必须是相关的,并通过首先处理问题来告知您要回答的问题。
如果您正在处理分类问题,您可能需要查看 Kappa 统计量,它会为您提供基线标准化的准确度分数。基线准确度为 0,高于零的分数显示基线的改善。
将结果与基线进行比较
如果您的基线结果不佳,则可以。它可能表明问题特别困难,或者可能意味着您的算法有很大的改进空间。
如果您无法获得比基线更好的准确度,那么这很重要。这表明问题可能很难。
您可能需要收集更多或不同的数据来进行建模。您可能需要研究使用不同的,可能更强大的机器学习算法或算法配置。最终,经过这些类型的更改,您可能会遇到一个对预测有抵抗力的问题,可能需要重新构建。
行动步骤
此帖子的操作步骤是开始使用基准调查下一个数据问题,您可以从中比较所有结果。
如果您已经在处理问题,请包含基线结果并使用该结果来解释所有其他结果。
分享您的结果,您的问题是什么以及您使用的基线是什么?
如何充分利用机器学习数据
原文:
machinelearningmastery.com/how-to-get-the-most-from-your-machine-learning-data/
您使用的数据以及使用方式可能会定义预测性建模问题的成功。
数据和问题框架可能是您项目最大的杠杆点。
为您的问题选择错误的数据或错误的框架可能会导致模型表现不佳,或者最糟糕的是,模型无法收敛。
无法分析地计算要使用的数据或如何使用它,但可以使用反复试验过程来发现如何最好地使用您拥有的数据。
在这篇文章中,您将发现从机器学习项目中的数据中获得最大收益。
阅读这篇文章后,你会知道:
- 探索预测性建模问题的替代框架的重要性。
- 需要在输入数据上开发一套“_ 视图 _”并对每个视图进行系统测试。
- 功能选择,工程和准备的概念是为您的问题创建更多视图的方法。
让我们开始吧。
如何充分利用机器学习数据
Jean-Marc Bolfing 的照片,保留一些权利。
概观
这篇文章分为 8 个部分;他们是:
- 问题框架
- 收集更多数据
- 研究你的数据
- 训练数据样本量
- 特征选择
- 特色工程
- 数据准备
- 走得更远
1.问题框架
集思广益,以多种方式构建预测性建模问题。
问题的框架意味着以下组合:
- 输入
- 输出
- 问题类型
例如:
- 您可以使用更多或更少的数据作为模型的输入吗?
- 你能预测别的东西吗?
- 你能把问题改成回归/分类/序列等吗?
你获得的创意越多越好。
使用来自其他项目,论文和域本身的想法。
头脑风暴。写下所有的想法,即使它们是疯了。
我有一些框架可以帮助在这里集思广益:
我在这篇文章中谈到改变问题类型:
2.收集更多数据
获得比您需要的更多数据,甚至是与预测结果相切的数据。
我们无法知道需要多少数据。
数据是模型开发过程中花费的货币。这是项目呼吸所需的氧气。每次使用某些数据时,其他任务的可用数据就越少。
您需要在以下任务上花费数据:
- 模范训练。
- 模型评估。
- 模型调整。
- 模型验证。
此外,该项目是新的。之前没有人完成您的特定项目,建模您的特定数据。你真的不知道哪些功能还有用。你可能有想法,但你不知道。全部收集;在这个阶段让它们全部可用。
3.研究你的数据
使用您可以想到的每个数据可视化从各个角度查看您的数据。
- 查看原始数据有帮助。你会发现事情。
- 查看摘要统计量有帮助。再一次,你会发现事情。
- 数据可视化就像是这两种学习方式的完美结合。你会发现更多的东西。
花费很长时间来处理原始数据和摘要统计量。然后继续进行可视化,因为它们可能需要更多时间来准备。
使用您能想到的每个数据可视化,并从您的数据的书籍和论文中收集。
- 查看图表。
- 保存情节。
- 注释图。
- 向领域专家显示图表。
您正在寻求更深入地了解数据。您可以使用的想法,以帮助更好地选择,设计和准备建模数据。它会得到回报。
4.训练数据样本量
使用数据样本执行灵敏度分析,以查看实际需要的数据量(或很少)。
你没有所有的观察结果。如果您这样做,则无需对新数据做出预测。
相反,您正在处理数据样本。因此,对于需要多少数据来拟合模型存在一个悬而未决的问题。
不要以为越多越好。测试。
- 设计实验,了解模型技能如何随样本量而变化。
- 使用统计量查看趋势和趋势随样本量变化的重要程度。
如果没有这些知识,您将无法充分了解您的测试工具,以便明智地评论模型技能。
在此帖子中了解有关样本量的更多信息:
5.特征选择
创建输入功能的许多不同视图并测试每个视图。
您不知道哪些变量对预测性建模问题有帮助或最有帮助。
- 你可以猜猜看。
- 您可以使用领域专家的建议。
- 您甚至可以使用功能选择方法中的建议。
但他们都只是猜测。
每组建议的输入功能都是您的问题的“视图”。了解哪些特性可能对建模和预测输出变量有用。
尽可能多地集思广益,计算和收集输入数据的不同视图。
设计实验并仔细测试并比较每个视图。使用数据通知您哪些功能和哪个视图最具预测性。
有关功能选择的更多信息,请参阅此帖子:
6.特征工程
使用要素工程为预测性建模问题创建其他功能和视图。
有时您拥有可以获得的所有数据,但是给定的功能或功能集会锁定对于机器学习方法学习和映射到结果变量而言过于密集的知识。
例子包括:
- 日期/时间。
- 交易。
- 说明。
将这些数据细分为更简单的附加组件功能,例如计数,标志和其他元素。
尽可能简化建模过程。
有关特征工程的更多信息,请参阅帖子:
7.数据准备
您可以通过各种方式预处理数据,以满足算法的期望等。
预处理数据(如特征选择和特征工程)可在输入要素上创建其他视图。
一些算法具有关于预处理的偏好,例如:
- 标准化输入功能。
- 标准化输入功能。
- 使输入功能固定。
准备好预期这些预期的数据,然后再进一步。
应用您可以想到的每种数据预处理方法。继续为您的问题创建新视图,并使用一个或一组模型测试它们,看看什么效果最好。
您的目标是发现有关数据的视图,该数据最好地将映射问题的未知底层结构暴露给学习算法。
8.走得更远
你可以随时走得更远。
您可以收集更多数据,可以在数据上创建更多视图。
头脑风暴。
一旦您感觉自己走在路的尽头,一个简单的胜利就是开始研究从建模问题的不同视角创建的模型的集合。
它简单而高效,特别是如果视图暴露了底层映射问题的不同结构(例如模型具有不相关的错误)。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
摘要
在这篇文章中,您发现了可用于充分利用预测性建模问题数据的技术。
具体来说,你学到了:
- 探索预测性建模问题的替代框架的重要性。
- 需要在输入数据上开发一套“视图”并系统地测试每个视图。
- 功能选择,工程和准备的概念是为您的问题创建更多视图的方法。
您是否有更多想法可以充分利用您的数据?
你通常在一个项目上做什么?
请在下面的评论中告诉我。
你有任何问题吗?
在下面的评论中提出您的问题,我会尽力回答。
如何识别数据中的异常值
原文:
machinelearningmastery.com/how-to-identify-outliers-in-your-data/
Bojan Miletic 在使用机器学习算法时询问了有关数据集中异常值检测的问题。这篇文章是对他的问题的回答。
如果您对机器学习有疑问,请注册时事通讯并回复电子邮件或使用联系表格并询问,我会回答您的问题,甚至可能将其变成博客文章。
离群值
许多机器学习算法对输入数据中属性值的范围和分布敏感。输入数据中的异常值可能会扭曲和误导机器学习算法的训练过程,从而导致更长的训练时间,更不准确的模型以及最终的较差结果。
异常
摄影: Robert S. Donovan ,保留一些权利
即使在针对训练数据准备预测模型之前,异常值也可能导致误导性表示,进而导致对收集数据的误导性解释。异常值可以在描述性统计中偏离属性值的摘要分布,如平均值和标准差,以及直方图和散点图等图形,压缩数据体。
最后,异常值可以表示与问题相关的数据实例的示例,例如欺诈检测和计算机安全性中的异常。
异常值建模
异常值是极端值,远远超出其他观察值。例如,在正态分布中,异常值可以是分布尾部的值。
识别异常值的过程在数据挖掘和机器学习中有许多名称,例如异常值挖掘,异常值建模和新颖性检测以及异常检测。
在他的书异常分析(联盟链接)中,Aggarwal 提供了一个有用的离群检测方法分类,如下:
- 极值分析:确定数据底层分布的统计尾部。例如,统计方法,如单变量数据的 z 分数。
- 概率和统计模型:从数据的概率模型中确定不太可能的实例。例如,使用期望最大化优化的高斯混合模型。
- 线性模型:使用线性相关将数据建模到较低维度的投影方法。例如,主成分分析和具有大残差的数据可能是异常值。
- 基于邻近度的模型:与群集,密度或最近邻分析确定的数据质量隔离的数据实例。
- 信息理论模型:异常值被检测为数据实例,增加了数据集的复杂性(最小代码长度)。
- 高维异常值检测:搜索子空间中异常值的方法可以在更高维度(维数的诅咒)中分解基于距离的度量。
Aggarwal 评论说,异常模型的可解释性至关重要。对于特定数据实例为何或不是异常值的决策,需要上下文或基本原理。
在他对数据挖掘和知识发现手册(会员链接)的贡献篇章中,Irad Ben-Gal 提出了异常模型的分类,如单变量或多变量,参数和非参数。这是基于已知数据来构造方法的有用方法。例如:
- 您是否考虑过一个或多个属性中的异常值(单变量或多变量方法)?
- 您能否假设一个统计分布,从中采集或不采样(参数或非参数)?
入门
有许多方法和很多研究都用于异常检测。首先进行一些假设和设计实验,您可以清楚地观察这些假设对某些表现或准确度测量的影响。
我建议通过极值分析,接近方法和投影方法的步进过程。
极值分析
您无需了解高级统计方法即可查找,分析和过滤数据中的异常值。通过极值分析开始简单。
- 专注于单变量方法
- 使用散点图,直方图和框和胡须图可视化数据并查找极值
- 假设分布(高斯分布)并寻找与平均值相比超过 2 或 3 个标准差的值或从第一个或第三个四分位数开始的 1.5 倍的值
- 从训练数据集中筛选出异常值候选者并评估您的模型表现
接近方法
一旦探索了更简单的极值方法,请考虑转向基于邻近度的方法。
- 使用聚类方法识别数据中的自然聚类(例如 k 均值算法)
- 识别并标记聚类质心
- 识别与集群质心具有固定距离或百分比距离的数据实例
- 从训练数据集中筛选出异常值候选者并评估您的模型表现
投影方法
投影方法应用起来相对简单,并且可以快速突出显示无关的值。
- 使用投影方法将数据汇总为两个维度(例如 PCA,SOM 或 Sammon 的映射)
- 可视化映射并手动识别异常值
- 使用来自投影值或码本向量的邻近度量来识别异常值
- 从训练数据集中筛选出异常值候选者并评估您的模型表现
方法鲁棒于异常值
另一种策略是转向对异常值具有鲁棒性的模型。有强大的回归形式可以最小化中位数最小二乘误差而不是均值(所谓的稳健回归),但计算量更大。还有一些方法,如决策树,对异常值很强。
您可以检查一些对异常值有效的方法。如果存在显着的模型准确率优势,则可能有机会对训练数据中的异常值进行建模和过滤。
资源
有很多网页讨论异常值检测,但我建议阅读一本关于这个主题的好书,更具权威性。即使查看机器学习和数据挖掘的入门书籍也不会对您有用。有关统计学家对异常值的经典处理,请查看:
- Rousseeuw 和 Leroy 于 2003 年发布的鲁棒回归和异常检测(会员链接)
- Barnett 和 Lewis 于 1994 年出版的统计量(会员链接)中的异常值
- 异常值的识别(会员链接)霍金斯出版于 1980 年的专着
有关数据挖掘社区对异常值的现代处理,请参阅:
- 异常分析(会员链接)由 Aggarwal 于 2013 年出版
- 第七章,Irad Ben-Gal 在数据挖掘与知识发现手册(会员链接)中编辑,由 Maimon 和 Rokach 编辑,于 2010 年出版
如何改进机器学习结果
原文:
machinelearningmastery.com/how-to-improve-machine-learning-results/
拥有一个或两个在问题上表现相当好的算法是一个良好的开端,但有时您可能会受到激励以获得最佳结果,您可以获得可用的时间和资源。
在这篇文章中,您将了解可用于挤出额外表现的方法,并改进从机器学习算法中获得的结果。
调整算法时,您必须对测试工具给出的结果有很高的信心。这意味着您应该使用减少用于评估算法运行的表现度量方差的技术。我建议使用相当多的折叠进行交叉验证(确切的数量取决于您的数据集)。
Tuning Fork
照片归属于 eurok ,保留一些权利
您将在本文中了解的三个策略是:
- 算法调整
- 合奏
- 极限特征工程
算法调整
开始的地方是从您已经知道的对您的问题表现良好的算法中获得更好的结果。您可以通过探索和微调这些算法的配置来实现此目的。
机器学习算法被参数化,并且那些参数的修改可以影响学习过程的结果。将每个算法参数视为图形上的维度,其中给定参数的值作为沿轴的点。三个参数将是算法的可能配置的立方体,并且 n 参数将是算法的可能配置的 n 维超立方体。
算法调整的目的是为您的问题找到超立方体中的最佳点。您将针对您的测试工具进行优化,因此您再也不能低估花时间构建可信测试工具的重要性。
您可以通过使用自动化方法来处理此搜索问题,该方法在可能性空间和可能具有良好算法配置的示例上强加网格。然后,您可以在优化算法中使用这些点来放大最佳表现。
您可以使用一些表现良好的方法重复此过程,并探索每种方法可以实现的最佳效果。我强烈建议该过程是自动化的并且合理粗糙,因为您可以快速达到可能无法转化为生产系统的收益递减点(表现百分比增加)。
算法参数调整得越多,算法对训练数据和测试工具的偏差就越大。这种策略可能是有效的,但它也可能导致更脆弱的模型过度使用你的测试工具并且在实践中表现不佳。
合奏
集合方法涉及组合多种方法的结果以获得改进的结果。当你有多个“足够好”的模型专门研究问题的不同部分时,集合方法很有效。
这可以通过许多方式实现。您可以探索的三种合奏策略是:
- Bagging :更正式地称为 Bootstrapped Aggregation,相同的算法通过训练不同的训练数据子集对问题有不同的观点。
- Boosting :针对相同的训练数据训练不同的算法。
- 混合:更正式地称为 Stacked Aggregation 或 Stacking 是各种模型,其预测被作为新模型的输入,学习如何将预测结合到整体预测中。
在用尽更多传统方法之后进入合奏方法是个好主意。这有两个很好的理由,它们通常比传统方法更复杂,传统方法为您提供了良好的基础水平,您可以从中提高和绘制来创建您的合奏。
合奏学习
照片归属于 ancasta1901 ,部分版权所有
极限特征工程
前两个策略考虑了从机器学习算法中获得更多。这个策略是为了让学习算法的问题暴露出更多的结构。在数据准备中学习了有关特征分解和聚合的知识,以便更好地规范机器学习算法的数据。在这个策略中,我们将这个想法推向极限。我把这种策略称为极端特征工程,当真正的“特征工程”这个术语就足够了。
将您的数据视为嵌入其中的复杂多维结构,机器学习算法知道如何查找和利用以做出决策。您希望最好地将这些结构暴露给算法,以便算法可以做到最好。一个难点是这些结构中的一些可能太密集或太复杂而无法在没有帮助的情况下找到算法。您可能也从您的领域专业知识中了解此类结构。
获取属性并将它们广泛分解为多个功能。从技术上讲,您使用此策略所做的是将依赖关系和非线性关系简化为更简单的独立线性关系。
这可能是一个外国的想法,所以这里有三个例子:
- 分类:你有一个具有[红色,绿色蓝色]值的分类属性,你可以将它分成红色,绿色和蓝色的 3 个二进制属性,并为每个实例分别赋予 1 或 0 值。
- Real :你有一个实数值,其值介于 0 到 1000 之间。你可以创建 10 个二进制属性,每个属性代表一个值的 bin(bin 1 为 0-99,bin 2 为 100-199)等)并为每个实例分配二进制值(1/0)。
我建议一步一步地执行此过程,并为每个修改创建一个新的测试/训练数据集,然后在数据集上测试算法。这将开始让您直观了解数据库中的属性和功能,这些属性和功能会向算法公开更多或更少的信息以及对表现度量的影响。您可以使用这些结果来指导进一步的极端分解或聚合。
摘要
在这篇文章中,您了解了三种策略,可以从您的问题中获得机器学习算法的改进结果:
- 算法调整通过模型参数空间将发现最佳模型的方式视为搜索问题。
- 组合多个模型所做预测的集合。
- 极限特征工程,其中数据准备中看到的属性分解和聚合被推到极限。
资源
如果您希望深入了解此主题,请查看以下资源。
- 黑客机器学习,第十二章:模型比较
- 数据挖掘:实用机器学习工具和技术,第七章:转换:设计输入和输出
- 统计学习要素:数据挖掘,推理和预测,第十六章:集成学习
更新
有关从算法中获取更多信息的 20 个提示和技巧,请参阅帖子:
如何在机器学习竞赛中胜出
原文:
machinelearningmastery.com/how-to-kick-ass-in-competitive-machine-learning/
David Kofoed Wind 在 Kaggle 博客 No Free Hunch 上发表了一篇文章,名为“ _ 从最好的 _ 中学习”。在这篇文章中,大卫总结了 6 个与参与机器学习竞赛相关的关键领域,以及来自表现最好的 kagglers 的报价。
在这篇文章中,您将发现从该帖子中提取的竞争性机器学习中做得好的关键启发式方法。
从利达的最佳
照片中学习,保留一些权利
向 Kaggle Masters 学习
David 是丹麦技术大学认知系统系的博士生。在此之前,他是一名硕士生,他的论文题目是“ _ 预测机器学习中的概念 _ ”。
你会从标题中知道它,但这是一个很好的论点。在其中,大卫提炼了 3 名 Kaggle 大师 Tim Salimans , Steve Donoho 和 Anil Thomas 的建议,并分析了 10 场比赛的结果。在 Kaggle 比赛中表现良好,然后通过参加 2 个案例研究比赛来测试这些课程。
他的框架有 5 个组成部分:
- 特征工程是预测机器学习中最重要的部分
- 过拟合排行榜是一个真正的问题
- 简单的模型可以让你走得很远
- 合奏是一种成功的策略
- 预测正确的事情很重要
大卫在他的博客文章中总结了这五个方面,并增加了第六个,这是一个不适合这些类别的一般建议。
预测性建模竞争框架
在本节中,我们将查看框架的五个部分中的每个部分的主要经验教训以及需要考虑的其他启发式方法。
特色工程
特征工程是数据准备步骤,涉及将属性转换,聚合和分解为最能表征建模问题数据结构的特征。
- 数据比您应用的算法更重要。
- 将大部分时间花在功能工程上。
- 利用自动方法生成,提取,删除和更改属性。
- 深度学习中使用的半监督学习方法可以自动建模特征。
- 有时,对数据集进行仔细的非规范化可以胜过复杂的特征工程。
过拟合
过拟合是指创建在训练数据上表现良好的模型,而不是在看不见的测试数据上(或远离它)。这扩展到在排行榜上观察到的分数,这是对用于识别竞赛获胜者的验证数据集样本(通常约 20%)的模型的评估。
- 小而嘈杂的训练数据集可能导致排行榜和最终结果之间更大的不匹配。
- 排行榜确实包含信息,可用于模型选择和超参数调整。
- Kaggle 使得过拟合的危险变得非常真实。
- 在测试工具上花费大量时间来估算模型准确率,甚至忽略排行榜。
- 将测试工具分数与排行榜分数相关联,以评估您可以放在排行榜中的信任度。
简单模型
使用简单模型是指在数据集上使用经典或易于理解的算法,而不是通常更复杂的最先进方法。模型的简单性或复杂性是指所需术语的数量和用于优化这些术语的过程。
- 最简单的方法通常被最好的竞争者使用。
- 初学者过早转向复杂的模型,这可能会减慢对问题的学习。
- 更简单的模型训练更快,更容易理解和适应,反过来提供更多的见解。
- 更简单的模型会强制您首先处理数据,而不是调整参数。
- 简单模型可以是基准的再现,例如按段的平均响应。
合奏
合奏是指将来自多个模型的预测组合成一组预测,通常是由每个贡献模型的技能加权的混合(例如在公共排行榜上)。
- 大多数获奖模型是多个模型的集合。
- 高度调整的模型以及平庸的模型都能提供良好的效果。
- 结合以不同方式约束的模型可以获得更好的结果。
- 在考虑合奏之前,充分利用算法。
- 在比赛结束前,将合奏调查作为最后一步。
预测正确的事情
每个竞赛都有一个指定的模型评估函数,用于比较模型对实际值的预测。这可以定义损失函数和数据集的结构,但它不必。
- 头脑风暴可以使用许多不同的方式来对问题进行建模。
- 建模飞行着陆时间与预计飞行时间比率的总飞行时间的示例。
- 使用不同的损失函数(即 RMSE 与 MAE)探索模型的准备。
额外的建议
本节列出了 David 和他的受访者在机器学习竞赛方面表现良好的其他见解。
- 尽快在排行榜上获取一些东西
- 构建一个加载数据的管道,并可靠地评估模型,这比你想象的要困难得多。
- 拥有一个包含大量工具的工具箱,并知道何时以及如何使用它们。
- 充分利用论坛,包括给予和接受。
- 在您知道从数据集中获得最大收益后,最后优化模型参数。
- 一个洞察力并没有赢得比赛,但有几个联系在一起。
摘要
在这篇文章中,您发现了参与机器学习竞赛时的 5 个问题的框架:特征工程,过拟合,使用简单模型,集合和预测正确的事物。
在这篇文章中,我们在关键经验法则中回顾了 David 的框架,可以用来在参加 Kaggle 比赛时从数据和算法中获得最大收益。
如何知道您的机器学习模型是否具有良好的表现
原文:
machinelearningmastery.com/how-to-know-if-your-machine-learning-model-has-good-performance/
在为预测性建模问题开发机器学习模型之后,您如何知道模型的表现是否良好?
这是初学者提出的一个常见问题。
作为初学者,您经常寻求这个问题的答案,例如:你希望有人告诉你x
%的准确度或x
的错误分数是否良好。
在这篇文章中,您将发现如何为自己明确回答这个问题,并了解您的模型技能是否良好。
阅读这篇文章后,你会知道:
- 可以使用基线模型来发现您的问题的表现基础,通过该基础模型可以评估所有其他模型。
- 鉴于数据和算法的随机性,所有预测模型都包含错误,并且在实践中不可能得到满分。
- 应用机器学习的真正工作是探索可能模型的空间,并发现相对于特定数据集的基线,良好的模型分数是什么样的。
让我们开始吧。
如何知道您的机器学习模型是否具有良好的表现
照片来自 dr_tr ,保留一些权利。
概观
这篇文章分为 4 部分;他们是:
- 模范技巧是相对的
- 基线模型技巧
- 什么是最好的分数?
- 发现模型技能的极限
模范技巧是相对的
您的预测性建模问题是独一无二的。
这包括您拥有的特定数据,您正在使用的工具以及您将获得的技能。
您的预测性建模问题以前没有得到解决。因此,我们无法知道一个好的模型是什么样的,或者它可能具有什么样的技能。
您可能会根据域的知识了解熟练模型的外观,但您不知道这些技能分数是否可实现。
我们能做的最好的事情是将您的特定数据的机器学习模型的表现与同样数据训练的其他模型进行比较。
机器学习模型的表现是相对的,并且良好模型可以实现什么分数的想法才有意义,并且只能在同样数据训练的其他模型的技能分数的上下文中进行解释。
基线模型技巧
由于机器学习模型的表现是相对的,因此开发稳健的基线至关重要。
基线是一种简单且易于理解的程序,用于对预测性建模问题做出预测。该模型的技能为您的特定数据集上的机器学习模型的最低可接受表现提供了基础。
基线模型的结果提供了可以评估所有其他模型训练数据的技能的点。
基线模型的三个示例包括:
- 预测回归问题的平均结果值。
- 预测分类问题的模式结果值。
- 将输入预测为单变量时间序列预测问题的输出(称为持久性)。
然后可以将问题的基线表现用作衡量所有其他模型进行比较和评估的标准。
如果模型达到低于基线的表现,则出现问题(例如,存在错误)或模型不适合您的问题。
什么是最好的分数?
如果您正在处理分类问题,最高分是 100%准确率。
如果您正在处理回归问题,则最佳得分为 0.0 错误。
这些分数不可能达到上/下限。所有预测性建模问题都有预测误差。期待它。该错误来自一系列来源,例如:
- 数据样本不完整。
- 数据中的噪音。
- 建模算法的随机性。
您无法获得最佳分数,但最好知道您所选择的度量的最佳表现。您知道真正的模型表现将落在基线和最佳分数之间的范围内。
相反,您必须在数据集上搜索可能模型的空间,并发现好坏分数的样子。
发现模型技能的极限
获得基线后,您可以在预测性建模问题上探索模型表现的范围。
事实上,这是项目的艰苦工作和目标:找到一个可以证明可靠的模型,可以很好地对特定数据集做出预测。
这个问题有很多策略;您可能希望考虑的两个是:
- 开始高。选择一种复杂且已知可在一系列预测模型问题上表现良好的机器学习方法,例如随机森林或梯度提升。评估问题的模型并将结果用作近似的高端基准,然后找到实现类似表现的最简单模型。
- 详尽搜索。评估您可以在问题上考虑的所有机器学习方法,并选择相对于基线实现最佳表现的方法。
“_ 开始高 _”方法很快,可以帮助您定义模型技能的界限以期待问题并找到可以获得类似结果的简单(例如 Occam Razor)模型。它还可以帮助您快速找出问题是否可解决/可预测,这很重要,因为并非所有问题都是可预测的。
“_ 穷举搜索 _”速度很慢,非常适合长期运行的项目,其中模型技能比几乎任何其他问题更重要。我经常对这种方法进行各种类似方法的批量测试,并称之为现场检查方法。
这两种方法都会为您提供一组模型表现分数,您可以将其与基线进行比较。
你会知道一个好的分数是什么样的,坏分数是什么样的。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
摘要
在这篇文章中,您发现您的预测性建模问题是唯一的,并且只能相对于基准表现知道良好的模型表现分数。
具体来说,你学到了:
- 可以使用基线模型来发现您的问题的表现基础,通过该基础模型可以评估所有其他模型。
- 鉴于数据和算法的随机性,所有预测模型都包含错误,并且在实践中不可能获得完美分数。
- 应用机器学习的真正工作是探索可能模型的空间,并发现相对于特定数据集的基线,良好的模型分数是什么样的。
你有任何问题吗?
在下面的评论中提出您的问题,我会尽力回答。
如何布局和管理您的机器学习项目
原文:
machinelearningmastery.com/how-to-layout-and-manage-your-machine-learning-project/
项目布局对于机器学习项目至关重要,就像软件开发项目一样。我认为它像语言。项目布局组织思想并为您提供想法的背景,就像知道事物的名称为您提供思考的基础一样。
在这篇文章中,我想强调一下在机器学习项目的布局和管理中的一些注意事项。这与项目和科学再现性的目标密切相关。没有“最佳”方式,您将需要选择并采用最能满足您的偏好和项目要求的实践。
工作流程激励问题
Jeromy Anglim 在 2010 年墨尔本 R 用户小组的演讲中介绍了 R 的项目布局状况。视频有点摇摇欲坠,但对该主题进行了很好的讨论。
<iframe allowfullscreen=“” frameborder=“0” height=“375” src=“https://www.youtube.com/embed/bbaPSJechgY?feature=oembed” width=“500”></iframe>
我非常喜欢 Jeromy 演讲中的动机问题:
- 将项目划分为文件和文件夹?
- 将 R 分析纳入报告?
- 将默认 R 输出转换为发布质量表,数字和文本?
- 建立最终产品?
- 对分析进行排序?
- 将代码划分为函数?
您可以在 Jeromy 的博客, PDF 演示幻灯片和演示文稿的 YouTube 视频上查看演示文稿的摘要。
项目工作流程的目标
David Smith 在标题为 R 的工作流程的帖子中提供了他认为的良好项目工作流程目标的摘要。我认为这些非常好,在设计自己的项目布局时应该牢记这一点。
- 透明度:项目的逻辑和清晰布局,使读者更直观。
- 可维护性:使用文件和目录的标准名称轻松修改项目。
- 模块化:离散任务分为单独的脚本,只有一个责任。
- 可移植性:轻松将项目移动到另一个系统(相对路径和已知依赖项)
- 再现性:在未来或其他人中轻松运行并创建相同的人工制品。
- 效率:很少考虑元项目细节,比如工具,更多关于你正在解决的问题。
ProjectTemplate
John Myles White 有一个名为 ProjectTemplate 的 R 项目,旨在为统计分析项目自动创建一个定义良好的布局。它提供了自动加载和重叠数据的约定和实用程序。
ProjectTemplate 的徽标,用于布置 R 统计分析项目的项目。
项目布局比我想要的要大,但可以深入了解组织项目的高度结构化方式。
- cache :每次执行分析时不需要重新生成的预处理数据集。
- config :项目的配置设置
- 数据:原始数据文件。
- munge :预处理数据 munging 代码,其输出放在缓存中。
- src :统计分析脚本。
- diagnostics :用于诊断数据集是否存在损坏或异常值的脚本。
- doc :关于分析的文档。
- 图:从分析中创建的图表。
- lib :Helper 库函数但不是核心统计分析。
- logs :脚本输出和任何自动记录。
- 分析:用于对代码时序进行基准测试的脚本。
- 报告:输出报告和可能会进入报告(如表格)的内容。
- 测试:代码的单元测试和回归套件。
- README :指出任何新人参与项目的注释。
- TODO :您计划进行的未来改进和错误修复列表。
您可以在 ProjectTemplate 主页,John 的网站上的博客文章 GitHub 页面进行开发以及 CRAN 页面进行分发了解更多信息。
数据管理
Software Carpentry 提供了一个标题为“数据管理”的简短演示文稿。数据管理方法的灵感来自 William Stafford Noble 题为组织计算生物学项目快速指南的文章。
<iframe allowfullscreen=“” frameborder=“0” height=“375” src=“https://www.youtube.com/embed/3MEJ38BO6Mo?feature=oembed” width=“500”></iframe>
该演示文稿描述了在磁盘或版本控制中维护多个版本数据的问题。它评论了数据存档的主要要求,并提出了一种日期目录名称和数据文件元数据文件的方法,这些文件本身是在版本控制中管理的。这是一个有趣的方法。
您可以在此处查看视频和幻灯片以进行演示。
最佳实践
关于问答网站上的数据分析项目的项目布局和代码组织的最佳实践有很多讨论。例如,一些流行的例子包括:
一个很好的例子是问题如何有效地管理统计分析项目? 变成了一个描述最佳实践的社区维基。总之,这些做法分为以下几个部分:
- 数据管理:使用目录结构,永远不要直接修改原始数据,检查数据一致性,使用 GNU make。
- 编码:将代码组织成功能单元,将所有内容,自定义函数记录在专用文件中。
- 分析:记录随机种子,将参数分成配置文件,使用多变量图
- 版本控制:使用版本控制,备份所有内容,使用问题跟踪器。
- 编辑/报告:组合代码和报告并使用正式的报告生成器。
更多实践
每个项目我都试图改进我的项目布局。这很难,因为项目因数据和目标而异,语言和工具也是如此。我已经尝试了所有已编译的代码和所有脚本语言版本。我发现的一些好建议包括:
- 坚持 POSIX 文件系统布局(var,etc,bin,lib 等)。
- 将所有命令放在脚本中。
- 从 GNU make 目标调用所有脚本。
- 制作创建环境和下载公共数据集的目标。
- 创建秘籍并让基础结构检查并创建每次运行的任何缺少的输出产品。
最后一点是游戏改变者。它允许您管理工作流程并定义秘籍,并放弃数据分析,预处理,模型配置,功能选择等任务。框架知道如何执行秘籍并创建结果供您查看。 我在之前谈过这种方法。
您如何布局和组织机器学习项目?发表评论。
如何为机器学习准备数据
原文:
machinelearningmastery.com/how-to-prepare-data-for-machine-learning/
机器学习算法从数据中学习。您需要为要解决的问题提供正确的数据至关重要。即使您拥有良好的数据,也需要确保它具有有用的规模,格式,甚至包含有意义的功能。
在这篇文章中,您将学习如何为机器学习算法准备数据。这是一个很大的主题,您将涵盖必需品。
大量数据
照片归属于 cibomahto ,部分版权所有
数据准备过程
您处理数据的纪律越严格,您可能会获得更一致和更好的结果。为机器学习算法准备数据的过程可以分为三个步骤:
- 第 1 步:选择数据
- 第 2 步:预处理数据
- 步骤 3 :变换数据
您可以以线性方式遵循此过程,但很可能是使用多个循环进行迭代。
第 1 步:选择数据
此步骤涉及选择要使用的所有可用数据的子集。总是强烈希望包含所有可用的数据,“更多更好”的格言将成立。这可能是也可能不是。
您需要考虑实际需要哪些数据来解决您正在处理的问题。对您需要的数据做一些假设,并小心记录这些假设,以便您可以在以后需要时进行测试。
以下是一些有助于您思考此过程的问题:
- 您可获得的数据范围是多少?例如,通过时间,数据库表,连接系统。确保您清楚地了解可以使用的所有内容。
- 您希望哪些数据不可用?例如,未记录或无法记录的数据。您可以导出或模拟此数据。
- 您需要哪些数据才能解决问题?排除数据几乎总是比包含数据更容易。记下您排除的数据以及原因。
它只是在小问题中,比如已经为您选择了数据的竞赛或玩具数据集。
第 2 步:预处理数据
选择数据后,您需要考虑如何使用数据。此预处理步骤是将所选数据转换为可以使用的表单。
三个常见的数据预处理步骤是格式化,清理和采样:
- 格式化:您选择的数据可能不是适合您使用的格式。数据可能位于关系数据库中,您希望它位于平面文件中,或者数据可能采用专有文件格式,您希望它位于关系数据库或文本文件中。
- 清洁:清洁数据是删除或修复缺失数据。可能存在不完整的数据实例,并且不包含您认为解决问题所需的数据。可能需要删除这些实例。此外,某些属性中可能存在敏感信息,这些属性可能需要完全匿名或从数据中删除。
- 采样:可能存在的选择数据远远多于您需要使用的数据。更多数据可能导致算法运行时间更长,计算和内存需求更大。在考虑整个数据集之前,您可以采用所选数据的较小代表性样本,这样可以更快地探索和原型化解决方案。
您在数据上使用的机器学习工具很可能会影响您需要执行的预处理。您可能会重新访问此步骤。
这么多数据
照片归功于 Marc_Smith ,保留一些权利
第 3 步:转换数据
最后一步是转换过程数据。您正在使用的特定算法和问题域的知识将影响此步骤,当您处理问题时,您很可能不得不重新审视预处理数据的不同转换。
三种常见的数据转换是缩放,属性分解和属性聚合。此步骤也称为特征工程。
- 缩放:预处理数据可能包含各种数量的混合尺度的属性,如美元,千克和销售量。许多机器学习方法(如数据属性)具有相同的比例,例如 0 到 1 之间的最小值和给定特征的最大值。考虑您可能需要执行的任何功能扩展。
- 分解:可能存在表示复杂概念的特征,当分成组成部分时,这些特征可能对机器学习方法更有用。一个例子是可能具有日期和时间组件的日期,而日期和时间组件又可以进一步拆分。也许只有一天中的小时与正在解决的问题相关。考虑您可以执行哪些功能分解。
- 聚合:可能有一些功能可以聚合到一个功能中,这对您尝试解决的问题更有意义。例如,每次客户登录系统时可能存在数据实例,该系统可以聚合为登录数的计数,从而允许丢弃其他实例。考虑哪种类型的功能聚合可以执行。
您可以花费大量时间从数据中获取工程特性,这对算法的表现非常有益。从小做起,以你学到的技能为基础。
摘要
在这篇文章中,您了解了机器学习数据准备的本质。您在每个步骤中发现了数据准备和策略的三步框架:
- 步骤 1:数据选择考虑可用的数据,缺少的数据以及可以删除的数据。
- 步骤 2:数据预处理通过格式化,清理和采样来组织您选择的数据。
- 步骤 3:数据转换通过使用缩放,属性分解和属性聚合的工程特征,转换为机器学习做好准备的预处理数据。
数据准备是一个很大的主题,可能涉及大量的迭代,探索和分析。擅长数据准备将使您成为机器学习的大师。目前,在准备数据时只考虑本文中提出的问题,并始终寻找更清晰的方式来表示您试图解决的问题。
资源
如果您希望深入了解此主题,可以在以下资源中了解更多信息。
- 从数据挖掘到数据库中的知识发现,1996
- 使用开源工具进行数据分析(会员链接),第一部分
- 黑客机器学习(会员链接),第二章:数据探索
- 数据挖掘:实用机器学习工具和技术(会员链接),第七章:转换:设计输入和输出
您是否有一些数据准备过程提示和技巧。请留下评论并分享您的经验。
如何减少最终机器学习模型中的方差
原文:
machinelearningmastery.com/how-to-reduce-model-variance/
最终的机器学习模型是对所有可用数据进行训练的模型,然后用于对新数据做出预测。
大多数最终模型的一个问题是它们的预测会出现差异。
这意味着每次适合模型时,您会得到一组略有不同的参数,这些参数反过来会使预测略有不同。有时候比你想象的更多,有时甚至更少。
这可能令人沮丧,尤其是当您希望将模型部署到操作环境中时。
在这篇文章中,您将了解如何考虑最终模型中的模型方差以及可用于减少最终模型预测方差的技术。
阅读这篇文章后,你会知道:
- 最终模型预测的方差问题。
- 在估计参数时,如何测量模型方差以及如何解决方差。
- 您可以使用的技术来减少最终模型的预测差异。
让我们开始吧。
如何减少最终机器学习模型中的差异
照片由 Kirt Edblom 拍摄,保留一些权利。
最终模型
一旦您发现哪个模型和模型超参数可以获得数据集的最佳技能,您就可以准备最终模型了。
对所有可用数据进行最终模型训练,例如:训练和测试集。
如果您不知道结果,那么您将使用该模型对新数据做出预测。
最终模型是您应用的机器学习项目的结果。
要了解有关准备最终模型的更多信息,请参阅帖子:
偏见和差异
偏方差权衡是应用机器学习中的一个概念性思想,有助于理解模型中的误差来源。
- 偏差是指学习算法中的假设,它缩小了可以学习的范围。这是有用的,因为它可以加速学习并导致稳定的结果,代价是与现实不同的假设。
- 方差是指学习算法对训练数据的细节的敏感性,例如,噪音和具体观察。这是好的,因为模型将专门用于数据,代价是学习随机噪声并且每次在不同数据上训练时都会变化。
偏方差权衡是一种概念工具,可以考虑这些误差来源以及它们如何始终保持平衡。
算法中的偏差越大意味着方差越小,反之亦然。
您可以在此帖子中了解有关偏差变化权衡的更多信息:
你可以控制这种平衡。
许多机器学习算法都有超参数,直接或间接允许您控制偏方差权衡。
例如,k
- 最近邻居中的k
是一个例子。小k
导致具有高方差和低偏差的预测。大k
导致预测具有小的方差和大的偏差。
最终模型中的方差问题
大多数最终模型都存在问题:它们存在差异。
每次通过具有高方差的算法训练模型时,您将得到略微不同的结果。
反过来,稍微不同的模型会做出稍微不同的预测,无论好坏。
这是训练最终模型的一个问题,因为我们需要使用该模型对我们不知道答案的真实数据做出预测,并且我们希望这些预测尽可能好。
我们希望获得我们可以获得的最佳模型版本。
我们希望方差对我们有利。
如果我们无法实现这一点,至少我们希望方差在做出预测时不会落在我们身上。
测量最终模型中的方差
最终模型中有两种常见的差异来源:
- 训练数据中的噪音。
- 在机器学习算法中使用随机性。
我们上面介绍的第一种类型。
第二种类型影响那些在学习过程中利用随机性的算法。
三个常见的例子包括:
- 随机森林中随机分裂点的选择。
- 神经网络中的随机权重初始化。
- 以随机梯度下降的方式改组训练数据。
您可以使用训练数据测量特定模型中的两种差异类型。
- 测量算法方差:通过在同一训练数据集上重复算法评估并计算模型技能的方差或标准差,可以测量算法的随机性引入的方差。
- 测量训练数据方差:训练数据引入的方差可以通过在不同训练数据样本上重复算法评估来测量,但保持伪随机数发生器的种子固定然后计算方差或模型技能的标准差。
通常,通过在训练数据集上运行重复的 k 折交叉验证然后计算模型技能的方差或标准偏差来估计组合方差。
减少估计的方差
如果我们想减少预测中的方差量,我们必须增加偏差。
考虑人口参数的简单统计估计的情况,例如从小的随机数据样本估计平均值。
对均值的单一估计将具有高方差和低偏差。
这是直观的,因为如果我们重复这个过程 30 次并计算估计平均值的标准偏差,我们会看到很大的差异。
减少方差的解决方案也很直观。
对来自域的许多不同的小数据样本重复估计,并根据中心极限定理计算估计的平均值。
估计平均值的平均值将具有较低的方差。我们假设估算的平均值比单一估算值更准确,我们增加了偏差。
另一种方法是大幅增加我们估计人口平均值的数据样本的大小,依赖于大数的定律。
减少最终模型的差异
用于减少总体统计量方差的原则也可用于减少最终模型的方差。
我们必须增加偏见。
根据最终模型的具体形式(例如树,重量等),您可以通过这个想法获得创意。
以下是您可能想要尝试的三种方法。
如果可能的话,我建议设计一个测试工具来试验并发现一种最适合您的方法,或者对您的特定数据集和机器学习算法最有意义的方法。
1.最终模型的集合预测
您可以安装多个最终模型,而不是安装单个最终模型。
最终模型组可以一起用作整体。
对于给定的输入,集合中的每个模型做出预测,并且最终输出预测被视为模型的预测的平均值。
灵敏度分析可用于测量集合大小对预测方差的影响。
2.最终模型的集合参数
如上所述,可以创建多个最终模型而不是单个最终模型。
不是从最终模型计算预测的平均值,而是可以将单个最终模型构造为最终模型组的参数的集合。
这只有在每个模型具有相同数量的参数(例如神经网络权重或回归系数)的情况下才有意义。
例如,考虑具有三个系数[b0,b1,b2]的线性回归模型。我们可以拟合一组线性回归模型,并计算最终 b0 作为每个模型中 b0 参数的平均值,并对 b1 和 b2 重复此过程。
同样,灵敏度分析可用于测量集合大小对预测方差的影响。
3.增加训练数据集大小
依靠大数定律,也许最简单的减少模型方差的方法是使模型适合更多的训练数据。
在那些不容易获得更多数据的情况下,也许可以使用数据增强方法。
建议对训练数据集大小与预测方差进行灵敏度分析,以找出收益递减点。
脆弱的思考
有一些方法可以准备最终模型,旨在让最终模型中的方差为您而不是对您起作用。
这些方法的共性是它们寻求单一最佳最终模型。
两个例子包括:
- 为什么不修理随机种子? 您可以在拟合最终模型时修复随机种子。这将限制由算法的随机性引入的方差。
- 为什么不早点停车? 您可以在训练期间检查模型的技能,并在保持集上的模型技能开始降低时停止训练。
我认为这些方法和其他类似方法都很脆弱。
也许你可以赌博并瞄准差异,以对你有利。这对于机器学习竞赛来说可能是一个很好的方法,因为没有真正的缺点就是失去赌博。
我不会。
我认为瞄准最佳平均表现并限制下行更为安全。
我认为,导航最终模型的偏方差权衡的技巧是在样本中思考,而不是单个模型。优化平均模型表现。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
摘要
在这篇文章中,您发现了如何考虑最终模型中的模型方差以及可用于减少最终模型预测方差的技术。
具体来说,你学到了:
- 最终模型预测的方差问题。
- 在估计参数时,如何测量模型方差以及如何解决方差。
- 您可以使用的技术来减少最终模型的预测差异。
你有任何问题吗?
在下面的评论中提出您的问题,我会尽力回答。