Teknik pembelajaran mesin untuk memperkirakan usia pengguna berdasarkan situs Facebook yang mereka sukai

25

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.

Wojciech Walczak
sumber
1
Ketika Anda mengatakan "lebih banyak fitur daripada sampel" Saya menganggap Anda berarti jumlah unik situs yang disukai adalah >> pengguna num. Apakah itu juga kasus untuk domain root dari situs? yaitu apakah mereka sejumlah url youtube.com atau cnn.com di situs atau sudah berasal dari domain? Saya condong ke arah pengurangan dimensionalitas dengan mengecilkan URL ke root domain daripada halaman tertentu jika memungkinkan.
cwharland
Terima kasih atas jawabannya. Jumlah fitur (situs disukai unik) adalah 32k, sedangkan jumlah sampel (pengguna) adalah 12k. Fiturnya adalah Halaman Facebook, jadi tidak perlu membendung URL. Seorang pengguna mungkin suka facebook.com/cnn atau tidak. Saya menyukai gagasan mencoba memperkirakan usia pengguna berdasarkan tautan yang mereka bagikan :)
Wojciech Walczak
Ahhh, saya salah membaca deskripsi situs yang disukai. Terimakasih atas klarifikasinya.
cwharland

Jawaban:

16

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.

cwharland
sumber
Hai, jawaban Anda sangat mirip dengan strategi saya yang sebenarnya. Saya menggunakan sklearn.neighbors.KNeighborsRegressorcosinus 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).
Wojciech Walczak
Saya dapat mengatakan, secara anekdot, bahwa saya telah menggunakan Hutan Acak per kelas agar sesuai dengan sejumlah kelas secara individu kemudian menggabungkan hasil masing-masing model dengan berbagai cara. Dalam hal ini Anda bahkan mungkin berpikir tentang menetapkan probabilitas sebelumnya untuk usia masing-masing pengguna dengan kNN, kemudian jalankan melalui setiap model berbasis kelas, gunakan skor tersebut untuk memperbarui probabilitas sebelumnya untuk setiap kelas dan pilih kelas yang paling mungkin dari posisi-posisi itu. Kedengarannya seperti terlalu rumit, tetapi paling buruk Anda akan memiliki akurasi kNN.
cwharland
7

Saya baru-baru ini melakukan proyek serupa di Python (memprediksi pendapat menggunakan data seperti FB), dan memiliki hasil yang baik dengan proses dasar berikut:

  1. Baca di set pelatihan (n = N) dengan mengulangi koma-dibatasi seperti catatan baris demi baris dan menggunakan penghitung untuk mengidentifikasi halaman yang paling populer
  2. Untuk setiap halaman K yang paling populer (saya menggunakan sekitar 5000, tetapi Anda bisa bermain-main dengan nilai yang berbeda), gunakan panda. DataFrame.isin untuk menguji apakah setiap individu dalam set pelatihan menyukai setiap halaman, lalu buat kerangka data N x K hasil (saya akan menyebutnya xdata_train)
  3. Buat seri (saya akan menyebutnya ydata_train) yang berisi semua variabel hasil (dalam pendapat kasus saya, di usia Anda) dengan indeks yang sama dengan xdata_train
  4. Mengatur classifier hutan acak melalui scikit-belajar untuk memprediksi ydata_train berdasarkan xdata_train
  5. Gunakan pengujian validasi silang scikit-learn untuk mengubah parameter dan memperbaiki akurasi (mengubah jumlah halaman populer, jumlah pohon, ukuran daun min, dll.)
  6. Keluarkan classifier hutan acak dan daftar halaman paling populer dengan acar (atau ingatlah jika Anda melakukan semuanya sekaligus)
  7. Muat di sisa data Anda, muat daftar halaman populer (jika perlu), dan ulangi langkah 2 untuk menghasilkan xdata_new
  8. Muat classifier hutan acak (jika perlu) dan gunakan untuk memprediksi nilai data xdata_new
  9. Keluarkan skor yang diprediksi ke CSV baru atau format output lain yang Anda pilih

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!

