1. 首页
  2. 技术文章

如何在Python中加载机器学习数据

您必须先知道如何加载数据,然后才能使用它来训练机器学习模型。

如何在Python中加载机器学习数据

刚开始时,最好使用标准文件格式(如逗号分隔值(.csv))来保留较小的内存数据集。

在本教程中,您将发现如何从头开始在Python中加载数据,包括:

  • 如何加载CSV文件。
  • 如何将字符串从文件转换为浮点数。
  • 如何将类值从文件转换为整数。

本教程分为3部分:

  1. 加载文件。
  2. 加载文件并将字符串转换为Floats。
  3. 加载文件并将字符串转换为整数。

这些步骤将为您处理加载自己的数据提供基础。

1.加载CSV文件

第一步是加载CSV文件。

我们将使用csv模块标准库中。

csv模块中的reader()函数将文件作为参数。

我们将创建一个名为load_csv()的函数来包装此行为,该行为将采用文件名并返回我们的数据集。我们将加载的数据集表示为列表列表。第一个列表是观察值或行的列表,第二个列表是给定行的列值的列表。

以下是加载CSV文件的完整功能。

from csv import reader

Load a CSV file

def load_csv(filename):
file = open(filename, “r”)
lines = reader(file)
dataset = list(lines)
return dataset

我们可以通过加载Pima Indians数据集来测试此功能。下载数据集并将其放置在名称为pima-indians-diabetes.csv的当前工作目录中。打开文件并删除底部的所有空行。

看一下原始数据文件的前5行,我们可以看到以下内容:

6,148,72,35,0,33.6,0.627,50,1

1,85,66,29,0,26.6,0.351,31,0

8,183,64,0,0,23.3,0.672,32,1

1,89,66,23,94,28.1,0.167,21,0

0,137,40,35,168,43.1,2.288,33,1

数据为数字,并用逗号分隔,我们可以期望整个文件都符合此期望。

让我们使用新功能并加载数据集。加载后,我们可以报告一些简单的详细信息,例如加载的行数和列数。

将所有这些放在一起,我们得到以下信息:

from csv import reader

Load a CSV file

def load_csv(filename):
file = open(filename, “r”)
lines = reader(file)
dataset = list(lines)
return dataset

Load dataset

filename = ‘pima-indians-diabetes.csv’
dataset = load_csv(filename)
print(‘Loaded data file {0} with {1} rows and {2} columns’).format(filename, len(dataset), len(dataset[0]))

运行此示例,我们看到:


Loaded data file pima-indians-diabetes.csv with 768 rows and 9 columns

此功能的局限性在于它将从数据文件中加载空行并将其添加到我们的行列表中。我们可以通过一次向数据集中添加一行数据并跳过空行来克服这一问题。

下面是使用load_csv()函数的新改进版本的更新示例。

Example of loading Pima Indians CSV dataset

from csv import reader

Load a CSV file

def load_csv(filename):
dataset = list()
with open(filename, ‘r’) as file:
csv_reader = reader(file)
for row in csv_reader:
if not row:
continue
dataset.append(row)
return dataset

Load dataset

filename = ‘pima-indians-diabetes.csv’
dataset = load_csv(filename)
print(‘Loaded data file {0} with {1} rows and {2} columns’).format(filename, len(dataset), len(dataset[0]))

运行此示例,我们看到:

Loaded data file pima-indians-diabetes.csv with 768 rows and 9 columns

2.将字符串转换为浮点数

大多数(如果不是全部)机器学习算法更喜欢使用数字。

具体地,浮点数是优选的。

我们用于加载CSV文件的代码将数据集作为列表列表返回,但是每个值都是一个字符串。如果我们从数据集中打印出一条记录,我们可以看到这一点:

print(dataset[0])

这将产生如下输出:

[‘6’, ‘148’, ’72’, ’35’, ‘0’, ‘33.6’, ‘0.627’, ’50’, ‘1’]

我们可以编写一个小函数将加载的数据集的特定列转换为浮点值。

下面是称为str_column_to_float()的函数。它将数据集中的给定列转换为浮点值,在进行转换之前,请小心从该值中删除所有空格。

def str_column_to_float(dataset, column): for row in dataset: row[column] = float(row[column].strip())

我们可以通过将其与上面的load CSV函数结合使用来测试该函数,并将Pima Indians数据集中的所有数字数据转换为浮点值。

完整的示例如下。

from csv import reader

Load a CSV file

def load_csv(filename):
file = open(filename, “rb”)
lines = reader(file)
dataset = list(lines)
return dataset

Convert string column to float

def str_column_to_float(dataset, column):
for row in dataset:
row[column] = float(row[column].strip())

Load pima-indians-diabetes dataset

