从头学习机器学习在Python中的工作流程,第1部分:数据准备
2018-01-07 20:56 文章来自:FintechProbe编译 收藏(0) 阅读(1865) 评论(0)

IFTNEWS:似乎机器学习的观念往往被简化为向越来越多的图书馆和API传递一系列的论据,希望获得魔法,并等待结果。也许您对这些库中的内容非常了解 - 从数据准备到模型构建到结果解析和可视化等等,但是您仍然依靠这些不同的工具来完成工作。

这很好。使用经过充分测试和验证的工具实现常规任务是很有意义的。无论您是使用开源还是专有工具来完成您的工作,这些实施都由个人组成的团队完成,他们确保你掌握了完成目标的最好的质量工具。

然而,即使作为一种教育工作,自己做这种肮脏的工作往往也是有价值的。我不会建议从头开始编写自己的分布式深度学习培训框架 - 至少,通常不是这样 - 但是经历了从头开始编写自己的算法实现和支持工具的试验和磨难,这是一个伟大的想法。我可能是错的,但我不认为今天绝大多数学习机器学习、数据科学、人工智能或“插入相关的流行词”的人实际上是这样做的。

那么让我们用Python构建一些机器学习工作流程。从头开始。

我们从“从零开始”是什么意思?

首先,让我们澄清一下:当我说“从头开始”的时候,我的意思是尽可能少地帮助他们。这一切都是相对的,但是为了我们的目的, 我将在这一边写我们自己的矩阵、数据框和/或图形库,并且我们将分别依赖于numpypandasmatplotlib。在某些情况下,我们甚至不会使用这些库的所有可用功能,因为我们很快就会看到,以更好的理解为名绕过它们。标准Python库中的任何内容都是公平的。然而,除此之外,我们还是靠自己。

我们需要从某个地方开始,所以这篇文章将从一些简单的数据准备任务开始。我们要慢慢开始,但在我们感觉到自己在做什么之后,在接下来的几篇文章中迅速提高。除了数据准备之外,我们还需要额外的数据转换、结果解释和可视化工具 - 更不用说机器学习算法 - 来完成我们将要完成的所有工作。

我们的想法是将我们需要的任何非琐碎的功能手工地拼凑在一起,以完成我们的机器学习任务。随着系列的展开,我们可以添加新的工具和算法,以及重新思考我们以前的一些假设,使整个过程尽可能地迭代。一步一步,我们将专注于我们的目标,制定如何实现它们,用Python实现它们,然后测试它们是否工作。

正如目前所设想的那样,最终结果将是一组简单的Python模块,这些模块被组织到我们自己的简单机器学习库中。对于外行来说,我相信这对于理解机器学习过程、工作流和算法是如何工作的,将是非常宝贵的经验。

我们的工作流程意味着什么?

工作流对于不同的人来说意味着不同的东西,但是我们通常讨论的是被认为是机器学习项目的一部分的整个过程。有很多过程框架可以帮助我们跟踪我们正在做的事情,但是我们现在简化一下,包括以下内容:

获取一些数据

处理和/或准备数据

建立一个模型

解释结果

我们可以随心所欲地进行扩展,但这是我们现在简单的机器学习过程框架。此外,“管道”意味着将工作流程功能链接在一起的能力,因此我们也将继续坚持这一点。


获取我们的数据

在构建任何模型之前,我们需要一些数据,并且需要确保这些数据符合一些合理的预期。为了测试目的(不是为了培训/测试,而是测试我们的基础设施),我们将使用虹膜数据集,您可以在参看底部的注释1鉴于数据集的各种版本都可以在网上找到,我建议我们都从相同的原始数据开始,以确保所有的准备步骤都有效。

让我们来看看:

考虑到我们对这样一个简单的数据集及其文件的了解,让我们首先考虑一下从原始数据到结果需要做些什么:

数据存储在CSV文件中

实例主要由数字属性值组成

类分类文本

现在,以上所有内容都不适用于所有数据集,但是对于此数据集也没有任何特定的数据集。 这为我们提供了编写代码的机会,我们希望稍后可以重用。 我们将重点关注的良好编码实践将包括可重用性和模块性。

一些简单的探索性数据分析如下所示:

虹膜数据集的非常简单的探索性数据分析:数据集的描述(上面)和默认属性分布直方图(下面)。

 

准备我们的数据

虽然在这个特定场景中我们需要的数据准备是最少的,但是仍然有一些需要。具体来说,我们需要确保我们对标题行进行解释,删除熊猫自动执行的任何索引,并将我们的类值从名义值转换为数值。由于在我们将用于建模的特性中没有标称值,因此不需要进行更复杂的转换——至少目前还没有。

最终,我们还需要一个更好的数据表示方法,因此我们将确保在我们继续之前,我们最终会得到一个矩阵或者numpyndarray。 我们的数据准备工作流程应该采取以下形式:


另外请注意,没有理由相信所有感兴趣的数据都以逗号分隔的文件存储。 我们可能希望从SQL数据库获取数据,或者直接从网络获取数据,将来我们还将访问这些数据。

