Sevdikleri Facebook sitelerine dayanarak kullanıcıların yaşını tahmin etmek için makine öğrenme teknikleri


25

Facebook uygulamamdan bir veritabanım var ve hangi Facebook sitelerini beğendiklerini temel alarak kullanıcıların yaşlarını tahmin etmek için makine öğrenmeyi kullanmaya çalışıyorum.

Veritabanımın üç önemli özelliği var:

  • Eğitim setimdeki yaş dağılımı (toplamda 12 bin kullanıcı) daha genç kullanıcılara çarpıyor (yani 27 yaşımda 1157, 65 yaşımda 23 kullanıcı var);

  • birçok sitenin 5'den fazla beğenisi yoktur (FB sitelerini 5'ten az olanları filtreledim).

  • örneklerden çok daha fazla özellik var.

Öyleyse benim sorularım: Verileri daha ileri analizler için hazırlamak için hangi stratejiyi önerirsiniz? Bir çeşit boyutsallık azaltma mı yapmalıyım? Bu durumda kullanmak için en uygun ML yöntemi hangisidir?

Genel olarak Python kullanıyorum, bu yüzden Python'a özgü ipuçları büyük ölçüde takdir edilecektir.


1
"Örneklerden çok daha fazla özellik" derken, beğendiğiniz sitelerin benzersiz sayısının >> num kullanıcıları olduğunu varsayıyorum. Bu aynı zamanda sitelerin kök etki alanı için de geçerli midir? yani, sitelerde çok sayıda youtube.com veya cnn.com URL'leri var mı, yoksa zaten etki alanına mı bağlı? URL'leri mümkünse belirli sayfalardan ziyade etki alanı köklerine daraltarak boyutsallığı azaltma eğilimindeyim.
cwharland

Cevap için teşekkürler. Özelliklerin sayısı (benzersiz sevilen siteler) 32k, örneklerin sayısı (kullanıcı) 12k'dir. Özellikler Facebook Sayfalarıdır, bu yüzden URL'leri kırmanıza gerek yoktur. Bir kullanıcı facebook.com/cnn adresini beğenebilir veya beğenmeyebilir. Kullanıcıların yaşlarını, paylaştığı bağlantılara dayanarak tahmin etmeye çalışmayı düşünüyorum. :)
Wojciech Walczak

Ahhh, beğendiğim siteler açıklamasını yanlış okudum. Açıklama için teşekkürler.
cwharland

Yanıtlar:


16

Başlamak için bir şey k-NN olacaktır. Buradaki fikir, bir kullanıcı / ürün matrisine sahip olduğunuz ve bazı kullanıcılar için bildirilmiş bir yaşınız olduğu. Kullanıcı madde matrisindeki bir kişinin yaşı, madde alanındaki en yakın bazı komşuların ortalama veya ortanca yaşı gibi bir şey tarafından iyi belirlenebilir.

Öyleyse her bir öğenin uzayında bir vektör olarak ifade ettiniz, en yakın komşuları bulun ve söz konusu vektörü en yakın komşu yaşlarının bir özet statüsünü atayın. Bir mesafeyi kesmek için k'yı veya daha gerçekçi bir atağı atamak için yinelemeli olarak atayarak ve bu atamadaki hatayı en aza indiren k'yi seçerek k seçimini yapabilirsiniz.

Boyutluluk bir sorunsa, gruptaki en fazla varyansı yakalayan m vektörlerini seçerek tek değer ayrıştırma işlemiyle bu kurulumda kolayca azalma yapabilirsiniz.

Her durumda, her özellik ikili olduğundan, kosinüs benzerliğinin mesafe ölçütüne gitmiş olacağınız görülüyor.

Özellik alanınızın dar odak noktasını göz önüne alarak (aynı eylemin tüm değişkenleri, beğenerek) diğer yaklaşımlar (regresyon, rf, vb ...) hakkında biraz daha düşünmem gerekiyor, kullanıcı / öğe yaklaşımının en iyi olabileceğini düşünüyorum.

