Menemukan kesalahan kuadrat rata-rata untuk regresi linier dengan python (dengan scikit learn)

Saya mencoba melakukan regresi linier sederhana dengan python dengan variabel x adalah jumlah kata dari deskripsi proyek dan nilai y adalah kecepatan pendanaan dalam beberapa hari.

Saya agak bingung karena root mean square error (RMSE) adalah 13,77 untuk pengujian dan 13,88 untuk data pelatihan. Pertama, bukankah RMSE harus antara 0 dan 1? Dan kedua, bukankah seharusnya RMSE untuk data pengujian lebih tinggi daripada data pelatihan? Jadi saya rasa, saya melakukan kesalahan tetapi tidak yakin di mana kesalahannya.

Selain itu, saya perlu mengetahui koefisien bobot untuk regresi tetapi sayangnya tidak tahu cara mencetaknya karena agak tersembunyi di dalam metode sklearn. Adakah yang bisa membantu di sini?

Inilah yang saya miliki sejauh ini:

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

Bantuan apa pun sangat dihargai! Terima kasih!


person Christina    schedule 26.06.2018    source sumber
comment
RMSE tidak harus antara 0 dan 1. Itu tergantung pada rentang y yang Anda miliki. Jika y memiliki rentang yang lebih besar, maka RMSE bisa lebih besar dari 1.   -  person Umang Gupta    schedule 27.06.2018
comment
Lihat scikit-learn.org /stable/modules/generated/ untuk mendapatkan parameter. Atau Anda dapat menggunakan model.coef_ dan model.intercept_   -  person Umang Gupta    schedule 27.06.2018
comment
RMSE akan berada di antara 0 dan 1 hanya jika variabel dependen (yaitu y) berada di antara 0 dan 1 dan semua nilai prediksi juga antara 0 dan 1. RMSE data pengujian akan mendekati ke RMSE pelatihan (dan lebih rendah) jika Anda memiliki model yang terlatih. Akan lebih tinggi jika Anda memiliki model overfitted. Mungkin lebih rendah jika data pengujian Anda terlalu mudah untuk model tersebut. Anda mungkin menganggap ini berguna.   -  person Autonomous    schedule 27.06.2018


Jawaban (1)


  1. RMSE memiliki satuan yang sama dengan variabel terikat. Artinya, jika variabel yang ingin Anda prediksi bervariasi dari 0 hingga 100, RMSE sebesar 99 sangat buruk! Jika misalnya Anda memiliki RMSE 5 untuk data yang berkisar antara 0 hingga 100, RMSE 5 sangat spektakuler. TAPI, jika RMSE adalah 5 untuk data yang berkisar antara 1 hingga 10, maka Anda mempunyai masalah! Saya harap ini dapat membawa pulang maksudnya.

  2. Karena RMSE latihan dan ujian Anda serupa, tepuk-tepuk punggung Anda! Anda sebenarnya telah melakukan pekerjaan dengan baik! Jika RMSE test > train, Anda sedikit overfit.

Sesuai dengan apa yang Umang katakan di komentar, Anda menggunakan model.coef_ dan model.intercept_ untuk mencetak bobot yang telah dihitung model Anda agar optimal.

person imperialgendarme    schedule 26.06.2018