文書の過去の版を表示しています。
Regression with PyTorch
%matplotlib inline import matplotlib.pyplot as plt import seaborn as sns import numpy as np import pandas as pd from sklearn.utils import shuffle #Define the model import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable from tqdm import tqdm
from sklearn.datasets import load_boston boston = load_boston() print( "Type of boston dataset:", type(Boston)) boston_df = pd.DataFrame(boston['data'] ) boston_df.columns = boston['feature_names'] boston_df['PRICE']= boston['target']
sns.distplot(boston_df['PRICE']); sns.pairplot(boston_df);
from sklearn.model_selection import train_test_split
y = boston_df['PRICE']
X = boston_df.iloc[:,0:13]
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.3,
random_state=0)
X_train=X_train.values
y_train=y_train.values
X_test=X_test.values
y_test=y_test.values
batch_size = 50 num_epochs = 200 learning_rate = 0.01 size_hidden= 100 batch_no = len(X_train) // batch_size #batches cols=X_train.shape[1] #Number of columns in input matrix n_output=1
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("Executing the model on :",device)
class Net(torch.nn.Module):
def __init__(self, n_feature, size_hidden, n_output):
super(Net, self).__init__()
self.hidden = torch.nn.Linear(cols, size_hidden)
self.predict = torch.nn.Linear(size_hidden, n_output)
def forward(self, x):
x = F.relu(self.hidden(x))
x = self.predict(x)
return x
model = Net(cols, size_hidden, n_output)
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
criterion = torch.nn.MSELoss(reduction='sum')
loss_train_history = [] loss_test_history = [] loss_test_records = []
for epoch in tqdm(range(num_epochs)):
running_loss = 0.0
X_train, y_train = shuffle(X_train, y_train)
for i in range(batch_no):
start = i * batch_size
end = start + batch_size
inputs = Variable(torch.FloatTensor(X_train[start:end]))
labels = Variable(torch.FloatTensor(y_train[start:end]))
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, torch.unsqueeze(labels,dim=1))
loss.backward()
optimizer.step()
running_loss += loss.item()
loss_train_history.append(running_loss)
inputs = Variable(torch.FloatTensor(X_test))
outputs = model(inputs)
labels = Variable(torch.FloatTensor(y_test))
loss = criterion(outputs, torch.unsqueeze(labels,dim=1))
loss_test_history.append(loss.item())
if min(loss_test_history) == loss_test_history[-1]:
model_path = 'model.pth'
torch.save(model.state_dict(), model_path)
loss_test_records.append(epoch)
model.load_state_dict(torch.load(model_path)) fig, ax = plt.subplots() ax.plot(loss_train_history, color="blue") ax.plot(loss_test_history, color="red") plt.show() from sklearn.metrics import r2_score X = Variable(torch.FloatTensor(X_train)) result = model(X) pred=result.data[:,0].numpy() print(len(pred),len(y_train)) r2_score(pred,y_train) X = Variable(torch.FloatTensor(X_test)) result = model(X) pred=result.data[:,0].numpy() print(len(pred),len(y_test)) r2_score(pred,y_test)