Dikkat edilmesi gereken bir not, eğer tren için sahip olduğunuz yaşların kendileri rapor edilmişse, bazılarını düzeltmeniz gerekebilir. Facebook'taki insanlar, doğdukları on yılda yaşları bildirme eğilimindedir. Doğum tarihlerinin bir histogramını (yaşlardan türetilmiş) çizin ve 70'lerde, 80'lerde, 90'larda gibi onlarca yılda sivri olup olmadığına bakın.


Merhaba, cevabınız gerçek stratejime oldukça benziyor. sklearn.neighbors.KNeighborsRegressorSVD azaltılmış alanda kosinüs metrik ile kullandım (SVD uygulandıktan sonra ortalama tahmin hatası ~ 6 yıldan 4'e düştü). Veritabanımdaki kullanıcılar 18-65 yaşlarındadır (eski kullanıcılar filtrelenmiştir), bu nedenle 48 olası sınıf vardır. Bunun kNN için çok fazla sınıf olup olmadığını ve bunu regresyon mu yoksa bir sınıflandırma problemi olarak mı tedavi etmem gerektiğini merak ediyorum (her ikisinin de uygulanabilir olduğunu düşünüyorum).
Wojciech Walczak

Tek kelimeyle, rasgele Ormanlar sınıfını bireysel olarak birkaç sınıfa sığdırmak için kullandığımı söyleyebilirim, sonra bu modellerin her birinin sonuçlarını çeşitli şekillerde birleştirdik. Bu durumda, her kullanıcının yaşına kNN ile önceki olasılıkları atamayı düşünebilir, daha sonra her bir sınıf temelli modeli gözden geçirebilir, her bir sınıf için önceki olasılıkları güncellemek için bu puanları kullanabilir ve bu posterlerden en muhtemel sınıfı seçebilirsiniz. Biraz fazla karmaşık gibi görünüyor ama en kötüsü kNN hassasiyetine sahip olacaksınız.
cwharland

7

Geçenlerde Python'da benzer bir proje yaptım (FB benzeri verileri kullanarak görüşleri tahmin ettim) ve aşağıdaki temel işlemle iyi sonuçlar aldım:

  1. Eğitim setinde (n = N) virgülle ayrılmış kayıtlar üzerine satır satır yineleme yaparak okuyun ve en popüler sayfaları tanımlamak için bir sayaç kullanın
  2. En popüler sayfaların her biri için (yaklaşık 5000 kullandım, ancak farklı değerlerle oynayabilirim), eğitim setindeki her bireyin her sayfayı beğenip beğenmediğini test etmek için pandas.DataFrame.isin kullanın, sonra bir N x K veri çerçevesi yapın Sonuçların listesi (Ben buna xdata_train diyeceğim)
  3. Xdata_train ile aynı indekse sahip tüm sonuç değişkenlerini (benim görüşüme göre, yaşına göre) tüm değişkenleri içeren bir dizi (ydata_train olarak adlandırırım) oluşturun
  4. Xdata_train dayalı ydata_train tahmin etmek için scikit-learn aracılığıyla rastgele bir orman sınıflandırıcısı ayarlayın
  5. Parametreleri değiştirmek ve doğruluğu düzeltmek için scikit-learn'ın çapraz doğrulama testini kullanın (popüler sayfaların, ağaçların sayısının, minimum yaprak boyutunun, vb.)
  6. Rastgele orman sınıflandırıcı ve turşu olan en popüler sayfaların listesini çıkar
  7. Verilerinizin kalanını yükleyin, popüler sayfaların listesini yükleyin (gerekirse) ve xdata_new oluşturmak için 2. adımı tekrarlayın
  8. Rastgele orman sınıflandırıcısını yükleyin (gerekirse) ve xdata_new verilerinin değerlerini tahmin etmek için kullanın
  9. Tahmin edilen puanları yeni bir CSV'ye veya seçtiğiniz diğer bir çıktı biçimine gönderin

Sizin durumunuzda, bir regresör için sınıflandırıcıyı değiştirmeniz gerekir (bu nedenle buraya bakınız: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ), ancak aynı işlem fazla sorun çıkarmadan çalışmalı.

Ayrıca, Python'daki rastgele ormanların en şaşırtıcı özelliğinin farkında olmalısınız: anında paralelleştirme! Bunu R'de yapmaya başlayan ve daha sonra taşınan bizler, özellikle birkaç düzine çekirdeğe sahip bir makinede çalışmaya başladığınızda hep şaşırırsınız (buraya bakınız: http://blog.yhathq.com/posts/comparing- rastgele ormanlar-in-python-ve-r.html ).

Son olarak, arkadaşların ve bireylerin kendileri hakkında verilere sahipseniz, bunun ağ analizi için mükemmel bir uygulama olacağını unutmayın. Bir kullanıcının arkadaşlarının yaşlarını analiz edebiliyorsanız, kullanıcının yaşı neredeyse kesinlikle bir yıl veya iki yıl içinde arkadaşlarının arasında olacaktır, özellikle de kullanıcılar hala arkadaşlık ağlarını kuracak kadar arkadaş ağlarını kuracak kadar gençse okul (çoğu sınıf arkadaşı olacağından). Bu tahmin, modelleme konusunda elde edeceğiniz herhangi bir şeyden büyük olasılıkla trump olacaktır - bu, doğru verinin her zaman doğru modelde olduğu bir problemin ders kitabı örneğidir.

İyi şanslar!


2
En iyi 5000 siteyi kullanmanın ilginç bir yönü, kullanıcıları yaşlarına göre ayırmada iyi olmadıklarıdır. En popüler siteler, inşaat olarak herkesin ziyaret ettiği yerlerdir. Bu nedenle, tüm olası sınıflandırmalar (yaşlar) bu sitelerle etkileşimde bulunduğundan, kullanıcılarınızı segmentlere ayırmakta çok iyi değillerdir. Bu, tf-idf'nin idf kısmına benzer bir kavramdır. idf, "herkesin bu özelliği var" gürültüsünü filtrelemeye yardımcı olur. En çok ziyaret edilen siteler değişken öneminizdeki özellikler olarak RF'nizde nasıl yer kapar?
cwharland

1
İyi bir nokta. Bunun için kolay bir düzeltme, eğitim veri setini J yaş kutularına (örneğin 13-16, 17-20, 21-24 vb.) Sınıflandırmak ve her grup için en üstteki (K / J) sayfaları almak olacaktır. Bu, her grup için önemli bir temsiliniz olmasını sağlar. Gruplar arasında kesinlikle bir miktar çakışma olacaktır, bu yüzden gerçekten seçici olsaydınız her grup için en iyi (K / J) benzersiz sayfaları almak isteyebilirsiniz, ama bunun fazladan olabilir.
Therriault

5

Başka bir öneri lojistik regresyon sınamaktır . Ek bir avantaj olarak, modelin ağırlıkları (katsayıları) size hangi sitelerin yaşa göre değiştiği hakkında bir fikir verecektir.

Sklearn, seyrek verileri de işlemek için tasarlanmış sklearn.linear_model.LogisticRegression paketini sunar .

Yorumlarda belirtildiği gibi, bu durumda, örneklerden daha fazla giriş değişkeniyle, modeli düzenlemelisiniz ( sklearn.linear_model.LogisticRegression ile argümanı kullanın penalty='l1').


1
LR ile sanırım yaş kutuları için birden fazla model yapmak zorunda kalacaksınız. Bir kullanıcının dahil edilmesinde aynı problemi öngören farklı yaş kutuları için iki modeli nasıl karşılaştırırdım?
cwharland

1
LR'nin gözlemlerden daha fazla değişken olduğunda başarısız olduğunu ve modelin varsayımlarına uyulmaması durumunda düşük performans gösterdiğini unutmayın. Bunu kullanmak için, boyutluluk azaltma ilk adım olmalıdır.
Christopher Louden

1
@cwharland, doğası gereği sürekli olduğu ve problem tanımı ile ayrıklandığı için kategorik olarak yanıt değişkenini düşünmemelisiniz. Kategorik olarak düşünmek, algoritmaya, aslında 17 yaşındayken 16 yaşını tahmin etmenin, 17 yaşındayken 30'u tahmin etmek kadar ciddi bir hata olduğunu söylemek anlamına geleceği anlamına gelir. 30'a karşı 17) büyük olarak kabul edilir. Bu durumda lojistik regresyon, sürekli değeri tahmin etmek ve arka olasılıkları tahmin etmemek için kullanılır.
damienfrancois

@ChristopherLouden Lojistik regresyonun vanilya versiyonunun 'büyük p küçük n' durumu için uygun olmadığı konusunda haklısınız, mevcut davada düzenlileşmenin önemli olduğunu söylemeliydim. Cevabımı güncelliyorum. Ancak L1 düzenli LR bir nevi özellik seçimidir, bu yüzden ön FS adımına gerek olmadığını düşünüyorum.
damienfrancois

@damienfrancois: Kesinlikle katılıyorum. Sadece bu durumda LR'nin ara değerleri çok sert bir şekilde cezalandırmasından endişe duyuyorum. Aşırı yaş değerleri ile özellikle ilgilenmediğiniz düşünülürse, bir sigmoidal benzeri eğriyle eşleştirmek için hiçbir motivasyon yok gibi görünüyor. Belki de kullanımı yanlış yorumluyorum.
cwharland

4

Bazı araştırmalar D. Nguyen ve diğ. twitter kullanıcısının yaşlarını tweet'lerine göre tahmin etmeye çalışın. Belki onları faydalı buluyorsun. Lojistik ve doğrusal regresyon kullanıyorlar.


3

Meraklısı yöntemlerin dışında Bayes formülünü deneyebilirsiniz

P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))

