Линейная регрессия - это подход, который пытается найти линейную связь между зависимой переменной и независимой переменной путем минимизации расстояния, как показано ниже.
В этом посте я покажу, как реализовать простую модель линейной регрессии с помощью 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()
Это строит следующий график.
Похоже, наша модель правильно вычислила линейную связь между нашими зависимыми и независимыми переменными.
Если вы это поняли, попробуйте обучить модель линейной регрессии для более сложного линейного уравнения с несколькими независимыми переменными.