PyTorchで重回帰分析

目次

概要

PyTorchでニューラルネットワークによる重回帰分析をやってみました。

環境

  • PyTorch 2.0.1
  • Python 3.11.4

モデルについて

私が今回利用したのは、Kaggleで公開されている次のデータです。

https://www.kaggle.com/datasets/shivam2503/diamonds

ダイアモンドの価格や大きさ、透明度などの情報があるので、ダイアモンドの価格を予想するモデルを作成することにしました。

統計学的な手法であれば、重回帰係数を求めるというモデル作成方法がありますが、今回はPyTorchを利用してニューラルネットワークによるダイアモンド価格の予想モデルを作成します。

コード

PyTorchで重回帰分析のようなことをする場合、通常の分類モデルと同様のコードを利用できます。

class Net(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(Net, self).__init__()

        self.fc1 = nn.Linear(input_dim, 100)
        self.fc2 = nn.Linear(100, 10)
        self.fc3 = nn.Linear(10, output_dim)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))

        return self.fc3(x)

model = Net(26, 1).to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()

# X_trainに学習データの説明変数、X_test学習データの目的変数にデータが入っています
epochs = 20
data_size = len(X_train)

for epoch in range(epochs):
    loss_sum = 0

    for num in range(0, data_size):
        x = X_train[num].to(device)
        y = Y_train[num].to(device)

        optimizer.zero_grad()
        output = model(x)
        loss = criterion(output.reshape(y.shape), y)
        loss.backward()
        optimizer.step()
        loss_sum += loss.item()

    print(f"Epoch: {epoch+1}/{epochs}, Loss: {loss_sum / len(X_train)}")

重要な部分は、criterion = nn.MSELoss()です。損失関数に平均二乗誤差(MSELoss)を利用します。これで、ニューラルネットワークの出力として任意の値を取得できます。

分類で使われるBCELossやCrossEntropyLossでは、あくまでも0か1などの値をとり、分類を行うものです。回帰を行うのであれば、今回利用している平均二乗誤差(MSELoss)や平均絶対値誤差(L1Loss)などを使う必要があります。

さいごに

最近、PyTorchを使ってニューラルネットワークのモデルを作成するということをしています。

2値分類や多値分類はたくさん情報があるのですが、重回帰についての情報はあまりなく、探すのに苦労しました。