Sabit olmayan kategorik verilerle nasıl sınıflandırma yapabilirim?


11

Hem kategorik hem de sayısal verilerle bir sınıflandırma problemim var. Karşılaştığım sorun, kategorik verilerimin sabit olmaması, yani etiketini tahmin etmek istediğim yeni adayın önceden gözlemlenmeyen yeni bir kategoriye sahip olabileceği anlamına geliyor.

Örneğin, kategorik verilerim sexolsaydı female, mümkün olan tek etiket maleve otherne olursa olsun olurdu . Ancak, kategorik değişkenim, citytahmin etmeye çalıştığım kişinin sınıflandırıcısının hiç görmediği yeni bir şehre sahip olması olabilir.

Sınıflandırmayı bu terimlerle yapmanın bir yolu olup olmadığını veya bu yeni kategorik verileri dikkate alarak eğitimi tekrar yapmam gerekip gerekmediğini merak ediyorum.


1
citybazı fonksiyonlara dayalı bir sayıya dönüştürebilir misiniz? Gibi city' = f(latitude, longitude)bu şekilde, herhangi bir şehir için yeni bir değer oluşturabilir
Mohammad Athar

@MohammadAthar mükemmel bir çözüm verdi, OP'nin bunu görmesini umuyoruz!
Francesco Pegoraro

Yanıtlar:


12

Çok iyi bir soru; Aslında bu sorun bir süredir var ve henüz mükemmel çözümü bulamadım. Ancak deneyimlerimi paylaşmaktan mutluluk duyuyorum:

  • Bir-sıcak kodlamadan mümkün olduğunca kaçının (yukarıda önerilenin aksine). Sebep, işe yaramayacağıdır. Tekli sıcak kodlama özelliklerine sahip bir model, yalnızca eğitim verilerinde tüm bu alt düzeyler mevcut olduğunda çalışır. Bir şekilde manuel olarak ayarlanmadığı sürece model tahmin yapamaz. Arama yaparsanız, birçok kişi verilerini tren / teste böldüğünde bu sorunla karşılaştı ve eğitim bölümünde belirli bir özelliğin bazı alt düzeyleriyle karşılaşılmadığını ve daha sonra testte tahmin yapamadığını göreceksiniz. Bir kenara, çok yüksek kardinal özelliklere sahipseniz (belki de 200 şehir adıyla şehriniz gibi), verilerinizin boyutsallığını gereksiz yere artıracaktır! Bazı nedenlerden ötürü bir sıcak kodlama yapmanız gerekebilir, bunları aklınızda bulundurun.
  • Diğer Kodlama Yöntemlerini Kullanın . Belki de en azından hedef tabanlı kodlama, karma gibi bu konu için sağlam olan diğer yöntemler hakkında daha fazla bilgi edinmeyi deneyin (aşağıdaki bazı referanslara bakın). Python ile iseniz güzel bir paket teklif mant kodlama seçenekleri vardır. Diğer basit yöntemlerin genellikle iyi çalıştığını görünce şaşırabilirsiniz.

  • Modelinizi yeniden eğitin . Teorik olarak, treninizi / setinizi öğrenirken aynı dağılıma sahip olmalıydı (çoğunlukla bu hedef dağılım olarak düşünülür, ancak değişkenler için de doğru olabilir). Şimdi yeni öğeler devreye girdiğinde, test (görünmeyen) veri dağıtımınız değişti. O zaman bu yeni şehirlerin hesaba katılması için modeli tekrar eğitmek en iyisidir .

  • Yeni Eklenen Alt Kategorileri (ve en az sık olanları) Diğerlerine koyun . Teorik olarak daha önceki nokta doğru olmakla birlikte, test dağılımının (belirli bir kategorinin) çoğu durumda, örneğin çok az sayıda öğe, eğitim setindeki kategorilerin üstünde yer almasını büyük ölçüde değiştirmeyecektir. Belki de sizin durumunuzda olduğu gibi, şehir özelliğinde 100 şehre sahip olabilirsiniz ve zamanla çok az yeni şehir gelir. Ne düşünürdüm o kategorinin X-quantile edelim ve en az sıklıkla Diğerleri alt kategorisine koymak olacaktır . Yeni eklenen veri noktanızın çok az olduğunu varsayarsak, diğerlerine çok girecekgrubudur. Bunu yaparak kesinlikle bir ayrıntı düzeyi kaybedeceksiniz, ancak bir kez daha öğrenme noktası, sadece modelinizin eğitim verilerini öğrenmesi değil, en önemlisi görünmeyen veriler ve bu yeni eklenen kategoriler hakkında çok iyi genelleme yapabilmesidir. çok veri noktalarıysa, bunları tamamen Diğerleri grubunda gruplandırmak incitmez.

  • Cat2Vec (NLP'den Word2Vec'ten ödünç alınmıştır) veya Benzerlik Kodlaması gibi Diğer Henüz Olgun Olmayan Çözümler . Bunlar, çok yeni olan kontrol kağıdı eski ve için github ve bir (Word2Vec dayanarak) Örneğin Kaggle içinde ve bu kağıdı ikincisi ve için uygulanması . Birincisinin fikri kategorileri vektörlere dönüştürmektir. Söylemek zorunda olduğum kadarıyla çalışmak gerçekten mantıklı, ama bunu kullanma konusunda hiçbir deneyimim yok. İkincisi, dirty_cat olarak adlandırılan , oldukça umut verici ve kullanımı kolay görünüyor. Test verilerinizde görünmeyen kardinal kategoriye sahip olmanın sağlam olup olmadığı benim için açık değil!

