在Python中加载机器学习数据教程
刚开始进行数据加载学习时,最好使用标准文件格式(如逗号分隔值 (.csv)),最好坚持使用小型内存数据集。
本教程主要介绍的内容是如何从头开始在Python中加载数据,具体内容有以下3方面:
如何加载 CSV 文件。
如何将字符串从文件转换为浮点数。
如何将类值从文件转换为整数。
基础准备
小型数据集的标准文件格式是逗号分隔值或CSV。
在最简单的形式中,CSV 文件由数据行组成。每行使用逗号 (“,”) 分为列。
您可以在RFC 4180:逗号分隔值 (CSV)文件的通用格式和MIME类型中了解有关CSV文件格式的更多信息。
传送门:https://datatracker.ietf.org/doc/html/rfc4180
在本教程中,我们要练习CSV格式加载两个不同的标准机器学习数据集。
数据集准备
皮马印第安人糖尿病数据集
第一个是皮马印第安人糖尿病数据集,该数据集有9 列768行。
文件中的所有值都是数字,特别是浮点值。我们需要首先学习如何加载文件,然后学习如何将加载的字符串转换为数值。
数据集文件:
https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv
数据集详细信息:
https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.names
鸢尾花物种数据集
我们使用的第二个数据集是鸢尾花数据集。
它包含150行和4列。前3列是数字。不同之处在于类值(最后一列)是一个字符串,表示花的种类。我们将学习如何将数字列从字符串转换为数字,以及如何将花种字符串转换为我们可以一致使用的整数。
数据集文件:
https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv
数据集详细信息:
https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.names
代码步骤
准备好数据集之后,教程正式开始。加载自己的数据所需的基础步骤:
加载文件。
加载文件并将字符串转换为浮点数。
加载文件并将字符串转换为整数。
1.加载CSV文件
第一步是加载 CSV 文件。
我们将使用作为标准库一部分的csv模块。
csv模块中的reader()函数将文件作为参数。
我们将创建一个名为load_csv()的函数来包装此行为,该行为将采用文件名并返回我们的数据集。我们将加载的数据集表示为列表列表。第一个列表是观察值或行的列表,第二个列表是给定行的列值列表。
以下是加载CSV文件的完整功能的代码:
我们可以通过加载Pima Indians数据集来测试这个功能。下载数据集并将其放置在名为pima-indians-diabetes.csv的当前工作目录中。打开文件并删除底部的所有空行。
查看原始数据文件的前5行,我们可以看到以下内容:
数据是数字并用逗号分隔,我们可以期望整个文件满足这个期望。
让我们使用新函数并加载数据集。加载后,我们可以报告一些简单的详细信息,例如加载的行数和列数。
将所有这些放在一起,我们得到以下内容:
运行这个例子我们看到:
这个函数的一个限制是它会从数据文件中加载空行并将它们添加到我们的行列表中。我们可以通过一次向我们的数据集添加一行数据并跳过空行来克服这个问题。
下面是使用这个新改进版本的load_csv()函数的更新示例。
运行这个例子我们看到:
2. 将字符串转换为浮点数
机器学习算法数据中首选浮点数。
我们加载CSV文件的代码将数据集作为列表列表返回,但每个值都是一个字符串。如果我们从数据集中打印出一条记录,我们可以看到这一点:
这会产生如下输出:
我们可以编写一个小函数来将加载的数据集的特定列转换为浮点值。
下面是这个名为str_column_to_float() 的函数。它将数据集中的给定列转换为浮点值,在进行转换之前小心地从值中去除任何空格。
我们可以通过结合上面的加载 CSV 函数来测试这个函数,并将 Pima Indians 数据集中的所有数字数据转换为浮点值。
完整示例如下。
运行这个例子,我们看到数据集的第一行在转换之前和之后都打印出来。我们可以看到每列中的值都已从字符串转换为数字。
3. 将字符串转换为整数
鸢尾花数据集类似于 Pima Indians 数据集,其中列包含数字数据。
区别在于最后一列,传统上用于保存给定行要预测的结果或值。鸢尾花数据中的最后一列是作为字符串的鸢尾花种类。
下载数据集并将其放置在当前工作目录中,文件名为iris.csv。打开文件并删除底部的所有空行。
例如,下面是原始数据集的前 5 行。
一些机器学习算法更喜欢所有值都是数字,包括结果或预测值。
我们可以通过创建地图将鸢尾花数据集中的类值转换为整数。
首先,我们找到所有唯一的类值,它们恰好是:Iris-setosa、Iris-versicolor 和 Iris-virginica。
接下来,我们为每个分配一个整数值,例如:0、1 和 2。
最后,我们用相应的整数值替换所有出现的类字符串值。
下面是一个名为str_column_to_int()的函数。与之前介绍的str_column_to_float() 一样,它对数据集中的单个列进行操作。
除了前两个用于加载CSV文件和将列转换为浮点值的函数之外,我们还可以测试这个新函数。它还返回类值到整数值的字典映射,以防下游用户想要再次将预测转换回字符串值。
下面的示例加载 iris 数据集,然后将前3列转换为浮点数,将最后一列转换为整数值。
运行这个例子会产生下面的输出。
我们可以看到数据类型转换前后数据集的第一行。我们还可以看到类值到整数的字典映射。
考虑到每个问题可能需要进行各种数据清理和转换,数据加载就是一项艰巨的任务。
总结
我们可以进行许多扩展,以使这些示例对新的和不同的数据文件更加好用。可以考虑自己研究和实施一下下面的想法:
检测并删除文件顶部或底部的空行。
检测和处理列中的缺失值。
检测和处理与文件其余部分的预期不匹配的行。
支持其他分隔符,例如“|”(pipe)或空白。
支持更高效的数据结构,如数组。
