本記事ではディープラーニング(以下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を使ったタイタニックのデータセットのモデル作成が完了です。このガイドを参考にして、他のデータセットやモデルにも挑戦してみてください