Not: İlk yorumda verilen coğrafi bir konuma şehir fikrinin gerçekten güzel olduğunu eklemek isterim ve aslında bunu yapmanıza izin veren birçok Python API'sı olduğu için karmaşık değildir. Ancak bunun sadece yeni özellikleri tasarlamanın ve kesinlikle şehir özelliğinin yerini almamasının bir yolu olduğu belirtiliyor.

Birinci , ikinci , üçüncü , dördüncü kontrol etmek için ilginç referanslar (özel bir sipariş yok!)

Yukarıda belirtilen tüm noktalar, teorik olarak doğru ve kesinlikle daha fazla tartışmaya tabi olan pratik çözümlerdir. Daha fazlasını öğrenmek beni mutlu ediyor.


1
Benzer şehirlerde kümelenme yaratmaya ne dersiniz? Yeni bir şehrimiz olsa bile, zaten sahip olduğumuzdan farklı değil, en yakın eşleşen şehirle çapraz kontrol yapabilir miyiz?
Aditya

Zevk Aditya. Bu da mükemmel bir fikir. Yeni "Benzerlik Kodlaması" nı bilmiyorum, aynı şeyi yapıyor olmaları olabilir. Eğiticilerini kontrol edin. Ayrıca bir yan not, k-modları gibi kategorik veriler için ne kümelenmenin kullanılacağına dikkat etmelidir, tüm mesafeleri sayısal değerlerle aynı anlama gelmez.
TwinPenguins

Harika cevabınız için teşekkür ederim. Yeniden eğitmeyi nasıl yapabilirim? Demek istediğim, yeni bir adayım olduğunu hayal edin ve onun iyi ya da kötü olup olmadığını tahmin etmek istiyorum, iyi etiketinin iyi olup olmadığını gösteren bir modelim yoksa modelimi nasıl yeniden eğitebilirim? Yeniden eğitimi yapmak için bu yeni verileri dahil etmenin yolunu görmüyorum ve tahmin noktasını kaçırmış olacağım. Yanlış mıyım?
Marisa

Rica ederim. Yeniden eğitim hakkında: kelimenin tam anlamıyla baştan başlamak, tüm verilerinizi karıştırmak ve yeni verileriniz olduğundan emin olmak ve tekrar öğrenmeye başlamak demektir. Belirli bir yeni veri noktası için gerçek bir etikete sahip olmadığınızdan bahsettiğiniz diğer nokta: bu kendisi için çok farklı bir hikaye. Bu veri noktasını etiketlemek için yapabileceğiniz şey, en benzer veri noktasına bakmak ve etiketi çok basit KNN algoritması gibi oradan almaktır.
TwinPenguins

4

Yapılacak en basit şey (genellikle başlamak için iyi bir yer), her şehrin tek bir özellik haline geldiği ve 1 (kişi o şehirden) veya 0 (değil) bu şehir). Eğitim setinde bulunmayan bir test setinde yeni bir şehir belirirse, o kişi eğitim setindeki tüm şehirler için 0'a sahip olacaktır. Bu garip gelebilir, ancak eğer o şehir eğitim setinde değilse, o şehirden gelen bir kişinin ağırlığı olmamalıdır.

Bir sonraki adım, Muhammed Athar'ın önerdiği şeyler boyunca bir şey olacak ve eğitim setinizdeki diğer şehirlere coğrafi yakınlık hakkında bir fikir edinebilirsiniz. Bu çok daha karmaşık olacak, bu yüzden başka birinin yorum yapmasına izin vereceğim.


Basit başlamak ve oradan büyümek büyük bir tavsiye!
Escachator

0

Bir karma hile ve uyarlanabilir öğrenme oranları kullanarak çok güzel yeni özellikleri işleyen Vowpal Wabbit'e göz atmalısınız .

Yeni özellikler göründüğünde (trende veya test zamanında) çökmekle kalmaz, aynı zamanda üzerindeki ağırlıkları da güncellemeye başlar. Üstüne kötü hızlı. Yine de sadece doğrusal modelin varyantlarını uygular, bu yüzden o tarafta kısıtlısınız. Bilmeniz için çok güçlü bir araç

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.