filename = ‘pima-indians-diabetes.csv’
dataset = load_csv(filename)
print(‘Loaded data file {0} with {1} rows and {2} columns’).format(filename, len(dataset), len(dataset[0]))
print(dataset[0])

convert string columns to float

for i in range(len(dataset[0])):
str_column_to_float(dataset, i)
print(dataset[0])

运行此示例,我们看到在转换之前和之后都打印了数据集的第一行。我们可以看到每列中的值已从字符串转换为数字。

Loaded data file pima-indians-diabetes.csv with 768 rows and 9 columns
[‘6’, ‘148’, ’72’, ’35’, ‘0’, ‘33.6’, ‘0.627’, ’50’, ‘1’]
[6.0, 148.0, 72.0, 35.0, 0.0, 33.6, 0.627, 50.0, 1.0]

3.将字符串转换为整数

鸢尾花数据集类似于Pima Indians数据集,因为这些列包含数字数据。

区别在于最后一列,传统上用来保存给定行要预测的结果或值。鸢尾花数据中的最后一列是鸢尾花种类(字符串)。

下载数据集并将其放置在文件名为iris.csv的当前工作目录中。打开文件并删除底部的所有空行。

例如,下面是原始数据集的前5行。

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa

一些机器学习算法希望所有值都是数字,包括结果或预测值。

我们可以通过创建地图将鸢尾花数据集中的类值转换为整数。

  1. 首先,我们找到所有唯一的类值,它们分别是:鸢尾花,鸢尾花和鸢尾花。
  2. 接下来,我们为每个变量分配一个整数值,例如:0、1和2。
  3. 最后,我们将所有出现的类字符串值替换为其对应的整数值。

下面是一个函数,用于执行称为str_column_to_int()的功能。像之前介绍的str_column_to_float()一样,它对数据集中的单个列进行操作。

Convert string column to integer

def str_column_to_int(dataset, column):
class_values = [row[column] for row in dataset]
unique = set(class_values)
lookup = dict()
for i, value in enumerate(unique):
lookup[value] = i
for row in dataset:
row[column] = lookup[row[column]]
return lookup

除了用于加载CSV文件并将列转换为浮点值的前两个功能之外,我们还可以测试此新功能。如果下游的任何用户想要再次将预测转换回字符串值,它也会返回类值到整数值的字典映射。

下面的示例加载虹膜数据集,然后将前3列转换为浮点数,将最后一列转换为整数值。

from csv import reader

Load a CSV file

def load_csv(filename):
file = open(filename, “rb”)
lines = reader(file)
dataset = list(lines)
return dataset

Convert string column to float

def str_column_to_float(dataset, column):
for row in dataset:
row[column] = float(row[column].strip())

Convert string column to integer

def str_column_to_int(dataset, column):
class_values = [row[column] for row in dataset]
unique = set(class_values)
lookup = dict()
for i, value in enumerate(unique):
lookup[value] = i
for row in dataset:
row[column] = lookup[row[column]]
return lookup

Load iris dataset

filename = ‘iris.csv’
dataset = load_csv(filename)
print(‘Loaded data file {0} with {1} rows and {2} columns’).format(filename, len(dataset), len(dataset[0]))
print(dataset[0])

convert string columns to float

for i in range(4):
str_column_to_float(dataset, i)

convert class column to int

lookup = str_column_to_int(dataset, 4)
print(dataset[0])
print(lookup)

运行此示例将产生以下输出。

我们可以看到数据类型转换前后数据集的第一行。我们还可以看到类值到整数的字典映射。

Loaded data file iris.csv with 150 rows and 5 columns
[‘5.1’, ‘3.5’, ‘1.4’, ‘0.2’, ‘Iris-setosa’]
[5.1, 3.5, 1.4, 0.2, 1]
{‘Iris-virginica’: 0, ‘Iris-setosa’: 1, ‘Iris-versicolor’: 2}

扩展

您学习了如何加载CSV文件和执行基本数据转换。

考虑到问题之间可能需要进行多种数据清理和转换,因此数据加载可能是一项艰巨的任务。

您可以进行许多扩展,以使这些示例对新的和不同的数据文件更加健壮。以下是您可以考虑进行研究和实施的一些想法:

  • 检测并删除文件顶部或底部的空行。
  • 检测并处理列中的缺失值。
  • 检测并处理与文件其余部分的期望值不符的行。
  • 支持其他定界符,例如“ |” (管道)或空白。
  • 支持更有效的数据结构,例如数组。

在实践中,您可能希望使用两个库来加载CSV数据:NumPy和Pandas。

NumPy提供了loadtxt()函数,用于将数据文件作为NumPy数组加载。Pandas提供了read_csv()函数,该函数在数据类型,文件头等方面提供了很大的灵活性。

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code