分析のためにデータを準備する
このチュートリアルの前の段階では、お使いのコンピューターに 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)
出力は、次のようなランダムな 5 x 3 のテンソルになります。
Note
もっと詳しく知りたいですか? PyTorch の公式 Web サイトを参照してください。
データの説明
フィッシャーのアヤメの花データセットでモデルをトレーニングします。 この有名なデータセットには、アヤメの 3 つの種 (Iris setosa、Iris virginica、Iris versicolor) に関するレコードがそれぞれ 50 件ずつ含まれています。
このデータセットは、いくつかのバージョンが公開されています。 アヤメのデータセットは、UCI Machine Learning Repository で公開されています。また、Python Scikit-learn ライブラリからデータセットを直接インポートすることも、以前に公開された他のバージョンを使用することもできます。 アヤメの花データセットについては、そのウィキペディアのページを参照してください。
このチュートリアルでは、表形式の入力を使用してモデルをトレーニングする方法を紹介するために、Excel ファイルにエクスポートされたアヤメのデータセットを使用します。
Excel の表の各行は、アヤメの 4 つの特徴 (がく片の長さ (cm)、がく片の幅 (cm)、花弁の長さ (cm)、花弁の幅 (cm)) を示します。これらの特徴は入力として使用されます。 最後の列には、これらのパラメーターに関連するアヤメの種類が含まれており、回帰分析の結果を表します。 このデータセットには、4 つの特徴からなる入力が合計で 150 件含まれており、それぞれが関連するアヤメの種類と一致します。
回帰分析では、入力変数と結果の関係が確認されます。 モデルは、入力に基づいて、適切な出力の種類 (アヤメの 3 つの種類 (Iris-setosa、Iris-versicolor、Iris-virginica) のうちの 1 つ) を予測することを学習します。
重要
他のデータセットを使用して独自のモデルを作成する場合は、シナリオに応じてモデルの入力変数と出力を指定する必要があります。
データセットを読み込みます。
アヤメのデータセットを Excel 形式でダウンロードします。 データセットは、こちらにあります。
Solution Explorer Files フォルダー内にある
DataClassifier.py
ファイルに、次の import ステートメントを追加して、必要なすべてのパッケージにアクセスできるようにします。
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 個ずつ項目が表示されるはずです。 必ず、お使いの PC 上のデータセットの場所を指定してください。
次のコードを 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())
このコードを実行すると、次のような出力が表示されます。
モデルをトレーニングするには、モデルの入力と出力をテンソル形式に変換する必要があります。
- テンソルに変換します。
次のコードを 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 個の項目があります。つまり、平均して、トレーニング用セット全体を 1 回 (1 エポック) 反復する完全なバッチが 9 つあります。 検証用とテスト用のセットのバッチ サイズは 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 モデルのトレーニングを行う