sklearn - masalah overfitting

8

Saya mencari rekomendasi untuk cara terbaik ke depan untuk masalah pembelajaran mesin saya saat ini

Garis besar masalah dan apa yang telah saya lakukan adalah sebagai berikut:

  • Saya memiliki 900+ uji coba data EEG, di mana setiap uji coba berdurasi 1 detik. Kebenaran dasar diketahui untuk masing-masing dan mengklasifikasikan status 0 dan status 1 (pemisahan 40-60%)
  • Setiap percobaan melewati preprocessing di mana saya menyaring dan mengekstrak kekuatan pita frekuensi tertentu, dan ini membentuk seperangkat fitur (fitur matrix: 913x32)
  • Lalu saya menggunakan sklearn untuk melatih model. cross_validation digunakan di mana saya menggunakan ukuran uji 0,2. Pengklasifikasi diatur ke SVC dengan rbf kernel, C = 1, gamma = 1 (Saya telah mencoba sejumlah nilai yang berbeda)

Anda dapat menemukan versi singkat dari kode di sini: http://pastebin.com/Xu13ciL4

Masalah saya:

  • Ketika saya menggunakan classifier untuk memprediksi label untuk set pengujian saya, setiap prediksi adalah 0
  • akurasi kereta adalah 1, sedangkan akurasi set tes sekitar 0,56
  • plot kurva belajar saya terlihat seperti ini:

masukkan deskripsi gambar di sini

Sekarang, ini seperti kasus klasik overfitting di sini. Namun, overfitting di sini tidak mungkin disebabkan oleh jumlah fitur yang tidak proporsional pada sampel (32 fitur, 900 sampel). Saya sudah mencoba beberapa hal untuk mengatasi masalah ini:

  • Saya sudah mencoba menggunakan pengurangan dimensionalitas (PCA) jika itu karena saya memiliki terlalu banyak fitur untuk jumlah sampel, tetapi skor akurasi dan alur kurva pembelajaran terlihat sama seperti di atas. Kecuali jika saya mengatur jumlah komponen di bawah 10, pada titik mana akurasi kereta mulai menurun, tetapi apakah ini agak tidak diharapkan mengingat Anda mulai kehilangan informasi?
  • Saya telah mencoba menormalkan dan menstandarkan data. Standarisasi (SD = 1) tidak melakukan apa pun untuk mengubah skor kereta atau akurasi. Normalisasi (0-1) menurunkan akurasi pelatihan saya menjadi 0,6.
  • Saya sudah mencoba berbagai pengaturan C dan gamma untuk SVC, tetapi mereka tidak mengubah skor mana pun
  • Sudah mencoba menggunakan estimator lain seperti GaussianNB, bahkan metode ensemble seperti adaboost. Tidak ada perubahan
  • Mencoba secara eksplisit menetapkan metode regularisasi menggunakan linearSVC tetapi tidak memperbaiki situasi
  • Saya mencoba menjalankan fitur yang sama melalui jaring saraf menggunakan theano dan akurasi kereta saya sekitar 0,6, tes sekitar 0,5

Saya senang terus memikirkan masalah tetapi pada saat ini saya sedang mencari dorongan ke arah yang benar. Di mana mungkin masalah saya dan apa yang bisa saya lakukan untuk menyelesaikannya?

Sangat mungkin bahwa rangkaian fitur saya tidak membedakan antara 2 kategori, tetapi saya ingin mencoba beberapa opsi lain sebelum beralih ke kesimpulan ini. Selain itu, jika fitur saya tidak membedakan maka itu akan menjelaskan skor set tes rendah, tetapi bagaimana Anda mendapatkan skor set pelatihan yang sempurna dalam kasus itu? Apakah itu mungkin?

Simon
sumber
1
Seperti apa tampilan data dalam 2 atau 3 dimensi setelah Anda menerapkan PCA, apakah ada kluster yang terlihat? Contoh apa yang dikelompokkan secara keliru, apakah ada polanya?
image_doctor
Seperti apa spektrum kekuatan jejak? jika Anda memplot spektra rata-rata untuk setiap kelas, apakah mereka terlihat berbeda, jika demikian bagaimana dan dapatkah Anda mengoptimalkan classifier untuk menangkap perbedaan itu?
image_doctor
1) Bisakah Anda menunjukkan plot plot PCA ?, 2) Sudahkah Anda mencoba pohon keputusan? Jika fitur asli agak dapat diteliti oleh manusia, Anda mungkin dapat memahami di mana letak kesalahannya. Kalau tidak (kecuali ada bug konyol di pihak Anda), sepertinya fitur Anda tidak cukup diskriminatif.
lollercoaster
Sangat mungkin bahwa data EEG tidak dapat dipisahkan, tetapi apakah Anda telah memeriksa set pelatihan v tes untuk memastikan mereka tidak bias (misalnya seseorang hanya memiliki contoh positif atau dinormalisasi secara berbeda)?
jamesmf
1
Bisakah Anda memposting data di suatu tempat? Baik "allData" atau "features_all" (tanpa normalisasi dan PCA).
stmax

Jawaban:

1

Untuk melihat apakah SVM dapat menangkap sinyal sama sekali, cobalah untuk menyeimbangkan data Anda: buat set pelatihan dan tes yang terdiri dari sampel tepat 50% positif dan negatif 50% (yaitu, dengan subsampling secara acak dari mana yang lebih besar). Juga membakukan data (kurangi rata-rata dan bagi dengan standar deviasi).

(Untuk menyeimbangkan, Anda dapat mencoba mengubah class_weight parameter dalam sklearn, tapi kami menemukan metode manual (subsampling) untuk bekerja lebih baik.)

Valentas
sumber