PR

ディープラーニング速習_Pytorch Lightning を使用したモデル開発

AI

本記事ではディープラーニング(以下DL)モデル構築のフレームワークである、Pytorch のラッパーのPytorch Lightningを使用した、DL モデルの構築方法の紹介をします。

モデルの構築手順は大きく 6 つです。各手順を実装しながら流れを抑えましょう。

1. 環境の準備

必要なライブラリのインストール(pytorch-lightning)

まず、必要なライブラリをインストールします。これにより、PyTorch Lightning、データ操作用のpandas、データ分割と前処理のためのscikit-learnを使用できるようになります。

pip install pytorch-lightning pandas scikit-learn

必要なライブラリのインポート

import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import StandardScaler, LabelEncoder 
import torch import pytorch_lightning as pl 
from pytorch_lightning import Trainer 
import torch.nn.functional as F 
from torch.utils.data import DataLoader, TensorDataset

2. データのロードと前処理

データのロード

タイタニックのデータセットをインターネットからダウンロードして読み込みます。

df = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')

必要な特徴量の選択

モデルに使用する特徴量(変数)を選択します。ここでは、以下の特徴量を使用します:

  • Pclass: 乗客のチケットクラス
  • Sex: 性別
  • Age: 年齢
  • SibSp: 兄弟/配偶者の数
  • Parch: 両親/子供の数
  • Fare: 料金

また、予測するターゲット変数はSurvivedです。


features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare'] target = 'Survived'

欠損値の処理

欠損値を処理します。ここでは、Ageに欠損値があるため、平均値で埋めます。

df['Age'].fillna(df['Age'].mean(), inplace=True)

なぜ欠損値を処理するのか? 欠損値があると、多くの機械学習アルゴリズムが適切に動作しません。モデルに不正確な予測をさせないために、欠損値を適切に処理する必要があります。

カテゴリカル変数のエンコード

Sexはカテゴリカル変数(文字)なので、数値に変換します。

最終的には数値計算をおこない、モデルを作成します。ですので文字列などのカテゴリカルデータは数値に変換します。
df['Sex'] = LabelEncoder().fit_transform(df['Sex'])

特徴量とターゲットの分割

データを特徴量(入力)とターゲット(予測したい値)に分割します。

X = df[features].values y = df[target].values

訓練データとテストデータの分割

データセットを訓練用とテスト用に分割します。一般的に、80%を訓練データ、20%をテストデータとします。

train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

データの標準化

特徴量のスケーリングを行います。標準化により、各特徴量の平均を0、標準偏差を1にします。

scaler = StandardScaler() X_train = scaler.fit_transform(X_train)
 X_val = scaler.transform(X_val)

なぜスケーリングをするのか? スケーリングにより、各特徴量が同じスケール(平均0、標準偏差1)になるため、モデルのトレーニングが安定しやすくなり、収束が速くなります。
データが小数点から1000のくらいまでなどばらつきがあるとモデルがある特徴量の影響を受けやすいためです。

データセットの作成

PyTorchのTensorDatasetとDataLoaderを使用してデータセットを作成します。

train_dataset = TensorDataset(torch.tensor(X_train, dtype=torch.float32), torch.tensor(y_train, dtype=torch.long)) 
val_dataset = TensorDataset(torch.tensor(X_val, dtype=torch.float32), torch.tensor(y_val, dtype=torch.long)) 
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) 
val_loader = DataLoader(val_dataset, batch_size=32)

3. モデルの定義

PyTorch Lightningを使ったモデルの定義

PyTorch Lightningを使用してモデルを定義します。

class TitanicModel(pl.LightningModule):
 def __init__(self, input_dim):
  super(TitanicModel, self).__init__()
  self.layer_1 = torch.nn.Linear(input_dim, 64)
  self.layer_2 = torch.nn.Linear(64, 32)
  self.output = torch.nn.Linear(32, 2)

 def forward(self, x):
  x = F.relu(self.layer_1(x))
  x = F.relu(self.layer_2(x))
  x = self.output(x)
  return x

 def training_step(self, batch, batch_idx):
  x, y = batch
  y_hat = self(x)
  loss = F.cross_entropy(y_hat, y)
  return loss

 def configure_optimizers(self):
  return torch.optim.Adam(self.parameters(), lr=0.001)

モデルの構造

  • layer_1: 入力層から64ユニットの隠れ層への全結合層
  • layer_2: 64ユニットから32ユニットの隠れ層への全結合層
  • output: 32ユニットから2クラス(生存/非生存)への出力層

隠れ層の値を調整することによってモデルの調整をすることができます。

 

4. トレーニングループの設定

PyTorch LightningのTrainerを使用してトレーニングループを設定します。

model = TitanicModel(input_dim=X_train.shape[1]) trainer = Trainer(max_epochs=10)

5. モデルのトレーニング

モデルをトレーニングします。

trainer.fit(model, train_loader, val_loader)

6. モデルの評価

モデルの性能をテストデータで評価します。トレーニングが完了したら、必要に応じて評価や予測を行うことができます。

# モデルの評価(例)
results = trainer.test(model, val_loader) print(results)

これで、PyTorch Lightningを使ったタイタニックのデータセットのモデル作成が完了です。このガイドを参考にして、他のデータセットやモデルにも挑戦してみてください

タイトルとURLをコピーしました