Therriault
sumber
2
Satu aspek menarik dari menggunakan 5000 situs teratas adalah kenyataan bahwa mereka mungkin tidak pandai mensegmentasi pengguna berdasarkan usia. Situs teratas, berdasarkan konstruksi, adalah situs yang dikunjungi semua orang. Karena itu mereka tidak pandai mensegmentasi pengguna Anda karena semua klasifikasi yang mungkin (usia) telah terlibat dengan situs-situs tersebut. Ini adalah gagasan yang mirip dengan bagian idf dari tf-idf. idf membantu menyaring kebisingan "semua orang memiliki fitur ini". Bagaimana peringkat situs yang paling banyak dikunjungi sebagai fitur dalam plot kepentingan variabel Anda dengan RF Anda?
cwharland
1
Poin bagus. Perbaikan yang mudah untuk ini adalah dengan stratifikasi dataset pelatihan ke dalam keranjang usia (mis., 13-16, 17-20, 21-24, dll.) Dan ambil halaman teratas (K / J) untuk setiap grup. Itu akan memastikan Anda memiliki perwakilan yang signifikan untuk setiap grup. Pasti akan ada beberapa tumpang tindih antar grup, jadi jika Anda benar-benar pilih-pilih Anda mungkin ingin mengambil halaman unik (K / J) untuk setiap grup, tapi saya pikir itu mungkin berlebihan.
Therriault
5

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).

damienfrancois
sumber
1
Dengan LR Anda harus membuat beberapa model untuk nampan usia. Bagaimana membandingkan dua model untuk nampan usia yang berbeda yang memprediksi masalah yang sama pada inklusi untuk pengguna?
cwharland
1
Perhatikan bahwa LR gagal ketika ada lebih banyak variabel daripada pengamatan dan berkinerja buruk jika asumsi model tidak terpenuhi. Untuk menggunakannya, pengurangan dimensi harus menjadi langkah pertama.
Christopher Louden
1
@ cwharland Anda tidak boleh menganggap variabel respons sebagai kategorikal karena sifatnya kontinu, dan tidak sesuai dengan definisi masalah. Mempertimbangkannya kategoris berarti mengatakan algoritma yang memprediksi usia 16 ketika sebenarnya 17 adalah sebagai kesalahan serius seperti memprediksi 30 ketika sebenarnya 17. Mempertimbangkannya terus menerus memastikan bahwa kesalahan kecil (16 vs 17) dianggap kesalahan kecil dan besar ( 30 vs 17) dianggap besar. Regresi logistik digunakan dalam kasus ini untuk memprediksi nilai kontinu dan tidak memperkirakan probabilitas posterior.
damienfrancois
@ChristopherLouden Anda benar bahwa versi vanilla dari regresi logistik tidak cocok untuk kasus 'p besar n' besar, saya seharusnya menyebutkan bahwa regularisasi penting dalam kasus ini. Saya memperbarui jawaban saya. Tapi L1-regularized LR adalah semacam pemilihan fitur jadi saya menganggap tidak perlu untuk langkah FS awal.
damienfrancois
@damienfrancois: Saya pasti setuju. Saya hanya sedikit khawatir bahwa dalam hal ini LR akan menghukum nilai menengah terlalu keras. Tampaknya tidak ada motivasi untuk memetakan ke kurva seperti sigmoidal mengingat Anda tidak terlalu tertarik pada nilai-nilai usia yang ekstrim. Mungkin saya salah menafsirkan penggunaannya.
cwharland
4

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.

lgylym
sumber
3

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.

  • Anda sudah memiliki perkiraan untuk P (i) dari data Anda: ini hanya proporsi pengguna 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.

  • Secara teoritis, Anda juga harus menambahkan log (1-p_ij) untuk semua saya yang tidak dia sukai, tetapi dalam praktiknya Anda harus menemukan bahwa jumlah log (1-p_ij) akan menjadi kecil tidak relevan, sehingga Anda tidak perlu terlalu banyak memori.

Jika Anda atau orang lain telah mencoba ini, beri komentar tentang hasilnya.

Valentas
sumber
2

Ini masalah yang sangat menarik.

Saya menghadapi hal serupa dengan menganalisis gambar yang diunggah pengguna ke jejaring sosial. Saya melakukan pendekatan berikut:

  • Daripada mengaitkan data dengan usia (15 tahun, 27 tahun, ...) yang saya lakukan adalah membentuk kelompok usia yang berbeda: Kurang dari 18, dari 18 hingga 30 dan lebih dari 30 (ini disebabkan oleh masalah khusus kami menghadap, tetapi Anda dapat memilih interval apa pun yang Anda inginkan). Divisi ini banyak membantu menyelesaikan masalah.
  • Setelah itu, saya membuat pengelompokan hierarkis (memecah belah atau agregat). Lalu saya memilih cabang-cabang di mana saya memiliki pengguna dengan usia yang diketahui (atau usia kelompok) dan kemudian untuk cabang itu saya memperpanjang usia yang sama untuk kelompok itu.

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).

adesantos
sumber