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値分類や多値分類はたくさん情報があるのですが、重回帰についての情報はあまりなく、探すのに苦労しました。