P (I | p1 ... pn) Kullanıcının eğer p1, .., pn 'yi sevdiyse I yaş grubuna dahil olma olasılığıdır.

P (i) kullanıcının i yaş grubuna ait olma olasılığıdır.

P (p1 .. pn | i), kullanıcının yaş grubuna idiyse p1, .., pn'yi sevme olasılığıdır.

  • Verilerinizden zaten P (i) için tahminlere sahipsiniz: bu sadece yaş grubundaki kullanıcıların oranıdır.
  • P'yi (p1 ... pn | i) tahmin etmek için her yaş grubu için p_ij'in bir sayfayı beğenme ihtimalini (sıklığı) tahmin ediyorum. Tüm j için sıfır olmayan bir p_ij'e sahip olmak için, tüm popülasyon için sıklığı az bir ağırlıkla karıştırabilirsiniz.

  • Daha sonra log P (p1 ... pn | i) = sum (log p_ij, i = p1, .., pn), yeni bir kullanıcının beğendiği tüm sayfaların toplamı. Bu formül, bir kullanıcının yaş grubundaki sayfaları bağımsız olarak beğendiğini varsayarsak yaklaşık olarak doğru olacaktır.

  • Teorik olarak, sevmediğim herkes için log (1-p_ij) eklemelisiniz, fakat pratikte log (1-p_ij) toplamının ilgisizce küçük olacağını bulmalısınız, bu yüzden de ihtiyacınız olmayacak çok fazla hafıza.

