Saya memiliki database dari aplikasi Facebook saya dan saya mencoba menggunakan pembelajaran mesin untuk memperkirakan usia pengguna berdasarkan situs Facebook yang mereka sukai.
Ada tiga karakteristik penting dari basis data saya:
distribusi usia di set pelatihan saya (12k jumlah pengguna) condong ke pengguna yang lebih muda (yaitu saya memiliki 1157 pengguna berusia 27, dan 23 pengguna berusia 65);
banyak situs yang memiliki tidak lebih dari 5 liker (saya memfilter situs FB dengan kurang dari 5 liker).
ada lebih banyak fitur daripada sampel.
Jadi, pertanyaan saya adalah: strategi apa yang akan Anda sarankan untuk menyiapkan data untuk analisis lebih lanjut? Haruskah saya melakukan semacam pengurangan dimensi? Metode ML mana yang paling tepat untuk digunakan dalam kasus ini?
Saya terutama menggunakan Python, jadi petunjuk khusus Python akan sangat dihargai.
sumber
Jawaban:
Satu hal untuk memulai adalah k-NN. Idenya di sini adalah bahwa Anda memiliki matriks pengguna / item dan untuk beberapa pengguna Anda memiliki usia yang dilaporkan. Usia untuk seseorang dalam matriks item pengguna mungkin ditentukan dengan baik oleh sesuatu seperti usia rata-rata atau median dari beberapa tetangga terdekat dalam ruang item.
Jadi, Anda memiliki setiap pengguna yang dinyatakan sebagai vektor dalam ruang item, menemukan k tetangga terdekat dan menetapkan vektor dalam pertanyaan beberapa ringkasan statistik usia tetangga terdekat. Anda dapat memilih k pada jarak cutoff atau lebih realistis dengan secara iteratif menetapkan usia untuk kereta bertahan dan memilih k yang meminimalkan kesalahan dalam tugas itu.
Jika dimensi adalah masalah, Anda dapat dengan mudah melakukan pengurangan dalam pengaturan ini dengan dekomposisi nilai tunggal memilih vektor m yang menangkap varians paling banyak di seluruh grup.
Dalam semua kasus karena setiap fitur adalah biner, tampaknya kesamaan cosinus adalah metrik jarak jauh Anda.
Saya perlu berpikir lebih banyak tentang pendekatan lain (regresi, rf, dll ...) mengingat fokus sempit ruang fitur Anda (semua varian dari tindakan yang sama, suka) Saya pikir pendekatan pengguna / item mungkin yang terbaik.
Satu catatan hati-hati, jika usia yang Anda miliki untuk kereta dilaporkan sendiri, Anda mungkin perlu memperbaiki beberapa di antaranya. Orang-orang di facebook cenderung melaporkan usia pada dekade mereka dilahirkan. Plot histogram tanggal lahir (berasal dari usia) dan lihat apakah Anda memiliki paku pada dekade seperti 70an, 80an, 90an.
sumber
sklearn.neighbors.KNeighborsRegressor
cosinus metrik pada ruang yang dikurangi SVD (setelah menerapkan SVD kesalahan estimasi rata-rata turun dari ~ 6 tahun menjadi ~ 4). Pengguna di basis data saya berusia 18-65 (pengguna yang lebih tua disaring), jadi ada 48 kelas yang memungkinkan. Saya bertanya-tanya apakah itu tidak terlalu banyak kelas untuk kNN, dan apakah saya harus memperlakukannya sebagai regresi atau masalah klasifikasi (saya pikir keduanya berlaku).Saya baru-baru ini melakukan proyek serupa di Python (memprediksi pendapat menggunakan data seperti FB), dan memiliki hasil yang baik dengan proses dasar berikut:
Dalam kasus Anda, Anda harus menukar classifier dengan regressor (jadi lihat di sini: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ) tetapi sebaliknya proses yang sama harus bekerja tanpa banyak kesulitan.
Juga, Anda harus menyadari fitur paling menakjubkan dari hutan acak di Python: paralelisasi instan! Kita yang mulai melakukan ini dalam R dan kemudian pindah selalu kagum, terutama ketika Anda mulai bekerja pada mesin dengan beberapa lusin inti (lihat di sini: http://blog.yhathq.com/posts/comparing- random-forest-in-python-and-r.html ).
Akhirnya, perhatikan bahwa ini akan menjadi aplikasi yang sempurna untuk analisis jaringan jika Anda memiliki data tentang teman dan juga individu itu sendiri. Jika Anda dapat menganalisis usia teman pengguna, usia pengguna hampir pasti akan berada dalam satu atau dua tahun rata-rata di antara teman-temannya, terutama jika pengguna masih cukup muda untuk membangun jaringan pertemanan mereka saat masih di sekolah (karena sebagian besar akan menjadi teman sekelas). Prediksi itu kemungkinan akan mengalahkan apa pun yang akan Anda dapatkan dari pemodelan --- ini adalah contoh buku teks dari masalah di mana data yang tepat> model yang tepat setiap saat.
Semoga berhasil!
sumber
Saran lain adalah untuk menguji regresi logistik . Sebagai bonus tambahan, bobot (koefisien) dari model akan memberi Anda gambaran tentang situs mana yang membedakan usia.
Sklearn menawarkan paket sklearn.linear_model.LogisticRegression yang dirancang untuk menangani data yang jarang juga.
Seperti disebutkan dalam komentar, dalam kasus ini, dengan lebih banyak variabel input daripada sampel, Anda perlu mengatur model (dengan sklearn.linear_model.LogisticRegression menggunakan
penalty='l1'
argumen).sumber
Beberapa penelitian dari D. Nguyen et al. cobalah untuk memprediksi umur pengguna twitter berdasarkan tweet mereka. Mungkin Anda menemukan mereka berguna. Mereka menggunakan regresi logistik dan linier.
sumber
Terlepas dari metode yang lebih menarik, Anda bisa mencoba formula Bayes
P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))
P (I | p1 ... pn) adalah probabilitas bahwa seorang pengguna termasuk dalam kelompok umur I jika ia menyukai p1, .., pn
P (i) adalah probabilitas bahwa pengguna termasuk dalam kelompok umur i
P (p1 .. pn | i) adalah probabilitas bahwa pengguna menyukai p1,,, pn jika ia termasuk dalam kelompok umur i.
Untuk memperkirakan P (p1 ... pn | i), untuk setiap kelompok umur, saya memperkirakan probabilitas (frekuensi) p_ij untuk menyukai halaman j. Agar p_ij bukan nol untuk semua j, Anda dapat mencampur frekuensi untuk seluruh populasi dengan bobot kecil.
Kemudian log P (p1 ... pn | i) = jumlah (log p_ij, i = p1, .., pn), jumlah atas semua halaman yang disukai pengguna baru. Rumus ini kira-kira benar dengan asumsi bahwa pengguna menyukai halaman dalam kelompok usianya secara mandiri.
Jika Anda atau orang lain telah mencoba ini, beri komentar tentang hasilnya.
sumber
Ini masalah yang sangat menarik.
Saya menghadapi hal serupa dengan menganalisis gambar yang diunggah pengguna ke jejaring sosial. Saya melakukan pendekatan berikut:
Pendekatan ini adalah pembelajaran semi-diawasi dan saya merekomendasikannya jika Anda hanya memiliki beberapa label data.
Tolong, perhatikan bahwa di jejaring sosial, orang biasanya berbohong tentang usia (hanya untuk bersenang-senang, atau kadang-kadang karena mereka ingin berbagi diri di jejaring sosial).
sumber