概要

numpyを使用した重回帰分析scikit-learnを使用した重回帰分析Chainerで重回帰分析をやってみる で実装した賃貸価格の推論と同じ事を PyTorch を使用してやってみる。
※ 使用するデータは numpyを使用した重回帰分析 と同じ。

目次

環境構築

mkdir sample_pytorch
cd sample_pytorch
python3 -m venv venv
source venv/bin/activate
pip3 install torch torchvision
pip3 install sklearn

実装

元々は Chainer の Fork だったらしく、今回実装した内容だと殆どChainerと変わらなかった。(関連: Chainerで重回帰分析をやってみる)

sample_pytorch.py

import torch
import torch.nn as nn
import numpy as np
from sklearn.preprocessing import StandardScaler

# パラメータ
input_size  = 2     # 説明変数の数
output_size = 1     # 推論値の数
alpha       = 0.01  # 学習率
epochs      = 1000  # 学習回数

# サンプルデータの読み込み
data = np.loadtxt("data/sample_rent1.csv", delimiter=",", skiprows=1)
x_train = data[:, 1:3].astype("float32")  # 広さ, 築年数
y_train = data[:, 3:4].astype("float32")  # 家賃

# モデル定義
class LinearRegression(nn.Module):

    def __init__(self, input_size, output_size):
        super(LinearRegression, self).__init__()
        self.linear = nn.Linear(input_size, output_size)

    def forward(self, x): 
        out = self.linear(x)
        return out 

model = LinearRegression(input_size, output_size)
#model = nn.Linear(input_size, output_size)

# 損失関数
loss = nn.MSELoss()

# 最適化関数
optimizer = torch.optim.SGD(model.parameters(), lr=alpha)

# 標準化用
scaler = StandardScaler()
scaler.fit(x_train)

# モデルの訓練
for epoch in range(epochs):

    # 標準化
    x_train_scaled = scaler.transform(x_train)

    # データをテンソルへ変換
    inputs = torch.from_numpy(x_train_scaled)
    targets = torch.from_numpy(y_train)

    # コストを算出
    outputs = model(inputs)
    cost = loss(outputs, targets)

    # 勾配のリセットと勾配の計算
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    # 100回ごとに誤差表示
    if (epoch + 1) % 100 == 0:
        print('Epoch [{}], Loss: {:.4f}'.format(epoch + 1, cost.item()))

# 任意の値を推論してみる
x_sample = np.array([[60.0, 10.0], [50.0, 10.0], [40.0, 10.0]])
x_sample_scaled = scaler.transform(x_sample)
inputs = torch.Tensor(x_sample_scaled)
results = model(inputs)
for i in range(results.size()[0]):
    print('広さ:{}, 築年数:{}, 家賃:{:.2f}'.format(x_sample[i,0], x_sample[i,1], results.data[i,0].item()))

# 訓練済みモデルを保存
#torch.save(model.state_dict(), 'sample.pth')

結果

結果はほぼ Chainerで重回帰分析をやってみる と同じ。

$ python3 sample_pytorch.py
Epoch [100], Loss: 1.2303
Epoch [200], Loss: 0.5337
Epoch [300], Loss: 0.5213
Epoch [400], Loss: 0.5211
Epoch [500], Loss: 0.5211
Epoch [600], Loss: 0.5211
Epoch [700], Loss: 0.5211
Epoch [800], Loss: 0.5211
Epoch [900], Loss: 0.5211
Epoch [1000], Loss: 0.5211
広さ:60.0, 築年数:10.0, 家賃:8.12
広さ:50.0, 築年数:10.0, 家賃:7.19
広さ:40.0, 築年数:10.0, 家賃:6.27

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-01-05 (日) 22:10:12 (13d)