Плохо работает SGD в torch [load_boston dataset]
Работаю с load_boston из sklearn. Модель линейная многомерная регрессия. Пытаюсь найти веса через SGD
# Loading data
df = load_boston()
DF = pd.DataFrame(df.data, columns=df.feature_names)
target = df.target
Стандартизирую данные
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
X_test = torch.from_numpy(X_test)
X_train = torch.from_numpy(X_train)
y_test = torch.from_numpy(y_test)
y_train = torch.from_numpy(y_train)
Собственно, сам алгоритм с использованием оптимизатора из torch
torch.manual_seed(0)
# initial part for SGD
w = torch.randn([X_train.shape[1]], requires_grad=True)
# forming of dataset with answers [Y]
dataset = torch.utils.data.TensorDataset(X_train, y_train)
# implementing random choice of elements from sample
generator = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=True)
# building optimizer [implementing iteration process of SGD]
optimizer = torch.optim.SGD([w], lr=0.01)
# updating of learning rate
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer,
lambda k: 1/np.sqrt(k+1))
list_of_loss_torch = []
for x, y in generator:
optimizer.zero_grad()
with torch.no_grad():
list_of_loss_torch.append(
torch.mean((X_train @ w.double() - y_train) ** 2))
q = ((x @ w.double() - y) ** 2)
q.backward()
optimizer.step()
scheduler.step()
Но проблема в том, что ошибка после выполнения всё равно очень большая ошибка (MSE = 588.4859469250911)
plt.plot(list(range(len(list_of_loss_torch))), list_of_loss_torch)
Делал через SGDRegressor из sklearn, там ошибка была гораздо ниже, на тестовой выборке получилось всего MSE = 23.623407470385047
** Подскажите, пожалуйста, что делаю не так? ** Совсем новичок, но уже который день не даёт покоя эта ситуация, хочется разобраться
