Линейная регрессия - это подход, который пытается найти линейную связь между зависимой переменной и независимой переменной путем минимизации расстояния, как показано ниже.

В этом посте я покажу, как реализовать простую модель линейной регрессии с помощью PyTorch.

Давайте рассмотрим очень простое линейное уравнение, то есть y = 2x + 1. Здесь «x» - независимая переменная, а y - зависимая переменная. Мы будем использовать это уравнение для создания фиктивного набора данных, который будет использоваться для обучения этой модели линейной регрессии. Ниже приведен код для создания набора данных.

import numpy as np
# create dummy data for training
x_values = [i for i in range(11)]
x_train = np.array(x_values, dtype=np.float32)
x_train = x_train.reshape(-1, 1)

y_values = [2*i + 1 for i in x_values]
y_train = np.array(y_values, dtype=np.float32)
y_train = y_train.reshape(-1, 1)

После того, как мы создали набор данных, мы можем начать писать код для нашей модели. Первым делом нужно определить архитектуру модели. Мы делаем это с помощью следующего фрагмента кода.

import torch
from torch.autograd import Variable
class linearRegression(torch.nn.Module):
    def __init__(self, inputSize, outputSize):
        super(linearRegression, self).__init__()
        self.linear = torch.nn.Linear(inputSize, outputSize)

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

Мы определили класс линейной регрессии, который наследует torch.nn.Module, который является базовым модулем нейронной сети, содержащим все необходимые функции. Наша модель линейной регрессии содержит только одну простую линейную функцию.

Затем мы создаем экземпляр модели, используя следующий код.

inputDim = 1        # takes variable 'x' 
outputDim = 1       # takes variable 'y'
learningRate = 0.01 
epochs = 100

model = linearRegression(inputDim, outputDim)
##### For GPU #######
if torch.cuda.is_available():
    model.cuda()

После этого мы инициализируем функции потерь (Среднеквадратичная ошибка) и оптимизации (Стохастический градиентный спуск), которые мы будем использовать при обучении этой модели.

criterion = torch.nn.MSELoss() 
optimizer = torch.optim.SGD(model.parameters(), lr=learningRate)

После завершения всех инициализаций мы можем приступить к обучению нашей модели. Ниже приведен код для обучения модели.

for epoch in range(epochs):
    # Converting inputs and labels to Variable
    if torch.cuda.is_available():
        inputs = Variable(torch.from_numpy(x_train).cuda())
        labels = Variable(torch.from_numpy(y_train).cuda())
    else:
        inputs = Variable(torch.from_numpy(x_train))
        labels = Variable(torch.from_numpy(y_train))

    # Clear gradient buffers because we don't want any gradient from previous epoch to carry forward, dont want to cummulate gradients
    optimizer.zero_grad()

    # get output from the model, given the inputs
    outputs = model(inputs)

    # get loss for the predicted output
    loss = criterion(outputs, labels)
    print(loss)
    # get gradients w.r.t to parameters
    loss.backward()

    # update parameters
    optimizer.step()

    print('epoch {}, loss {}'.format(epoch, loss.item()))

Теперь, когда наша модель линейной регрессии обучена, давайте протестируем ее. Поскольку это очень тривиальная модель, мы протестируем ее на нашем существующем наборе данных, а также построим график, чтобы сравнить исходные и прогнозируемые результаты.

with torch.no_grad(): # we don't need gradients in the testing phase
    if torch.cuda.is_available():
        predicted = model(Variable(torch.from_numpy(x_train).cuda())).cpu().data.numpy()
    else:
        predicted = model(Variable(torch.from_numpy(x_train))).data.numpy()
    print(predicted)

plt.clf()
plt.plot(x_train, y_train, 'go', label='True data', alpha=0.5)
plt.plot(x_train, predicted, '--', label='Predictions', alpha=0.5)
plt.legend(loc='best')
plt.show()

Это строит следующий график.

Похоже, наша модель правильно вычислила линейную связь между нашими зависимыми и независимыми переменными.

Если вы это поняли, попробуйте обучить модель линейной регрессии для более сложного линейного уравнения с несколькими независимыми переменными.