Bagaimana cara menangani campuran input biner dan kontinu dalam jaringan saraf?

14

Saya menggunakan paket nnet dalam R untuk mencoba membangun JST untuk memprediksi harga real estat untuk kondominium (proyek pribadi). Saya baru dalam hal ini dan tidak memiliki latar belakang matematika, jadi tolong beri tahu saya.

Saya memiliki variabel input yang bersifat biner dan kontinu. Misalnya beberapa variabel biner yang awalnya ya / tidak dikonversi ke 1/0 untuk neural net. Variabel lain seperti terus menerus Sqft.

Sampel data input

Saya telah menormalkan semua nilai pada skala 0-1. Mungkin Bedroomsdan Bathroomsseharusnya tidak dinormalisasi karena kisaran mereka hanya 0-4?

Apakah input campuran ini menimbulkan masalah bagi JST? Saya mendapatkan hasil yang baik-baik saja, tetapi setelah memeriksa dengan cermat bobot yang telah dipilih JST untuk variabel-variabel tertentu tampaknya tidak masuk akal. Kode saya di bawah, ada saran?

ANN <- nnet(Price ~ Sqft + Bedrooms + Bathrooms + Parking2 + Elevator + 
            Central.AC + Terrace + Washer.Dryer + Doorman + Exercise.Room + 
            New.York.View,data[1:700,], size=3, maxit=5000, linout=TRUE, decay=.0001)

UPDATE: Berdasarkan komentar di bawah ini tentang memecah input biner ke bidang yang terpisah untuk setiap kelas nilai, kode saya sekarang terlihat seperti:

ANN <- nnet(Price ~ Sqft + Studio + X1BR + X2BR + X3BR + X4BR + X1Bath
        + X2Bath + X3Bath + X4bath + Parking.Yes + Parking.No + Elevator.Yes + Elevator.No 
        + Central.AC.Yes + Central.AC.No + Terrace.Yes + Terrace.No + Washer.Dryer.Yes 
        + Washer.Dryer.No + Doorman.Yes + Doorman.No + Exercise.Room.Yes + Exercise.Room.No 
        + New.York.View.Yes + New.York.View.No + Healtch.Club.Yes + Health.Club.No,
    data[1:700,], size=12, maxit=50000, decay=.0001)

Node tersembunyi dalam kode di atas adalah 12, tetapi saya telah mencoba berbagai node tersembunyi dari 3 hingga 25 dan semuanya memberikan hasil yang lebih buruk daripada parameter asli yang saya miliki di atas dalam kode asli yang diposting. Saya juga sudah mencobanya dengan output linear = true / false.

Dugaan saya adalah bahwa saya perlu memberi makan data ke nnet dengan cara yang berbeda karena itu tidak menafsirkan input biner dengan benar. Entah itu, atau saya perlu memberikan parameter yang berbeda.

Ada ide?

ChrisArmstrong
sumber
1
Cara standar menggunakan data biner atau kategorikal sebagai input jaringan saraf adalah dengan memperluas bidang ke vektor indikator. Misalnya, jika Anda memiliki bidang yang dapat mengambil nilai 1,2, atau 3, maka 1 akan diperluas menjadi [1,0,0], 2 -> [0,1,0], dan 3 -> [ 0,0,1]. Input bernilai nyata umumnya disimpan apa adanya.
user1149913
1
Sekarang setelah Anda menyebutkan ini, saya sepertinya ingat pernah membaca ini di suatu tempat selama pencarian saya untuk jawaban. Jadi karena sumber informasi ada pada file csv, saya sebenarnya perlu menambahkan kolom untuk mengakomodasi bidang baru untuk setiap input biner? Misalnya, jika input kamar tidur berkisar antara 0-4, menggunakan contoh Anda di atas, saya akan membuat 4 kolom tambahan (total 5 karena kamar tidur '0' berarti studio) dan kondominium 3BR akan dinyatakan sebagai 0,0,0,1 , 0?
ChrisArmstrong

Jawaban:

8

Salah satu cara untuk menangani situasi ini adalah mengubah skala input sehingga variansnya berada pada skala yang hampir sama. Saran ini umumnya diberikan untuk pemodelan regresi, tetapi itu benar-benar berlaku untuk semua situasi pemodelan yang melibatkan variabel yang diukur pada skala yang berbeda. Ini karena varians dari variabel biner sering sangat berbeda dari varians dari variabel kontinu. Gelman dan Hill (2006) merekomendasikan untuk men-rescaling input kontinu dengan dua standar deviasi untuk memperoleh paritas dengan input biner (tidak diskalakan). Rekomendasi ini juga tercermin dalam makalah dan posting blog .

Rekomendasi yang lebih spesifik untuk jaringan saraf adalah menggunakan "efek pengkodean" untuk input biner (yaitu, -1 dan 1) alih-alih "pengkodean boneka" (0 ​​dan 1), dan untuk mengambil langkah tambahan memusatkan variabel kontinu. Rekomendasi ini datang dari FAQ yang luas oleh Warren Sarle, khususnya bagian "Mengapa tidak kode input biner sebagai 0 dan 1?" dan "Haruskah saya membakukan variabel input?" Intinya, adalah sama:

Kontribusi input akan sangat bergantung pada variabilitasnya relatif terhadap input lainnya.

Adapun variabel kategori tidak terurut - Anda harus memecahnya menjadi indikator biner. Mereka hanya tidak berarti sebaliknya.

shadowtalker
sumber