首先,让我们编写一个简单的函数,将CSV文件加载到DataFrame;当然,这样做很简单,但是在前面考虑一下,我们可能想在未来的数据集加载函数中添加一些额外的步骤。相信我在这里。




这段代码非常简单。逐行读取数据文件允许进行一些额外的预处理,例如忽略非数据行(我们假设数据文件中的注释以“#”开头,但是很荒谬)。我们可以指定数据集文件是否包含header,并且我们也允许CSVTSV文件,CSV是默认文件。

虽然存在一些错误检查,但它还不是非常强大,因此我们可能希望稍后再讨论这个问题。逐行读取文件并决定如何处理这些行将比使用内置功能直接读取干净,符合标准的CSV文件直接放入DataFrame中更慢,但要考虑更多在这个阶段灵活性是值得的(但可能需要更长的文件)。不要忘记,如果其中一些内部工作看起来不是最好的方法,我们随时都可以做出改变。

在尝试我们的代码之前,首先需要编写一个函数来将名义类值转换为数值。为了概括该函数,我们应该允许它在数据集中的任何属性上使用,而不仅仅是类。我们还应该跟踪属性名称的映射到最终的整数。鉴于我们之前将CSVTSV数据文件加载到pandas DataFrame中,这个函数应该接受pandas DataFrame,以及要转换为数字的属性名称。

另外请注意,我们正在回避关于使用热门编码与分类非类属性相关的讨论,但是我怀疑我们稍后会回到这个问题。

 


上述功能同样简单,但是完成了我们想要的功能。 我们可以用许多不同的方法来处理这个任务,包括使用pandas的内置功能。

现在我们可以从文件中加载一个数据集,并用数值代替分类属性值(我们也保留了这些映射的字典供以后使用)。 如前所述,我们希望我们的数据集最终以numpy ndarray的形式出现,以便将其与我们的算法一起使用。 再次,一个简单的任务,但将其作为一个功能,将允许我们在未来的基础上,如果有必要的话。

 

即使前面的任何函数看起来不像overkill,这一函数可能也会。但容忍我;我们实际上遵循的是合理的编程原则。我们将会对我们迄今为止所构建的功能做出改变或增加。能够在一个地方实现这些更改,并有良好的文档记录,从长远来看是有意义的。

测试我们的数据准备工作流程

到目前为止,工作流仍然是构建块表单,但是让我们给代码做一个测试。

 


当我们的代码按照我们希望的那样工作的时候,让我们做一些快速的房子清洁。一旦我们的代码滚动,我们将为我们的代码提出一个更全面的组织结构,但现在我们应该将所有这些功能添加到单个文件,并将其保存为dataset.py。这将允许更方便的重用,我们将在下次看到。

注释1sepal_length,sepal_width,petal_length,petal_width,species

5.1,3.5,1.4,0.2,setosa

4.9,3,1.4,0.2,setosa

4.7,3.2,1.3,0.2,setosa

4.6,3.1,1.5,0.2,setosa

5,3.6,1.4,0.2,setosa

5.4,3.9,1.7,0.4,setosa

4.6,3.4,1.4,0.3,setosa

5,3.4,1.5,0.2,setosa

4.4,2.9,1.4,0.2,setosa

4.9,3.1,1.5,0.1,setosa

5.4,3.7,1.5,0.2,setosa

4.8,3.4,1.6,0.2,setosa

4.8,3,1.4,0.1,setosa

4.3,3,1.1,0.1,setosa

5.8,4,1.2,0.2,setosa

5.7,4.4,1.5,0.4,setosa

5.4,3.9,1.3,0.4,setosa

5.1,3.5,1.4,0.3,setosa

5.7,3.8,1.7,0.3,setosa

5.1,3.8,1.5,0.3,setosa

5.4,3.4,1.7,0.2,setosa

5.1,3.7,1.5,0.4,setosa

4.6,3.6,1,0.2,setosa

5.1,3.3,1.7,0.5,setosa

4.8,3.4,1.9,0.2,setosa

5,3,1.6,0.2,setosa

5,3.4,1.6,0.4,setosa

5.2,3.5,1.5,0.2,setosa

5.2,3.4,1.4,0.2,setosa

4.7,3.2,1.6,0.2,setosa

4.8,3.1,1.6,0.2,setosa

5.4,3.4,1.5,0.4,setosa

5.2,4.1,1.5,0.1,setosa

5.5,4.2,1.4,0.2,setosa

4.9,3.1,1.5,0.1,setosa

5,3.2,1.2,0.2,setosa

5.5,3.5,1.3,0.2,setosa

4.9,3.1,1.5,0.1,setosa

4.4,3,1.3,0.2,setosa

5.1,3.4,1.5,0.2,setosa

5,3.5,1.3,0.3,setosa

4.5,2.3,1.3,0.3,setosa

4.4,3.2,1.3,0.2,setosa

5,3.5,1.6,0.6,setosa

5.1,3.8,1.9,0.4,setosa

4.8,3,1.4,0.3,setosa

5.1,3.8,1.6,0.2,setosa

4.6,3.2,1.4,0.2,setosa

5.3,3.7,1.5,0.2,setosa

5,3.3,1.4,0.2,setosa

7,3.2,4.7,1.4,versicolor

6.4,3.2,4.5,1.5,versicolor

6.9,3.1,4.9,1.5,versicolor

5.5,2.3,4,1.3,versicolor

6.5,2.8,4.6,1.5,versicolor

5.7,2.8,4.5,1.3,versicolor

6.3,3.3,4.7,1.6,versicolor

4.9,2.4,3.3,1,versicolor

6.6,2.9,4.6,1.3,versicolor

5.2,2.7,3.9,1.4,versicolor

5,2,3.5,1,versicolor

5.9,3,4.2,1.5,versicolor

6,2.2,4,1,versicolor

6.1,2.9,4.7,1.4,versicolor

5.6,2.9,3.6,1.3,versicolor

6.7,3.1,4.4,1.4,versicolor

5.6,3,4.5,1.5,versicolor

5.8,2.7,4.1,1,versicolor

6.2,2.2,4.5,1.5,versicolor

5.6,2.5,3.9,1.1,versicolor

5.9,3.2,4.8,1.8,versicolor

6.1,2.8,4,1.3,versicolor

6.3,2.5,4.9,1.5,versicolor

6.1,2.8,4.7,1.2,versicolor

6.4,2.9,4.3,1.3,versicolor

6.6,3,4.4,1.4,versicolor

6.8,2.8,4.8,1.4,versicolor

6.7,3,5,1.7,versicolor

6,2.9,4.5,1.5,versicolor

5.7,2.6,3.5,1,versicolor

5.5,2.4,3.8,1.1,versicolor

5.5,2.4,3.7,1,versicolor

5.8,2.7,3.9,1.2,versicolor

6,2.7,5.1,1.6,versicolor

5.4,3,4.5,1.5,versicolor

6,3.4,4.5,1.6,versicolor

6.7,3.1,4.7,1.5,versicolor

6.3,2.3,4.4,1.3,versicolor

5.6,3,4.1,1.3,versicolor

5.5,2.5,4,1.3,versicolor

5.5,2.6,4.4,1.2,versicolor

6.1,3,4.6,1.4,versicolor

5.8,2.6,4,1.2,versicolor

5,2.3,3.3,1,versicolor

5.6,2.7,4.2,1.3,versicolor

5.7,3,4.2,1.2,versicolor

5.7,2.9,4.2,1.3,versicolor

6.2,2.9,4.3,1.3,versicolor

5.1,2.5,3,1.1,versicolor

5.7,2.8,4.1,1.3,versicolor

6.3,3.3,6,2.5,virginica

5.8,2.7,5.1,1.9,virginica

7.1,3,5.9,2.1,virginica

6.3,2.9,5.6,1.8,virginica

6.5,3,5.8,2.2,virginica

7.6,3,6.6,2.1,virginica

4.9,2.5,4.5,1.7,virginica

7.3,2.9,6.3,1.8,virginica

6.7,2.5,5.8,1.8,virginica

7.2,3.6,6.1,2.5,virginica

6.5,3.2,5.1,2,virginica

6.4,2.7,5.3,1.9,virginica

6.8,3,5.5,2.1,virginica

5.7,2.5,5,2,virginica

5.8,2.8,5.1,2.4,virginica

6.4,3.2,5.3,2.3,virginica

6.5,3,5.5,1.8,virginica

7.7,3.8,6.7,2.2,virginica

7.7,2.6,6.9,2.3,virginica

6,2.2,5,1.5,virginica

6.9,3.2,5.7,2.3,virginica

5.6,2.8,4.9,2,virginica

7.7,2.8,6.7,2,virginica

6.3,2.7,4.9,1.8,virginica

6.7,3.3,5.7,2.1,virginica

7.2,3.2,6,1.8,virginica

6.2,2.8,4.8,1.8,virginica

6.1,3,4.9,1.8,virginica

6.4,2.8,5.6,2.1,virginica

7.2,3,5.8,1.6,virginica

7.4,2.8,6.1,1.9,virginica

7.9,3.8,6.4,2,virginica

6.4,2.8,5.6,2.2,virginica

6.3,2.8,5.1,1.5,virginica

6.1,2.6,5.6,1.4,virginica

7.7,3,6.1,2.3,virginica

6.3,3.4,5.6,2.4,virginica

6.4,3.1,5.5,1.8,virginica

6,3,4.8,1.8,virginica

6.9,3.1,5.4,2.1,virginica

6.7,3.1,5.6,2.4,virginica

6.9,3.1,5.1,2.3,virginica

5.8,2.7,5.1,1.9,virginica

6.8,3.2,5.9,2.3,virginica

6.7,3.3,5.7,2.5,virginica

6.7,3,5.2,2.3,virginica

6.3,2.5,5,1.9,virginica

6.5,3,5.2,2,virginica

6.2,3.4,5.4,2.3,virginica

5.9,3,5.1,1.8,virginica



原作者:Matthew Mayo, KDnuggets.

来源:kdnuggets

编译:FintechProbe