Siz veya başkası bunu denediyse, lütfen sonuç hakkında yorum yapın.


2

Bu çok ilginç bir problem.

Kullanıcıların sosyal ağa yükledikleri resimleri analiz ederek benzer bir şeyle karşılaştım. Aşağıdaki yaklaşımı yaptım:

  • Verileri yaşlarla ilişkilendirmek yerine (15 yaş, 27 yaş, ...) yaptığım farklı yaş gruplarını oluşturmaktır: 18 yaşından küçük, 18 yaşından 30 yaşına kadar ve 30 yaşından büyük (bu bizim yaşadığımız özel sorundan kaynaklanmaktadır bakan, ancak istediğiniz aralıkları seçebilirsiniz). Bu bölüm sorunu çözmek için çok yardımcı olur.
  • Daha sonra, hiyerarşik bir kümeleme oluşturdum (bölücü veya toplayıcı). Sonra bilinen yaşlara sahip (veya grup yaşlarına) sahip olduğum şubeleri seçiyorum ve daha sonra bu şubeye aynı yaşı uzattığım gruba.

Bu yaklaşım yarı denetimli bir öğrenimdir ve yalnızca etiketli verileriniz olması durumunda önerdim.

Lütfen, bir sosyal ağda insanların genellikle yaş hakkında yattığına dikkat edin (sadece eğlence için ya da bazen kendilerini sosyal ağda kamufle etmek istediklerinden).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.