Bagaimana cara meningkatkan akurasi pengklasifikasi?

16

Saya menggunakan contoh OpenCV letter_recog.cpp untuk bereksperimen pada pohon acak dan pengklasifikasi lainnya. Contoh ini memiliki implementasi enam pengklasifikasi - pohon acak, penguat, MLP, kNN, Bayes naif dan SVM. Kumpulan data pengenalan huruf UCI dengan 20.000 instance dan 16 fitur digunakan, yang saya bagi menjadi dua untuk pelatihan dan pengujian. Saya memiliki pengalaman dengan SVM jadi saya dengan cepat mengatur kesalahan pengakuannya menjadi 3,3%. Setelah beberapa percobaan apa yang saya dapatkan adalah:

Pengenalan surat UCI:

  • RTrees - 5.3%
  • Tingkatkan - 13%
  • MLP - 7,9%
  • kNN (k = 3) - 6,5%
  • Bayes - 11,5%
  • SVM - 3,3%

Parameter yang digunakan:

  • RTrees - max_num_of_trees_in_the_forrest = 200, max_depth = 20, min_sample_count = 1

  • Boost - boost_type = REAL, weak_count = 200, weight_trim_rate = 0.95, max_depth = 7

  • MLP - method = BACKPROP, param = 0.001, max_iter = 300 (nilai default - terlalu lambat untuk bereksperimen)

  • kNN (k = 3) - k = 3

  • Bayes - tidak ada

  • Kernel SVM - RBF, C = 10, gamma = 0,01

Setelah itu saya menggunakan parameter yang sama dan diuji pada dataset Digit dan MNIST dengan mengekstraksi fitur gradient terlebih dahulu (ukuran vektor 200 elemen):

Digit:

  • RTrees - 5.1%
  • Tingkatkan - 23,4%
  • MLP - 4.3%
  • kNN (k = 3) - 7,3%
  • Bayes - 17,7%
  • SVM - 4.2%

MNIST:

  • RTrees - 1.4%
  • Tingkatkan - kehabisan memori
  • MLP - 1.0%
  • kNN (k = 3) - 1.2%
  • Bayes - 34,33%
  • SVM - 0,6%

Saya baru untuk semua pengklasifikasi kecuali SVM dan kNN, untuk dua ini saya bisa mengatakan hasilnya tampak baik-baik saja. Bagaimana dengan orang lain? Saya berharap lebih dari pohon acak, pada MNIST kNN memberikan akurasi yang lebih baik, ada ide bagaimana cara mendapatkannya lebih tinggi? Boost dan Bayes memberikan akurasi yang sangat rendah. Pada akhirnya saya ingin menggunakan pengklasifikasi ini untuk membuat sistem multi classifier. Ada saran?

Mika
sumber

Jawaban:

9

Pengurangan Dimensi

Prosedur penting lainnya adalah membandingkan tingkat kesalahan pada pelatihan dan dataset uji untuk melihat apakah Anda overfitting (karena "kutukan dimensi"). Misalnya, jika tingkat kesalahan Anda pada dataset uji jauh lebih besar daripada kesalahan pada set data pelatihan, ini akan menjadi salah satu indikator.
Dalam hal ini, Anda bisa mencoba teknik pengurangan dimensionalitas, seperti PCA atau LDA.

Jika Anda tertarik, saya telah menulis tentang PCA, LDA dan beberapa teknik lain di sini: http://sebastianraschka.com/index.html#machine_learning dan dalam repo GitHub saya di sini: https://github.com/rasbt/pattern_classification

Validasi silang

Anda juga mungkin ingin melihat teknik cross-validasi untuk mengevaluasi kinerja pengklasifikasi Anda dengan cara yang lebih objektif


