Предсказательная сила вашей модели - это именно то, что я ожидаю от линейной регрессии, обученной на случайных данных, как вы описываете.
Ниже я обучу линейной регрессии Обыкновенных наименьших квадратов на 10000 пар случайных чисел x1
и x2
, где 0 <= x <= 60
и y = x1**2 + x2**2
. Затем я проверяю его на 100 случайных парах.
import numpy as np
import sklearn.linear_model
X_train = np.random.rand(20000).reshape(10000,2)*60
y_train = (X_train[:, 0]**2)+(X_train[:, 1]**2)
X_test = np.random.rand(200).reshape(100,2)*60
y_test = (X_test[:, 0]**2)+(X_test[:, 1]**2)
model = sklearn.linear_model.LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("MAE: {}".format(np.abs(y_test-y_pred).mean()))
print("RMSE: {}".format(np.sqrt(((y_test-y_pred)**2).mean())))
Это дает мне те же ошибки, что и вам.
>>> python .\regression.py
MAE: 301.35977152696194
RMSE: 363.663670758086
Вот график, иллюстрирующий, почему регрессия не может быть лучшерезультаты, чем это. Элементы (x1
и x1
) расположены по осям x и y, а цель (y
) - по оси z. Красные точки - это обучающие выборки, а синяя плоскость - это функция, которую производит регрессия.
Линейная регрессия может создавать только функции вида y = w1·x1 + w2·x2 + w3
, где w1
, w2
и w3
веса, оптимизируемые регрессией. Этот тип функции генерирует плоскую плоскость, как показано на рисунке. В этом случае уравнение соответствует y = -1249.41 + 61.18x1 + 60.69x2
. Это явно не тот тип функций, который генерировал сэмплы, которые следуют за хорошей изогнутой поверхностью.
Эффект намного более ясен, если вы запустите код самостоятельно , чтобы вы могли перемещать 3D-график и более легко видеть формы.