准备数据进行分析
在本教程的上一阶段中,我们在计算机上安装了 PyTorch。 现在,我们将使用它来设置代码,其中包含用于构建模型的数据。
在 Visual Studio 内打开新项目。
- 打开 Visual Studio 并选择
create a new project
。
- 在搜索栏中,键入
Python
然后选择Python Application
作为项目模板。
- 在配置窗口中:
- 为项目命名。 在这里,我们将它称为 DataClassifier。
- 选择项目的位置。
- 如果使用的是 VS 2019,请确保选中
Create directory for solution
。 - 如果使用的是 VS2017,请确保未勾选
Place solution and project in the same directory
。
按 create
创建项目。
创建 Python 解释器
现在,需要定义新的 Python 解释器。 这必须包括最近安装的 PyTorch 包。
- 导航到解释器选择,然后选择
Add Environment
:
- 在
Add Environment
窗口中,选择Existing environment
,然后选择Anaconda3 (3.6, 64-bit)
。 其中包括 PyTorch 包。
若要测试新的 Python 解释器和 PyTorch 包,请在 DataClassifier.py
文件中输入以下代码:
from __future__ import print_function
import torch
x=torch.rand(2, 3)
print(x)
输出应为类似于以下内容的随机 5x3 张量。
注意
想要了解更多内容? 请访问 PyTorch 官方网站。
了解数据
我们将使用费雪鸢尾花数据集来训练模型。 鸢尾花有 Iris setosa、Iris virginica 和 Iris versicolor 三个品种,对于每个品种,这个著名的数据集都包含 50 条记录。
已发布了该数据集的多个版本。 你可在 UCI 机器学习库中找到鸢尾花数据集,直接从 Python Scikit-learn 库导入数据集,或者使用之前发布的任何其他版本。 若要了解鸢尾花数据集,请访问维基百科页面。
在本教程中,为了展示如何使用表格类型的输入内容来训练模型,你将使用导出到 Excel 文件的鸢尾花数据集。
Excel 表格的每一行将显示鸢尾花的 4 种特征:花萼长度(厘米)、花萼宽度(厘米)、花瓣长度(厘米)和花瓣宽度(厘米)。这些特征将用作你的输入。 最后一列包含与这些参数相关的鸢尾花类型,并将表示回归输出。 该数据集对这四个特征总共包含 150 条输入,其中每个输入与相关的鸢尾花类型匹配。
回归分析用于了解输入变量与结果之间的关系。 根据输入,模型将学着预测输出的正确类型,也就是三种鸢尾花类型中的一种:Iris-setosa、Iris-versicolor、Iris-virginica。
重要
如果你决定使用任何其他数据集来自行创建模型,则需要根据你的情况指定模型输入变量和输出。
加载数据集。
按 Excel 格式下载鸢尾花数据集。 可在此处找到该数据集。
在“解决方案资源管理器文件”文件夹的
DataClassifier.py
文件中,添加以下导入语句来访问我们将需要的所有包。
import torch
import pandas as pd
import torch.nn as nn
from torch.utils.data import random_split, DataLoader, TensorDataset
import torch.nn.functional as F
import numpy as np
import torch.optim as optim
from torch.optim import Adam
如你所见,你将使用 Pandas(Python 数据分析)包来加载和操作数据和 torch.nn 包,该包中有用于构建神经网络的模块和可扩展类。
- 将数据加载到内存中并验证类的数目。 我们预计每种鸢尾花类型有 50 个项。 请确保在电脑上指定数据集的位置。
将以下代码添加到 DataClassifier.py
文件。
# Loading the Data
df = pd.read_excel(r'C:…\Iris_dataset.xlsx')
print('Take a look at sample from the dataset:')
print(df.head())
# Let's verify if our data is balanced and what types of species we have
print('\nOur dataset is balanced and has the following values to predict:')
print(df['Iris_Type'].value_counts())
在我们运行此代码时,预计会得到以下输出:
为了能够使用数据集并训练模型,我们需要定义输入和输出。 输入包含 150 行特征,输出是鸢尾花类型列。 将使用的神经网络需要数值变量,因此你要将输出变量转换为数字格式。
- 在数据集中创建一个新列,它将表示数字格式的输出,然后定义回归输入和输出。
将以下代码添加到 DataClassifier.py
文件。
# Convert Iris species into numeric types: Iris-setosa=0, Iris-versicolor=1, Iris-virginica=2.
labels = {'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}
df['IrisType_num'] = df['Iris_Type'] # Create a new column "IrisType_num"
df.IrisType_num = [labels[item] for item in df.IrisType_num] # Convert the values to numeric ones
# Define input and output datasets
input = df.iloc[:, 1:-2] # We drop the first column and the two last ones.
print('\nInput values are:')
print(input.head())
output = df.loc[:, 'IrisType_num'] # Output Y is the last column
print('\nThe output value is:')
print(output.head())
在我们运行此代码时,预计会得到以下输出:
若要训练模型,需要将模型输入和输出转换为 Tensor 格式:
- 转换为 Tensor:
将以下代码添加到 DataClassifier.py
文件。
# Convert Input and Output data to Tensors and create a TensorDataset
input = torch.Tensor(input.to_numpy()) # Create tensor of type torch.float32
print('\nInput format: ', input.shape, input.dtype) # Input format: torch.Size([150, 4]) torch.float32
output = torch.tensor(output.to_numpy()) # Create tensor type torch.int64
print('Output format: ', output.shape, output.dtype) # Output format: torch.Size([150]) torch.int64
data = TensorDataset(input, output) # Create a torch.utils.data.TensorDataset object for further data manipulation
如果运行代码,预期输出将如下显示输入和输出格式:
有 150 个输入值。 其中大约 60% 是模型训练数据。 你将保留 20% 用于验证,保留 30% 用于测试。
在本教程中,训练数据集的批大小定义为 10。 训练集中有 95 个项,这是平均大小,有 9 个完整批处理用于循环访问训练集一次(一个 epoch)。 将验证集和测试集的批大小保留为 1。
- 拆分数据进行训练,然后验证并测试数据集:
将以下代码添加到 DataClassifier.py
文件。
# Split to Train, Validate and Test sets using random_split
train_batch_size = 10
number_rows = len(input) # The size of our dataset or the number of rows in excel table.
test_split = int(number_rows*0.3)
validate_split = int(number_rows*0.2)
train_split = number_rows - test_split - validate_split
train_set, validate_set, test_set = random_split(
data, [train_split, validate_split, test_split])
# Create Dataloader to read the data within batch sizes and put into memory.
train_loader = DataLoader(train_set, batch_size = train_batch_size, shuffle = True)
validate_loader = DataLoader(validate_set, batch_size = 1)
test_loader = DataLoader(test_set, batch_size = 1)
后续步骤
数据准备就绪后,即可训练 PyTorch 模型