sumber
Ya, memang tingkat kesalahan pada set data pelatihan sekitar 0. Mengubah parameter untuk mengurangi overfitting tidak menghasilkan akurasi yang lebih tinggi pada dataset uji dalam kasus saya. Saya akan melihat teknik yang Anda sebutkan sesegera mungkin dan berkomentar, terima kasih.
Mika
Berapa proporsi relatif dari pelatihan dan dataset uji btw? Garis sesuatu 70:30, 60:40, atau 50:50?
Dataset pertama - Pengenal huruf UCI diatur ke 50:50 (10000: 10000), Digit sekitar 51:49 (1893: 1796) dan MNIST sekitar 86:14 (60000: 10000).
Mika
Saya bereksperimen dengan PCA, masih tidak mendapatkan hasil yang baik dengan forrest acak, tetapi dorongan dan Bayes sekarang memberikan hasil yang mirip dengan pengklasifikasi lainnya. Saya menemukan diskusi tentang forrest acak di sini: stats.stackexchange.com/questions/66543/... Mungkin saya sebenarnya tidak overfitting tetapi tidak dapat menemukan kesalahan prediksi out-of-bag (OOB) yang disebutkan di sana. Menjalankan percobaan sekarang dengan sejumlah besar pohon untuk melihat apakah akurasi akan meningkat.
Mika
Oke, sepertinya Anda membuat sedikit kemajuan :) Pertanyaan sepele, tetapi apakah Anda sudah menstandarkan fitur Anda (skor-z) sehingga mereka terpusat di sekitar rata-rata dengan standar deviasi = 1?
5

Saya mengharapkan lebih banyak dari pohon acak :

  • Dengan hutan acak, biasanya untuk fitur N, fitur sqrt (N) digunakan untuk setiap konstruksi pohon keputusan. Karena dalam kasus Anda N = 20, Anda dapat mencoba mengatur max_depth (jumlah sub-fitur untuk membangun setiap pohon keputusan) menjadi 5.

  • Alih-alih pohon keputusan, model linier telah diusulkan dan dievaluasi sebagai penduga dasar di hutan acak, khususnya regresi logistik multinomial dan Bayes naif. Ini dapat meningkatkan akurasi Anda.

Pada MNIST, kNN memberikan akurasi yang lebih baik, ada ide bagaimana cara membuatnya lebih tinggi?

  • Coba dengan nilai K yang lebih tinggi (katakanlah 5 atau 7). Nilai K yang lebih tinggi akan memberi Anda bukti yang lebih mendukung tentang label kelas suatu titik.
  • Anda bisa menjalankan PCA atau Analisis Linear Diskriminan Fisher sebelum menjalankan k-tetangga terdekat. Dengan ini, Anda berpotensi menyingkirkan fitur yang berkorelasi saat menghitung jarak antara titik, dan karenanya tetangga Anda akan lebih kuat.
  • Coba nilai K yang berbeda untuk titik yang berbeda berdasarkan perbedaan jarak antara tetangga K.
Debat
sumber
Saya percaya Anda merujuk pada parameter OpenCV nactive_vars (bukan max_depth), yang saya atur ke nilai sqrt (N) default, yaitu nactive_vars = sqrt (16) untuk dataset pertama dan sqrt (200) untuk dua lainnya. max_depth menentukan apakah pohon tumbuh ke kedalaman penuh (25 adalah nilai maksimumnya) dan keseimbangan antara kekurangan dan kelebihan, lebih banyak di sini: stats.stackexchange.com/questions/66209/… Tidak yakin tentang min_sample_count tapi saya mencoba berbagai nilai dan mengaturnya ke 1 bekerja paling baik.
Mika
Dokumentasi OpenCV memberikan penjelasan singkat tentang parameter: docs.opencv.org/modules/ml/doc/... Untuk saat ini saya ingin membuat pohon acak bekerja dengan baik dan menjaga hal-hal sederhana karena saya ingin fokus bekerja dengan sistem multi classifier.
Mika
Tentang kNN - ini semua adalah saran yang sangat bagus, tetapi yang ingin saya katakan adalah bahwa kNN berkinerja lebih baik daripada pengelompokan pohon acak dan saya pikir ada banyak ruang untuk perbaikan dengan pohon acak.
Mika
ya, saya tidak yakin mengapa hutan acak tidak berkinerja baik (atau lebih baik) daripada pendekatan k-NN yang sederhana ... mungkin saja itu merupakan pendekatan berbasis kernel di mana Anda secara langsung mencoba memperkirakan P (y | D) (output data yang diberikan) seperti di k-NN tanpa memperkirakan P (theta | D) (model laten diberikan data) seperti dalam model parametrik.
Debasis