Множественная регрессия, средняя абсолютная ошибка высока - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь вычислить X1 ^ 2 + X2 ^ 2 = Y, используя множественную регрессию в Фитоне. В файле CSV у меня есть 2 столбца X1 и X2, это случайные числа от 1 до 60. Я хочу предсказать значения y тестовых данных. Но ошибка моей модели слишком высока.

 df = pd.read_csv("C:/Users/Büşra/Desktop/bitirme1/square-test.csv",sep=';')
 x = df[['X1','X2']]
 y = df[['Y']
 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3,random_state=1)
 x_train.shape, x_test.shape, y_train.shape, y_test.shape
 model1 = linear_model.LinearRegression()
 model1.fit(x_train, y_train)
 print('Intercept: \n', model1.intercept_)
 print('Coefficients: \n', model1.coef_)
 print("Accuracy: %f" % model1.score(x_train,y_train)) 
 y_pred = abs(model1.predict(x_test))    
 print('Mean Absolute  Error:',(mean_absolute_error(y_test.to_numpy(), y_pred)))  
 print('Mean Squared Error:', (metrics.mean_squared_error(y_test.to_numpy(), y_pred)) ) 
 print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test.to_numpy(), y_pred)))

Средняя абсолютная ошибка: 297.7286734942946

Средняя квадратная ошибка: 129653.26345373654

Средняя квадратная ошибка: 360.0739694198076

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

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

Ниже я обучу линейной регрессии Обыкновенных наименьших квадратов на 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 plot of regression

Эффект намного более ясен, если вы запустите код самостоятельно , чтобы вы могли перемещать 3D-график и более легко видеть формы.

1 голос
/ 06 ноября 2019

Насколько я понимаю, вы ищете модель вида y = a*x_1 + b*x_2 + c для аппроксимации функции y = x_1**2 + x_2**2 линейной регрессией. Если ваши переменные x_1 и x_2 случайным образом вычерчены равномерно из диапазона 0-60, то среднеквадратическая ошибка в этом диапазоне точно равна

double integral

Это сводится к минимуму, когда a = 60, b = 60 и c = -1200, поэтому это лучшая теоретически возможная линейная модель, и ваша модель должна сходиться к ней, поскольку она обучается на большем количестве данных. Эта модель имеет MSE 144 000 и среднеквадратичное значение 379,473 . Это примерно соответствует вашей модели, поэтому похоже, что с вашими результатами проблем нет.

Ваше среднеквадратичное среднеквадратичное отклонение может быть немного ниже, чем «теоретически наилучшее среднеквадратичное значение», поскольку оно измеряется по выборке, а не по всему равномерному распределению. ,Вы также должны получить немного другие результаты для диапазона 1-60, или если ваши данные содержат только целые числа, или т. Д.

...