Perbedaan antara statsmodel OLS dan regresi linier scikit


14

Saya punya pertanyaan tentang dua metode berbeda dari perpustakaan yang berbeda yang tampaknya melakukan pekerjaan yang sama. Saya mencoba membuat model regresi linier.

Berikut adalah kode yang saya gunakan perpustakaan statsmodel dengan OLS:

X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.3, random_state=1)

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()

print "GFT + Wiki / GT  R-squared", results.rsquared

Ini mencetak GFT + Wiki / GT R-squared 0.981434611923

dan yang kedua adalah scikit learning library Metode model linear:

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)

print 'GFT + Wiki / GT R-squared: %.4f' % model.score(X_test, y_test)

Ini mencetak GFT + Wiki / GT R-squared: 0,8543

Jadi pertanyaan saya adalah kedua metode mencetak hasil R ^ 2 kami tetapi satu mencetak 0,98 dan yang lainnya 0,85.

Dari pemahaman saya, OLS bekerja dengan dataset pelatihan. Jadi pertanyaan saya,

  • Apakah ada cara yang berfungsi dengan set data uji dengan OLS?
  • Apakah skor set data traning memberi kami arti (Di OLS kami tidak menggunakan set data uji)? Dari pengetahuan saya sebelumnya, kami harus bekerja dengan data uji.
  • Apa perbedaan antara OLS dan regresi linier scikit. Yang mana yang kita gunakan untuk menghitung skor model?

Terima kasih atas bantuannya.

Jawaban:


14

Pertama dalam hal penggunaan. Anda bisa mendapatkan prediksi dalam statsmodels dengan cara yang sangat mirip dengan di scikit-learn, kecuali bahwa kita menggunakan instance hasil yang dikembalikan olehfit

predictions = results.predict(X_test)

Dengan prediksi tersebut, kami dapat menghitung statistik yang didasarkan pada kesalahan prediksi

prediction_error = y_test - predictions

Ada daftar fungsi yang terpisah untuk menghitung kebaikan statistik prediksi dengan itu, tetapi itu tidak diintegrasikan ke dalam model, juga tidak termasuk R kuadrat. (Saya belum pernah mendengar tentang R kuadrat yang digunakan untuk keluar dari data sampel.) Menghitung itu memerlukan sedikit lebih banyak pekerjaan oleh pengguna dan statsmodels tidak memiliki set statistik yang sama, terutama untuk klasifikasi atau model dengan variabel respon biner.

Ke dua poin Anda yang lain:

Regresi linear dalam bentuk dasarnya sama dalam statsmodels dan di scikit-belajar. Namun, implementasinya berbeda yang mungkin menghasilkan hasil yang berbeda dalam kasus tepi, dan scikit belajar secara umum lebih mendukung model yang lebih besar. Sebagai contoh, statsmodels saat ini menggunakan matriks jarang di beberapa bagian.

Perbedaan yang paling penting adalah dalam infrastruktur di sekitarnya dan kasus penggunaan yang didukung langsung.

Statsmodels sebagian besar mengikuti model tradisional di mana kami ingin tahu seberapa baik model yang diberikan cocok dengan data, dan variabel apa yang "menjelaskan" atau memengaruhi hasil, atau seberapa besar efeknya. Scikit-belajar mengikuti tradisi pembelajaran mesin di mana tugas utama yang didukung memilih model "terbaik" untuk prediksi.

Sebagai konsekuensinya, penekanan pada fitur pendukung statsmodels adalah dalam menganalisis data pelatihan yang mencakup tes hipotesis dan tindakan good-of-fit, sedangkan penekanan pada infrastruktur pendukung di scikit-belajar adalah pada pemilihan model untuk out-of- prediksi sampel dan oleh karena itu validasi silang pada "data uji".

Ini menunjukkan perbedaannya, masih ada cukup banyak tumpang tindih juga dalam penggunaannya. statsmodels juga melakukan prediksi, dan juga meramalkan dalam konteks deret waktu. Tetapi, ketika kita ingin melakukan validasi silang untuk prediksi dalam statsmodels, saat ini masih sering lebih mudah untuk menggunakan kembali konfigurasi cross-validasi dari scikit-learning bersama dengan model estimasi statsmodels.


Hmm, saya mencoba menggunakan model ARMA dari statsmodels.tsa, tetapi antarmuka prediksi sama sekali berbeda di sana. Apakah Anda tahu cara memberi makan data pengujian?
ephes

1
Itu pertanyaan yang berbeda, dan Anda perlu melihat dokumentasi atau contohnya. Prediksi dalam model deret waktu cukup berbeda karena struktur waktu berurutan dan prediksi peramalan nilai-nilai pada periode waktu berikutnya.
Josef

Anda benar itu pertanyaan lain, namun terima kasih atas penjelasannya. Saya sudah membaca dokumentasinya dan membuatnya bekerja. Tapi saya masih tidak mengerti mengapa antarmuka berbeda. Terutama mengapa tidak mungkin untuk menyediakan vektor fitur dan mendapatkan prediksi (perkiraan).
ephes

ARMA dan SARIMAX memungkinkan variabel penjelas exoguntuk dimasukkan dalam estimasi dan perkiraan.
Josef

Pertanyaan tentang Stackowerlow ini mendukung perbedaan antarmuka: stackoverflow.com/questions/41045752/…
David Dale

1

Dalam model OLS Anda menggunakan data pelatihan untuk menyesuaikan dan memprediksi.

Dengan model LinearRegression Anda menggunakan data pelatihan untuk menyesuaikan dan menguji data untuk memprediksi, oleh karena itu hasil yang berbeda dalam skor R2.

Jika Anda akan mengambil data uji dalam model OLS, Anda harus memiliki hasil yang sama dan nilai yang lebih rendah


0

Saya telah mengalami masalah serupa di mana OLS memberikan nilai Rsquared dan Adjusted Rsquared yang berbeda dibandingkan dengan model Sklearn LinearRegression.

Alasan untuk itu: OLS tidak menganggap, sebagai default, koefisien intersepsi dan di sana membangun model tanpa itu dan Sklearn mempertimbangkannya dalam membangun model.

Solusi: Tambahkan kolom 1's ke dataset dan sesuaikan model dengan OLS dan Anda akan mendapatkan Rsquared dan Adj yang hampir sama. Nilai rsquared untuk kedua model.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.