准备数据进行分析

本教程的上一阶段中,我们在计算机上安装了 PyTorch。 现在,我们将使用它来设置代码,其中包含用于构建模型的数据。

在 Visual Studio 内打开新项目。

  1. 打开 Visual Studio 并选择 create a new project

Create new Visual Studio project

  1. 在搜索栏中,键入 Python然后选择 Python Application 作为项目模板。

Create new Python app

  1. 在配置窗口中:
  • 为项目命名。 在这里,我们将它称为 DataClassifier
  • 选择项目的位置。
  • 如果使用的是 VS 2019,请确保选中 Create directory for solution
  • 如果使用的是 VS2017,请确保未勾选 Place solution and project in the same directory

Configure your new Python app

create 创建项目。

创建 Python 解释器

现在,需要定义新的 Python 解释器。 这必须包括最近安装的 PyTorch 包。

  1. 导航到解释器选择,然后选择 Add Environment

Python interpreter selection

  1. Add Environment 窗口中,选择 Existing environment,然后选择 Anaconda3 (3.6, 64-bit)。 其中包括 PyTorch 包。

Configure a new Python environment

若要测试新的 Python 解释器和 PyTorch 包,请在 DataClassifier.py 文件中输入以下代码:

from __future__ import print_function 

import torch 

x=torch.rand(2, 3) 

print(x) 

输出应为类似于以下内容的随机 5x3 张量。

Test your new Python interpreter

注意

想要了解更多内容? 请访问 PyTorch 官方网站

了解数据

我们将使用费雪鸢尾花数据集来训练模型。 鸢尾花有 Iris setosa、Iris virginica 和 Iris versicolor 三个品种,对于每个品种,这个著名的数据集都包含 50 条记录。

已发布了该数据集的多个版本。 你可在 UCI 机器学习库中找到鸢尾花数据集,直接从 Python Scikit-learn 库导入数据集,或者使用之前发布的任何其他版本。 若要了解鸢尾花数据集,请访问维基百科页面

在本教程中,为了展示如何使用表格类型的输入内容来训练模型,你将使用导出到 Excel 文件的鸢尾花数据集。

Excel 表格的每一行将显示鸢尾花的 4 种特征:花萼长度(厘米)、花萼宽度(厘米)、花瓣长度(厘米)和花瓣宽度(厘米)。这些特征将用作你的输入。 最后一列包含与这些参数相关的鸢尾花类型,并将表示回归输出。 该数据集对这四个特征总共包含 150 条输入,其中每个输入与相关的鸢尾花类型匹配。

Iris data

回归分析用于了解输入变量与结果之间的关系。 根据输入,模型将学着预测输出的正确类型,也就是三种鸢尾花类型中的一种:Iris-setosa、Iris-versicolor、Iris-virginica。

重要

如果你决定使用任何其他数据集来自行创建模型,则需要根据你的情况指定模型输入变量和输出。

加载数据集。

  1. 按 Excel 格式下载鸢尾花数据集。 可在此处找到该数据集

  2. 在“解决方案资源管理器文件”文件夹的 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 包,该包中有用于构建神经网络的模块和可扩展类。

  1. 将数据加载到内存中并验证类的数目。 我们预计每种鸢尾花类型有 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()) 

在我们运行此代码时,预计会得到以下输出:

Dataset status

为了能够使用数据集并训练模型,我们需要定义输入和输出。 输入包含 150 行特征,输出是鸢尾花类型列。 将使用的神经网络需要数值变量,因此你要将输出变量转换为数字格式。

  1. 在数据集中创建一个新列,它将表示数字格式的输出,然后定义回归输入和输出。

将以下代码添加到 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()) 

在我们运行此代码时,预计会得到以下输出:

Input and output

若要训练模型,需要将模型输入和输出转换为 Tensor 格式:

  1. 转换为 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 

如果运行代码,预期输出将如下显示输入和输出格式:

Dataset input and output format

有 150 个输入值。 其中大约 60% 是模型训练数据。 你将保留 20% 用于验证,保留 30% 用于测试。

在本教程中,训练数据集的批大小定义为 10。 训练集中有 95 个项,这是平均大小,有 9 个完整批处理用于循环访问训练集一次(一个 epoch)。 将验证集和测试集的批大小保留为 1。

  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 模型