Нахождение среднеквадратичной ошибки для линейной регрессии в python (с обучением scikit)

Я пытаюсь выполнить простую линейную регрессию в python, где переменная x — это количество слов в описании проекта, а значение y — скорость финансирования в днях.

Я немного смущен, так как среднеквадратическая ошибка (RMSE) составляет 13,77 для теста и 13,88 для обучающих данных. Во-первых, разве RMSE не должен быть между 0 и 1? И, во-вторых, не должно ли среднеквадратичное отклонение для тестовых данных быть выше, чем для обучающих данных? Итак, я думаю, я сделал что-то не так, но не уверен, где ошибка.

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

Это то, что у меня есть до сих пор:

import numpy as np
import matplotlib.pyplot as plt
import sqlite3
from sklearn.model_selection import train_test_split
from sklearn import linear_model

con = sqlite3.connect('database.db')
cur = con.cursor()

# y-variable in regression is funding speed ("DAYS_NEEDED")    
cur.execute("SELECT DAYS_NEEDED FROM success")
y = cur.fetchall()                  # list of tuples
y = np.array([i[0] for i in y])     # list of int   # y.shape = (1324476,)

# x-variable in regression is the project description length ("WORD_COUNT")
cur.execute("SELECT WORD_COUNT FROM success")
x = cur.fetchall()
x = np.array([i[0] for i in x])     # list of int   # x.shape = (1324476,)

# Get the train and test data split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

# Fit a model
lm = linear_model.LinearRegression()
x_train = x_train.reshape(-1, 1)    # new shape: (1059580, 1)
y_train = y_train.reshape(-1, 1)    # new shape: (1059580, 1)
model = lm.fit(x_train, y_train)
x_test = x_test.reshape(-1, 1)      # new shape: (264896, 1)
predictions_test = lm.predict(x_test)
predictions_train = lm.predict(x_train)

print("y_test[5]: ", y_test[5])     # 14
print("predictions[5]: ", predictions_test[5]) # [ 12.6254537]

# Calculate the root mean square error (RMSE) for test and training data
N = len(y_test)
rmse_test = np.sqrt(np.sum((np.array(y_test).flatten() - np.array(predictions_test).flatten())**2)/N)
print("RMSE TEST: ", rmse_test)     # 13.770731326

N = len(y_train)
rmse_train = np.sqrt(np.sum((np.array(y_train).flatten() - np.array(predictions_train).flatten())**2)/N)
print("RMSE train: ", rmse_train)   # 13.8817814595

Любая помощь высоко ценится! Спасибо!


person Christina    schedule 26.06.2018    source источник
comment
RMSE не обязательно должен быть между 0 и 1. Это зависит от диапазона y, который у вас есть. Если y имеет больший диапазон, то RMSE может быть больше 1.   -  person Umang Gupta    schedule 27.06.2018
comment
См. scikit-learn.org /stable/modules/generated/ для получения параметров. Или вы можете использовать model.coef_ и model.intercept_   -  person Umang Gupta    schedule 27.06.2018
comment
RMSE будет между 0 и 1, только если зависимая переменная (т.е. y) была между 0 и 1 и все прогнозируемые значения также были между 0 и 1. RMSE тестовых данных будет ближе к обучающей RMSE (и ниже), если у вас есть хорошо обученная модель. Это будет выше, если у вас есть переоснащенная модель. Оно может быть ниже, если ваши тестовые данные слишком просты для модели. Вы можете найти это полезным.   -  person Autonomous    schedule 27.06.2018


Ответы (1)


  1. RMSE имеет ту же единицу, что и зависимая переменная. Это означает, что если переменная, которую вы пытаетесь предсказать, изменяется от 0 до 100, RMSE 99 — это ужасно! Если, скажем, у вас есть RMSE 5 для данных в диапазоне от 0 до 100, RMSE 5 впечатляет. НО, если RMSE равен 5 для данных в диапазоне от 1 до 10, то у вас проблема! Я надеюсь, что это может привести точку дома.

  2. Поскольку RMSE вашего поезда и теста одинаковы, похлопайте себя по спине! Вы действительно проделали хорошую работу! Если RMSE теста > поезда, вы немного переобучаетесь.

Согласно тому, что Уманг сказал в комментариях, вы используете model.coef_ и model.intercept_ для печати весов, которые ваша модель рассчитала как оптимальные.

person imperialgendarme    schedule 26.06.2018