Saya mencoba menggunakan Regresi Hutan Acak di scikits-learn. Masalahnya adalah saya mendapatkan kesalahan tes yang sangat tinggi:
train MSE, 4.64, test MSE: 252.25.
Beginilah tampilan data saya: (biru: data nyata, hijau: diperkirakan):
Saya menggunakan 90% untuk pelatihan dan 10% untuk ujian. Ini adalah kode yang saya gunakan setelah mencoba beberapa kombinasi parameter:
rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1)
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))
print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)
Apa strategi yang mungkin untuk meningkatkan kecocokan saya? Apakah ada hal lain yang bisa saya lakukan untuk mengekstrak model yang mendasarinya? Tampaknya luar biasa bagi saya bahwa setelah begitu banyak pengulangan dari pola yang sama model tersebut berperilaku sangat buruk dengan data baru. Apakah saya punya harapan sama sekali mencoba mencocokkan data ini?
Jawaban:
Saya pikir Anda menggunakan alat yang salah; jika seluruh X Anda setara dengan indeks, Anda pada dasarnya memiliki beberapa fungsi sampel dan mencoba memperkirakannya. Pembelajaran mesin adalah semua tentang sejarah interpolasi, sehingga tidak mengherankan bahwa skor gagal spektakuler dalam kasus ini.f:R→R
Yang Anda butuhkan adalah analisis deret waktu (yaitu tren ekstraksi, analisis spektrum dan penanganan otomatis atau sisanya) atau fisika (yaitu berpikir apakah ada ODE yang dapat menghasilkan output seperti itu dan mencoba menyesuaikan parameternya melalui jumlah yang dilestarikan).
sumber
g
ataur
) dan 2 fitur (index
(sementara) dananimal
). Dari data ini saya dapat memuat beberapa model yang dapat memberikan bobot lebih atau kurang untuk fitur 1 atau 2 (atau sama dengan keduanya). Validasi silang (dengan asumsi data cukup) harus sampai pada model dengan fitur 2 (hewan) kurang penting. Saya dapat melihat bahwa model saya overfitting data, tetapi saya masih berpikir bahwa saya harus dapat mengekstraksi model yang mengikuti pola ini (karena perilaku tidak berubah) dengan ruang model yang cukup besar.Masalah terbesar adalah bahwa pohon regresi (dan algoritma berdasarkan pada mereka seperti hutan acak) memprediksi fungsi konstan piecewise, memberikan nilai konstan untuk input yang jatuh di bawah setiap daun. Ini berarti bahwa ketika mengekstrapolasi di luar domain pelatihan mereka, mereka hanya memperkirakan nilai yang sama seperti yang mereka lakukan untuk titik terdekat di mana mereka memiliki data pelatihan. @ MBQ benar bahwa ada alat khusus untuk mempelajari deret waktu yang mungkin akan lebih baik daripada teknik pembelajaran mesin umum. Namun, hutan acak sangat buruk untuk contoh ini, dan ada teknik ML umum lainnya mungkin akan jauh lebih baik daripada apa yang Anda lihat. SVM dengan kernel nonlinier adalah salah satu opsi yang terlintas dalam pikiran. Karena fungsi Anda memiliki struktur periodik, ini juga menyarankan bekerja domain frekuensi,
sumber
Ini adalah contoh buku teks untuk data yang terlalu pas, model ini bekerja sangat baik pada data yang terlatih tetapi runtuh pada data uji baru. Ini adalah salah satu strategi untuk mengatasinya: Buat validasi silang sepuluh kali lipat dari data pelatihan untuk mengoptimalkan parameter.
Langkah 1. Buat fungsi meminimalkan MSE menggunakan optimasi NM. Contohnya dapat dilihat di sini: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-using-fmin.html
Langkah 2. Dalam fungsi minimisasi ini, tujuannya adalah untuk mengurangi MSE. Untuk melakukan ini, buat sepuluh kali lipat data di mana model baru dipelajari pada 9 lipatan dan diuji pada lipatan ke 10. Proses ini diulang sepuluh kali, untuk mendapatkan MSE pada setiap lipatan. UMK agregat dikembalikan sebagai hasil dari tujuan.
Langkah 3. Fmin dengan python akan melakukan iterasi untuk Anda. Periksa parameter hiper mana yang perlu disetel (n_estimators, max_features, dll.) Dan berikan kepada fmin.
Hasilnya akan menjadi parameter hiper terbaik yang akan mengurangi kemungkinan over-fitting.
sumber
Beberapa saran:
nearest maximum
. Entahlah, itu mungkin berhasil, atau mungkin tidak, Anda hanya bisa tahu jika Anda mengujinya :)sumber
Ini masalah yang menarik. Data Anda menyarankan beberapa keteraturan (berkalax2 suka fungsi) tetapi memiliki puncak tajam pada transisi. Semua ini menunjukkan model yang sedikit rumit. Saya akan memodelkan data ini dengan suksesix2 fungsi parametrized oleh koefisien dan parameter perpindahan.
sumber
Setelah membaca posting di atas, saya ingin memberikan jawaban lain yang berbeda.
Untuk model berbasis pohon, seperti hutan acak, mereka tidak dapat memperkirakan nilai di luar set pelatihan. Jadi, saya tidak berpikir itu masalah yang terlalu pas, tetapi strategi pemodelan yang salah.
Jadi, apa yang bisa kita lakukan untuk prediksi deret waktu dengan model pohon?
Cara yang mungkin adalah menggabungkannya dengan regresi linier: pertama, detrend deret waktu (atau tren pemodelan dengan regresi linier), kemudian memodelkan residual dengan pohon (residual dibatasi, sehingga model pohon dapat mengatasinya).
Selain itu, ada model pohon yang dikombinasikan dengan regresi linier dapat memperkirakan, yang disebut cubist, melakukan regresi linier pada daun.
sumber
Jika Anda hanya ingin memprediksi dalam batas-batas grafik, maka cukup dengan mengacak pengamatan sebelum memecah kumpulan data harus memecahkan masalah. Ini kemudian menjadi masalah interpolasi dari yang ekstrapolasi seperti yang ditunjukkan.
sumber