# 如何改进机器学习结果

> 原文： [https://machinelearningmastery.com/how-to-improve-machine-learning-results/](https://machinelearningmastery.com/how-to-improve-machine-learning-results/)

拥有一个或两个在问题上表现相当好的算法是一个良好的开端，但有时您可能会受到激励以获得最佳结果，您可以获得可用的时间和资源。

在这篇文章中，您将了解可用于挤出额外表现的方法，并改进从机器学习算法中获得的结果。

调整算法时，您必须对测试工具给出的结果有很高的信心。这意味着您应该使用减少用于评估算法运行的表现度量方差的技术。我建议使用相当多的折叠进行交叉验证（确切的数量取决于您的数据集）。

![Tuning Fork](img/d3d2c2eb1cd54b58094f02d7e99ee5d1.jpg)

Tuning Fork
照片归属于 [eurok](http://www.flickr.com/photos/21025851@N00/2169196138/sizes/l/) ，保留一些权利

您将在本文中了解的三个策略是：

*   算法调整
*   合奏
*   极限特征工程

## 算法调整

开始的地方是从您已经知道的对您的问题表现良好的算法中获得更好的结果。您可以通过探索和微调这些算法的配置来实现此目的。

机器学习算法被参数化，并且那些参数的修改可以影响学习过程的结果。将每个算法参数视为图形上的维度，其中给定参数的值作为沿轴的点。三个参数将是算法的可能配置的立方体，并且n参数将是算法的可能配置的n维超立方体。

算法调整的目的是为您的问题找到超立方体中的最佳点。您将针对您的测试工具进行优化，因此您再也不能低估花时间构建可信测试工具的重要性。

您可以通过使用自动化方法来处理此搜索问题，该方法在可能性空间和可能具有良好算法配置的示例上强加网格。然后，您可以在优化算法中使用这些点来放大最佳表现。

您可以使用一些表现良好的方法重复此过程，并探索每种方法可以实现的最佳效果。我强烈建议该过程是自动化的并且合理粗糙，因为您可以快速达到可能无法转化为生产系统的收益递减点（表现百分比增加）。

算法参数调整得越多，算法对训练数据和测试工具的偏差就越大。这种策略可能是有效的，但它也可能导致更脆弱的模型过度使用你的测试工具并且在实践中表现不佳。

## 合奏

集合方法涉及组合多种方法的结果以获得改进的结果。当你有多个“足够好”的模型专门研究问题的不同部分时，集合方法很有效。

这可以通过许多方式实现。您可以探索的三种合奏策略是：

*   **Bagging** ：更正式地称为Bootstrapped Aggregation，相同的算法通过训练不同的训练数据子集对问题有不同的观点。
*   **Boosting** ：针对相同的训练数据训练不同的算法。
*   **混合**：更正式地称为Stacked Aggregation或Stacking是各种模型，其预测被作为新模型的输入，学习如何将预测结合到整体预测中。

在用尽更多传统方法之后进入合奏方法是个好主意。这有两个很好的理由，它们通常比传统方法更复杂，传统方法为您提供了良好的基础水平，您可以从中提高和绘制来创建您的合奏。

![Ensemble Learning](img/cfba110c8ae26c5fbd0effa78b447f48.jpg)

合奏学习
照片归属于 [ancasta1901](http://www.flickr.com/photos/antoniocastagna/8491556471/sizes/l/) ，部分版权所有

## 极限特征工程

前两个策略考虑了从机器学习算法中获得更多。这个策略是为了让学习算法的问题暴露出更多的结构。在数据准备中学习了有关特征分解和聚合的知识，以便更好地规范机器学习算法的数据。在这个策略中，我们将这个想法推向极限。我把这种策略称为极端特征工程，当真正的“特征工程”这个术语就足够了。

将您的数据视为嵌入其中的复杂多维结构，机器学习算法知道如何查找和利用以做出决策。您希望最好地将这些结构暴露给算法，以便算法可以做到最好。一个难点是这些结构中的一些可能太密集或太复杂而无法在没有帮助的情况下找到算法。您可能也从您的领域专业知识中了解此类结构。

获取属性并将它们广泛分解为多个功能。从技术上讲，您使用此策略所做的是将依赖关系和非线性关系简化为更简单的独立线性关系。

这可能是一个外国的想法，所以这里有三个例子：

*   **分类**：你有一个具有[红色，绿色蓝色]值的分类属性，你可以将它分成红色，绿色和蓝色的3个二进制属性，并为每个实例分别赋予1或0值。
*   **Real** ：你有一个实数值，其值介于0到1000之间。你可以创建10个二进制属性，每个属性代表一个值的bin（bin 1为0-99，bin 2为100-199）等）并为每个实例分配二进制值（1/0）。

我建议一步一步地执行此过程，并为每个修改创建一个新的测试/训练数据集，然后在数据集上测试算法。这将开始让您直观了解数据库中的属性和功能，这些属性和功能会向算法公开更多或更少的信息以及对表现度量的影响。您可以使用这些结果来指导进一步的极端分解或聚合。

## 摘要

在这篇文章中，您了解了三种策略，可以从您的问题中获得机器学习算法的改进结果：

*   算法调整通过模型参数空间将发现最佳模型的方式视为搜索问题。
*   组合多个模型所做预测的集合。
*   极限特征工程，其中数据准备中看到的属性分解和聚合被推到极限。

## 资源

如果您希望深入了解此主题，请查看以下资源。

*   [黑客机器学习](http://www.amazon.com/dp/1449303714?tag=inspiredalgor-20)，第12章：模型比较
*   [数据挖掘：实用机器学习工具和技术](http://www.amazon.com/dp/0123748569?tag=inspiredalgor-20)，第7章：转换：设计输入和输出
*   [统计学习要素：数据挖掘，推理和预测](http://www.amazon.com/dp/0387848576?tag=inspiredalgor-20)，第16章：集成学习

**更新**

有关从算法中获取更多信息的20个提示和技巧，请参阅帖子：

*   [如何提高深度学习效能](http://machinelearningmastery.com/improve-deep-learning-performance/)