SNA Hackathon 2019

Şubat-Mart 2019'da sosyal ağ akışını sıralamak için bir yarışma düzenlendi SNA Hackathon 2019takımımız birinci oldu. Yazıda yarışmanın organizasyonundan, denediğimiz yöntemlerden ve büyük veri eğitimi için catboost ayarlarından bahsedeceğim.

SNA Hackathon 2019

SNA Hackathonu

Bu, bu isim altında üçüncü kez düzenlenen bir hackathon. Sırasıyla ok.ru sosyal ağı tarafından organize edilmektedir, görev ve veriler doğrudan bu sosyal ağ ile ilgilidir.
Bu durumda SNA (sosyal ağ analizi), bir sosyal grafiğin analizi olarak değil, bir sosyal ağın analizi olarak daha doğru anlaşılır.

  • 2014'teki görev, bir gönderinin alacağı beğeni sayısını tahmin etmekti.
  • 2016'da - VVZ görevi (belki aşinasınızdır), sosyal grafiğin analizine daha yakın.
  • 2019'da kullanıcının yayınını, kullanıcının gönderiyi beğenme olasılığına göre sıralamak.

2014'ü söyleyemem ama 2016 ve 2019'da veri analiz yeteneklerinin yanı sıra büyük verilerle çalışma becerileri de gerekiyordu. Beni bu yarışmalara çeken şeyin makine öğrenmesi ve büyük veri işleme problemlerinin birleşimi olduğunu düşünüyorum ve bu alanlardaki deneyimim kazanmama yardımcı oldu.

mlbootcamp

2019 yılında yarışma platformda düzenlendi https://mlbootcamp.ru.

Yarışma 7 Şubat'ta çevrimiçi olarak başladı ve 3 görevden oluşuyordu. Herkes siteye kayıt olabilir, indirebilir bazal ve arabanızı birkaç saatliğine yükleyin. 15 Mart'taki çevrimiçi etabın sonunda, her gösteri atlama etkinliğinin ilk 15'i, 30 Mart'tan 1 Nisan'a kadar gerçekleşen çevrimdışı etap için Mail.ru ofisine davet edildi.

Görev

Kaynak veriler, kullanıcı kimliklerini (userId) ve posta kimliklerini (objectId) sağlar. Kullanıcıya bir gönderi gösterildiyse veriler, kullanıcı kimliğini, nesne kimliğini, bu gönderiye verilen kullanıcı tepkilerini (geri bildirim) ve bir dizi çeşitli özelliği veya resimlere ve metinlere olan bağlantıları içeren bir satır içerir.

Kullanıcı kimliği Nesne Kimliği sahip kimliği geribesleme görüntüleri
3555 22 5677 [beğendim, tıkladım] [karma1]
12842 55 32144 [beğenmedim] [hash2,hash3]
13145 35 5677 [tıklandı, paylaşıldı] [karma2]

Test veri seti benzer bir yapı içeriyor ancak geri bildirim alanı eksik. Görev, geri bildirim alanında 'beğenilen' reaksiyonun varlığını tahmin etmektir.
Gönderim dosyası aşağıdaki yapıya sahiptir:

Kullanıcı kimliği SıralanmışListe[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

Metrik, kullanıcılar için ortalama ROC AUC'sidir.

Verilerin daha ayrıntılı bir açıklaması şu adreste bulunabilir: konsey web sitesi. Ayrıca testler ve resimler de dahil olmak üzere verileri buradan indirebilirsiniz.

Çevrimiçi sahne

Çevrimiçi aşamada görev 3 bölüme ayrıldı

  • İşbirliği sistemi — resimler ve metinler hariç tüm özellikleri içerir;
  • Görüntü — yalnızca resimlerle ilgili bilgileri içerir;
  • metinler — yalnızca metinlerle ilgili bilgileri içerir.

Çevrimdışı aşama

Çevrimdışı aşamada veriler tüm özellikleri içeriyordu, ancak metinler ve resimler çok azdı. Veri kümesinde zaten çok fazla olan 1,5 kat daha fazla satır vardı.

Problemin çözümü

İş yerinde CV hazırladığım için bu yarışmadaki yolculuğuma “Görüntüler” göreviyle başladım. Sağlanan veriler userId, objectId,ownerId (gönderinin yayınlandığı grup), gönderinin oluşturulması ve görüntülenmesi için zaman damgaları ve tabii ki bu gönderinin görseliydi.
Zaman damgalarına dayalı çeşitli özellikler oluşturduktan sonra, bir sonraki fikir, imagenet üzerinde önceden eğitilmiş nöronun sondan bir önceki katmanını almak ve bu yerleştirmeleri güçlendirmeye göndermekti.

SNA Hackathon 2019

Sonuçlar etkileyici değildi. Imagenet nöronundan gelen yerleştirmelerin alakasız olduğunu düşündüm, kendi otomatik kodlayıcımı yapmam gerektiğini düşündüm.

SNA Hackathon 2019

Çok zaman aldı ve sonuç düzelmedi.

Özellik oluşturma

Resimlerle çalışmak çok zaman alıyor, bu yüzden daha basit bir şey yapmaya karar verdim.
Hemen görebileceğiniz gibi, veri setinde birkaç kategorik özellik var ve çok fazla uğraşmamak için sadece catboost aldım. Çözüm mükemmeldi, herhangi bir ayar yapmadan hemen skor tablosunun ilk satırına ulaştım.

Oldukça fazla veri var ve parke formatında düzenlenmiş, bu yüzden iki kez düşünmeden scala'yı aldım ve her şeyi kıvılcımla yazmaya başladım.

Görüntü yerleştirmelerden daha fazla büyüme sağlayan en basit özellikler:

  • verilerde nesne kimliği, kullanıcı kimliği ve sahip kimliği kaç kez göründü (popülerlikle ilişkili olmalıdır);
  • userId'nin,ownerId'den kaç gönderi gördüğü (kullanıcının gruba olan ilgisiyle ilişkili olmalıdır);
  • sahibi kimliğinden gelen gönderileri kaç benzersiz kullanıcı kimliğinin görüntülediği (grubun izleyici kitlesinin boyutunu yansıtır).

Zaman damgalarından, kullanıcının yayını izlediği günün saatini (sabah/öğleden sonra/akşam/gece) elde etmek mümkündü. Bu kategorileri birleştirerek özellikler oluşturmaya devam edebilirsiniz:

  • userID'nin akşam kaç kez oturum açtığı;
  • bu gönderinin en sık ne zaman gösterildiği (objectId) vb.

Bütün bunlar yavaş yavaş ölçüyü geliştirdi. Ancak eğitim veri kümesinin boyutu yaklaşık 20 milyon kayıt olduğundan, özelliklerin eklenmesi eğitimi büyük ölçüde yavaşlattı.

Verileri kullanma yaklaşımımı yeniden düşündüm. Veriler zamana bağlı olmasına rağmen "gelecekte" herhangi bir belirgin bilgi sızıntısı görmedim, yine de her ihtimale karşı verileri şu şekilde parçaladım:

SNA Hackathon 2019

Bize verilen eğitim seti (Şubat ve Mart ayının 2 haftası) 2 parçaya bölündü.
Model son N güne ait verilerle eğitildi. Yukarıda açıklanan toplamalar, test de dahil olmak üzere tüm veriler temel alınarak oluşturulmuştur. Aynı zamanda, hedef değişkenin çeşitli kodlamalarını oluşturmanın mümkün olduğu veriler ortaya çıktı. En basit yaklaşım, halihazırda yeni özellikler oluşturan kodu yeniden kullanmak ve onu eğitilmeyeceği verilerle beslemek ve = 1'i hedeflemektir.

Böylece benzer özelliklere sahip olduk:

  • userId, sahipId grubundaki bir gönderiyi kaç kez gördü;
  • userID'nin, sahip kimliği grubundaki gönderiyi kaç kez beğendiği;
  • UserId'in, OwnerId'den beğendiği gönderilerin yüzdesi.

Yani ortaya çıktı hedef kodlama anlamına gelir Kategorik özelliklerin çeşitli kombinasyonları için veri kümesinin bir kısmında. Prensip olarak catboost aynı zamanda hedef kodlama da oluşturur ve bu açıdan bakıldığında hiçbir faydası yoktur ancak örneğin bu gruptaki gönderileri beğenen benzersiz kullanıcıların sayısını saymak mümkün hale geldi. Aynı zamanda asıl hedefe ulaşıldı - veri kümem birkaç kez küçültüldü ve özellikler oluşturmaya devam etmek mümkün oldu.

Catboost kodlamayı yalnızca beğenilen tepkiye göre oluşturabilirken, geri bildirimin başka tepkileri de vardır: yeniden paylaşıldı, beğenilmedi, beğenilmedi, tıklandı, yok sayıldı, kodlamalar manuel olarak yapılabilir. Veri setini şişirmemek için her türlü toplamayı yeniden hesapladım ve önemi düşük olan özellikleri ortadan kaldırdım.

O zaman büyük bir farkla birinci sıradaydım. Kafa karıştırıcı olan tek şey, görüntü yerleştirmelerin neredeyse hiç büyüme göstermemesiydi. Her şeyi catboost'a verme fikri geldi. Kmeans görüntülerini kümeliyoruz ve yeni bir kategorik özellik olan imageCat'i elde ediyoruz.

KMeans'tan elde edilen kümelerin manuel olarak filtrelenmesi ve birleştirilmesi sonrasında bazı sınıflar aşağıda verilmiştir.

SNA Hackathon 2019

imageCat'e dayanarak şunları oluşturuyoruz:

  • Yeni kategorik özellikler:
    • UserId tarafından en sık hangi imageCat'in görüntülendiği;
    • Hangi imageCat'in en sık sahip kimliğini gösterdiği;
    • userId tarafından en çok hangi imageCat beğenildi;
  • Çeşitli sayaçlar:
    • imageCat'in userId'e kaç benzersiz baktığı;
    • Yukarıda açıklandığı gibi yaklaşık 15 benzer özellik artı hedef kodlama.

metinler

Resim yarışmasının sonuçları bana uygun oldu ve metinler üzerinde şansımı denemeye karar verdim. Daha önce metinlerle pek çalışmadım ve aptalca bir şekilde günü tf-idf ve svd ile öldürdüm. Daha sonra tam olarak ihtiyacım olanı yapan doc2vec ile temel çizgiyi gördüm. Doc2vec parametrelerini biraz ayarladıktan sonra metin yerleştirmeleri elde ettim.

Daha sonra görsel yerleştirmelerini metin yerleştirmeleriyle değiştirdiğim görsellerin kodunu yeniden kullandım. Sonuç olarak metin yarışmasında 2. oldum.

İşbirliği sistemi

Henüz sopayla "dürtmediğim" bir yarışma kaldı ve liderlik tablosundaki AUC'ye bakılırsa, bu özel yarışmanın sonuçlarının çevrimdışı aşamada en büyük etkiye sahip olması gerekirdi.
Kaynak verilerdeki tüm özellikleri aldım, kategorik olanları seçtim ve görsellere dayalı özellikler dışında görsellerle aynı toplamları hesapladım. Bunu catboost'a koymak beni 2. sıraya getirdi.

Catboost optimizasyonunun ilk adımları

Bir birincilik ve iki ikincilik beni memnun etti ama özel bir şey yapmadığıma dair bir anlayış vardı, bu da pozisyon kaybı bekleyebileceğim anlamına geliyordu.

Yarışmanın görevi kullanıcı içindeki gönderileri sıralamaktır ve tüm bu süre boyunca sınıflandırma problemini çözüyordum, yani yanlış ölçümü optimize ediyordum.

Basit bir örnek vereceğim:

Kullanıcı kimliği Nesne Kimliği tahmin Zemin gerçeği
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 1
1 14 0.5 0
2 15 0.4 0
2 16 0.3 1

Küçük bir yeniden düzenleme yapalım

Kullanıcı kimliği Nesne Kimliği tahmin Zemin gerçeği
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 0
2 16 0.5 1
2 15 0.4 0
1 14 0.3 1

Aşağıdaki sonuçları alıyoruz:

model AUC Kullanıcı1 AUC Kullanıcı2 AUC ortalama AUC
opsiyon 1 0,8 1,0 0,0 0,5
opsiyon 2 0,7 0,75 1,0 0,875

Gördüğünüz gibi, genel AUC metriğinin iyileştirilmesi, bir kullanıcı içindeki ortalama AUC metriğinin iyileştirilmesi anlamına gelmez.

destek Sıralama metriklerinin nasıl optimize edileceğini bilir kutudan. Sıralama metrikleri hakkında okudum, başarı Öyküleri catboost kullanırken YetiRankPairwise'ı gece boyunca antrenman yapacak şekilde ayarlayın. Sonuç etkileyici değildi. Yetersiz eğitim aldığıma karar vererek hata fonksiyonunu QueryRMSE olarak değiştirdim; catboost belgelerine bakılırsa bu daha hızlı yakınsıyor. Sonunda, sınıflandırma antrenmanındakiyle aynı sonuçları aldım, ancak bu iki modelin toplulukları iyi bir artış sağladı ve bu da beni her üç yarışmada da birinciliğe getirdi.

“İşbirlikçi Sistemler” yarışmasının çevrimiçi aşamasının kapanmasına 5 dakika kala Sergey Shalnov beni ikinci sıraya taşıdı. Daha sonraki yolu birlikte yürüdük.

Çevrimdışı aşamaya hazırlanıyor

RTX 2080 TI ekran kartıyla çevrimiçi aşamada zafer garantilendik, ancak 300 rublelik ana ödül ve büyük olasılıkla son birincilik bile bizi bu 000 hafta boyunca çalışmaya zorladı.

Anlaşıldığı üzere Sergey aynı zamanda catboost'u da kullandı. Fikir ve özellik alışverişinde bulunduk ve şunu öğrendim: Anna Veronica Dorogush'un raporu birçok sorumun ve hatta o zamana kadar henüz sahip olmadığım soruların yanıtlarını içeriyordu.

Raporu görüntülemek beni tüm parametreleri varsayılan değere döndürmemiz gerektiği ve ayarları çok dikkatli bir şekilde ve yalnızca bir dizi özelliği düzelttikten sonra yapmamız gerektiği fikrine götürdü. Şimdi bir eğitim yaklaşık 15 saat sürdü, ancak bir model sıralamayla birlikte elde edilenden daha iyi bir hız elde etmeyi başardı.

Özellik oluşturma

İşbirliğine Dayalı Sistemler yarışmasında çok sayıda özellik model için önemli olarak değerlendiriliyor. Örneğin, denetim ağırlıkları_spark_svd - En önemli işarettir ancak ne anlama geldiğine dair bilgi yoktur. Önemli özelliklere dayalı olarak çeşitli kümeleri saymanın faydalı olacağını düşündüm. Örneğin, kullanıcıya, gruba ve nesneye göre ortalama denetim ağırlıkları_spark_svd. Aynı şey, üzerinde eğitim yapılmayan ve hedef = 1, yani ortalama veriler kullanılarak da hesaplanabilir. denetim ağırlıkları_spark_svd kullanıcı tarafından beğendiği nesnelere göre. Ayrıca önemli işaretler denetim ağırlıkları_spark_svd, birkaç tane vardı. Bunlardan bazıları:

  • denetim ağırlıklarıCtrGender
  • denetim ağırlıklarıCtrHigh
  • userOwnerCounterCreateLikes

Örneğin, ortalama denetim ağırlıklarıCtrGender userID'ye göre, tıpkı ortalama değer gibi önemli bir özellik olduğu ortaya çıktı userOwnerCounterCreateLikes kullanıcı kimliği + sahip kimliğine göre. Bu zaten size alanların anlamını anlamanız gerektiğini düşündürmelidir.

Ayrıca önemli özellikler şunlardı: denetim ağırlıklarıBeğeni Sayısı и denetim ağırlıklarıGösteri Sayısı. Birbirine bölünerek daha da önemli bir özellik ortaya çıktı.

Veri sızıntıları

Rekabet ve üretim modelleme çok farklı görevlerdir. Verileri hazırlarken tüm detayları dikkate almak ve testte hedef değişkenle ilgili bazı önemsiz bilgileri aktarmamak çok zordur. Bir üretim çözümü oluşturuyorsak modeli eğitirken veri sızıntılarından kaçınmaya çalışacağız. Ancak rekabeti kazanmak istiyorsak veri sızıntıları en iyi özelliklerdir.

Verileri inceledikten sonra, bunu objectId değerlerine göre görebilirsiniz. denetim ağırlıklarıBeğeni Sayısı и denetim ağırlıklarıGösteri Sayısı Bu, bu özelliklerin maksimum değerlerinin oranının, dönüşüm sonrası görüntüleme anındaki orandan çok daha iyi yansıtacağı anlamına gelir.

Bulduğumuz ilk sızıntı AuditweightsLikesCountMax/auditweightsShowsCountMax.
Peki ya verilere daha yakından bakarsak? Gösteri tarihine göre sıralayalım ve şunu elde edelim:

Nesne Kimliği Kullanıcı kimliği denetim ağırlıklarıGösteri Sayısı denetim ağırlıklarıBeğeni Sayısı hedef (beğenildi)
1 1 12 3 muhtemelen değil
1 2 15 3 belki evet
1 3 16 4

Böyle ilk örneği bulduğumda şaşırdım ve tahminimin gerçekleşmediği ortaya çıktı. Ancak nesne içindeki bu özelliklerin maksimum değerlerinin artış sağladığı gerçeğini göz önünde bulundurarak tembel değildik ve bulmaya karar verdik. denetim ağırlıklarıShowsCountSonraki и denetim ağırlıklarıBeğeni SayısıSonrakiyani bir sonraki andaki değerler. Özellik ekleyerek
(auditweightsShowsCountSonraki-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountNext) hızlı bir şekilde keskin bir sıçrama yaptık.
Aşağıdaki değerler bulunarak benzer sızıntılar kullanılabilir. userOwnerCounterCreateLikes userId+ownerId içinde ve örneğin, denetim ağırlıklarıCtrGender objectId+userGender içinde. Sızıntıların olduğu 6 benzer alan bulduk ve onlardan mümkün olduğunca fazla bilgi çıkardık.

O zamana kadar, işbirliğine dayalı özelliklerden mümkün olduğunca fazla bilgi elde etmiştik ancak görsel ve metin yarışmalarına geri dönmedik. Kontrol etmek için harika bir fikrim vardı: doğrudan görsellere veya metinlere dayalı özellikler ilgili yarışmalarda ne kadar kazandırıyor?

Resim ve metin yarışmalarında herhangi bir sızıntı olmadı ancak o zamana kadar varsayılan catboost parametrelerini geri döndürdüm, kodu temizledim ve birkaç özellik ekledim. Toplam şuydu:

karar Puan
Resimlerle maksimum 0.6411
Maksimum resim yok 0.6297
İkincilik sonucu 0.6295

karar Puan
Metinlerle maksimum 0.666
Metinler olmadan maksimum 0.660
İkincilik sonucu 0.656

karar Puan
İşbirliğinde maksimum 0.745
İkincilik sonucu 0.723

Metinlerden ve resimlerden çok fazla şey çıkaramayacağımız açıkça ortaya çıktı ve en ilginç birkaç fikri denedikten sonra onlarla çalışmayı bıraktık.

İşbirliğine dayalı sistemlerde ileri nesil özelliklerde artış olmadı ve sıralamaya başladık. Çevrimiçi aşamada, sınıflandırma ve sıralama topluluğu bana küçük bir artış sağladı, çünkü sınıflandırma konusunda yeterince eğitim almadığım ortaya çıktı. YetiRanlPairwise da dahil olmak üzere hata fonksiyonlarının hiçbiri LogLoss'un elde ettiği sonuca yakın bir sonuç üretmedi (0,745'e karşı 0,725). Başlatılamayan QueryCrossEntropy için hâlâ umut vardı.

Çevrimdışı aşama

Çevrimdışı aşamada veri yapısı aynı kaldı ancak küçük değişiklikler oldu:

  • userId, objectId,ownerId tanımlayıcıları yeniden rastgele hale getirildi;
  • birkaç işaret kaldırıldı ve birçoğu yeniden adlandırıldı;
  • veriler yaklaşık 1,5 kat arttı.

Listelenen zorluklara ek olarak büyük bir artı daha vardı: Ekibe RTX 2080TI içeren büyük bir sunucu tahsis edildi. Uzun zamandır htop'tan keyif alıyorum.
SNA Hackathon 2019

Tek bir fikir vardı; zaten var olanı yeniden üretmek. Sunucudaki ortamı ayarlamak için birkaç saat harcadıktan sonra yavaş yavaş sonuçların tekrarlanabilir olduğunu doğrulamaya başladık. Karşılaştığımız temel sorun veri hacminin artmasıdır. Yükü biraz azaltmaya ve catboost parametresini ctr_complexity=1 olarak ayarlamaya karar verdik. Bu, hızı biraz düşürüyor ama modelim çalışmaya başladı, sonuç iyiydi - 0,733. Sergey benden farklı olarak verileri 2 parçaya ayırmadı ve tüm veriler üzerinde eğitim aldı, ancak bu çevrimiçi aşamada en iyi sonuçları vermesine rağmen çevrimdışı aşamada birçok zorluk yaşandı. Eğer ürettiğimiz tüm özellikleri alıp catboost'a sokmaya çalışsaydık, çevrimiçi aşamada hiçbir şey işe yaramazdı. Sergey, örneğin float64 türlerini float32'ye dönüştürmek gibi tür optimizasyonu yaptı. Bu yazıda, Pandalarda bellek optimizasyonu hakkında bilgi bulabilirsiniz. Sonuç olarak Sergey, tüm verileri kullanarak CPU üzerinde eğitim aldı ve yaklaşık 0,735 puan aldı.

Bu sonuçlar kazanmamız için yeterliydi ancak gerçek hızımızı sakladık ve diğer takımların da aynı şeyi yapmadığından emin olamadık.

Sonuna kadar savaşın

Catboost ayarı

Çözümümüz tamamen yeniden üretildi, metin verilerinin ve görüntülerin özelliklerini ekledik, böylece geriye kalan tek şey catboost parametrelerini ayarlamaktı. Sergey az sayıda yinelemeyle CPU üzerinde eğitim aldı ve ben de ctr_complexity=1 olanında eğitim aldım. Geriye bir gün kalmıştı ve eğer sadece tekrarlar eklerseniz ya da ctr_complexity'yi artırırsanız, o zaman sabaha doğru daha da iyi bir hız elde edebilir ve bütün gün yürüyebilirsiniz.

Çevrimdışı aşamada, sitedeki en iyi çözümün seçilmesiyle hızlar kolayca gizlenebilir. Başvurular kapanmadan önceki son dakikalarda skor tablosunda köklü değişiklikler bekledik ve durmamaya karar verdik.

Anna'nın videosundan modelin kalitesini artırmak için aşağıdaki parametreleri seçmenin en iyisi olduğunu öğrendim:

  • öğrenme oranı — Varsayılan değer, veri kümesinin boyutuna göre hesaplanır. Learning_rate'in arttırılması yineleme sayısının arttırılmasını gerektirir.
  • l2_leaf_reg — Düzenleme katsayısı, varsayılan değer 3, tercihen 2 ila 30 arasında seçim yapın. Değerin azaltılması aşırı uyumun artmasına neden olur.
  • bagging_temperature - örnekteki nesnelerin ağırlıklarına rastgelelik ekler. Ağırlıkların üstel bir dağılımdan alındığı varsayılan değer 1'dir. Değerin azaltılması aşırı uyumun artmasına neden olur.
  • rastgele_güç — Belirli bir yinelemedeki bölme seçimini etkiler. Random_strength ne kadar yüksek olursa, düşük öneme sahip bir bölmenin seçilme şansı da o kadar yüksek olur. Sonraki her yinelemede rastgelelik azalır. Değerin azaltılması aşırı uyumun artmasına neden olur.

Diğer parametrelerin nihai sonuç üzerinde çok daha küçük bir etkisi var, bu yüzden onları seçmeye çalışmadım. GPU veri kümemde ctr_complexity=1 ile yapılan eğitimin bir yinelemesi 20 dakika sürdü ve azaltılmış veri kümesinde seçilen parametreler, tam veri kümesindeki en uygun parametrelerden biraz farklıydı. Sonunda, verilerin %30'u üzerinde yaklaşık 10 yineleme yaptım ve ardından tüm veriler üzerinde yaklaşık 10 yineleme daha yaptım. Bunun gibi bir şey ortaya çıktı:

  • öğrenme oranı Varsayılana göre %40 artırdım;
  • l2_leaf_reg aynı bıraktı;
  • bagging_temperature и rastgele_güç 0,8'e düşürüldü.

Modelin varsayılan parametrelerle yeterince eğitilmediği sonucuna varabiliriz.

Skor tablosundaki sonucu gördüğümde çok şaşırdım:

model model 1 model 2 model 3 topluluk
Ayarlama olmadan 0.7403 0.7404 0.7404 0.7407
Ayarlama ile 0.7406 0.7405 0.7406 0.7408

Kendi adıma, modelin hızlı bir şekilde uygulanmasına gerek yoksa, parametre seçimini optimize edilmemiş parametreler kullanan birkaç modelden oluşan bir grupla değiştirmenin daha iyi olacağı sonucuna vardım.

Sergey, GPU'da çalıştırmak için veri kümesinin boyutunu optimize ediyordu. En basit seçenek verinin bir kısmını kesmektir ancak bu birkaç yolla yapılabilir:

  • veri seti belleğe sığmaya başlayana kadar en eski verileri (Şubat ayının başı) kademeli olarak kaldırın;
  • en düşük öneme sahip özellikleri kaldırın;
  • yalnızca bir girişi olan kullanıcı kimliklerini kaldırın;
  • yalnızca testteki kullanıcı kimliklerini bırakın.

Ve sonuçta tüm seçeneklerden bir topluluk oluşturun.

Son topluluk

Son günün akşamı geç saatlerde, 0,742 veren modellerimizin bir derlemesini hazırlamıştık. Bir gecede modelimi ctr_complexity=2 ile başlattım ve 30 dakika yerine 5 saat eğitim aldı. Sadece sabah 4'te sayıldı ve ben de genel skor tablosunda 0,7433 veren son topluluğu oluşturdum.

Sorunun çözümüne yönelik farklı yaklaşımlar nedeniyle tahminlerimiz arasında güçlü bir korelasyon yoktu, bu da toplulukta iyi bir artış sağladı. İyi bir topluluk elde etmek için ham model tahminlerini tahmin(prediction_type='RawFormulaVal') kullanmak ve Scale_pos_weight=neg_count/pos_count'u ayarlamak daha iyidir.

SNA Hackathon 2019

Web sitesinde görebilirsiniz Özel skor tablosundaki nihai sonuçlar.

Diğer çözümler

Birçok ekip öneri sistemi algoritmalarının kurallarını takip etti. Ben bu alanda uzman olmadığım için değerlendiremiyorum ama 2 ilginç çözümü hatırlıyorum.

  • Nikolay Anokhin'in çözümü. Mail.ru'nun bir çalışanı olan Nikolay, ödüllere başvurmadı, bu nedenle hedefi maksimum hıza ulaşmak değil, kolayca ölçeklenebilir bir çözüm elde etmekti.
  • Jüri Ödülü kazanan takımın kararı şuna dayanmaktadır: bu yazı facebook'tan, manuel çalışma gerektirmeden çok iyi görüntü kümelenmesine izin verdi.

Sonuç

Hafızamda en çok kalanlar:

  • Verilerde kategorik özellikler varsa ve hedef kodlamanın nasıl doğru şekilde yapılacağını biliyorsanız catboost'u denemek yine de daha iyidir.
  • Bir yarışmaya katılıyorsanız öğrenme_oranı ve yinelemeler dışındaki parametreleri seçerek zaman kaybetmemelisiniz. Daha hızlı bir çözüm, birkaç modelden oluşan bir topluluk oluşturmaktır.
  • Güçlendirmeler GPU'da öğrenilebilir. Catboost, GPU'yu çok hızlı bir şekilde öğrenebilir, ancak çok fazla bellek tüketir.
  • Fikirlerin geliştirilmesi ve test edilmesi sırasında, küçük bir rsm~=0.2 (yalnızca CPU) ve ctr_complexity=1 değerini ayarlamak daha iyidir.
  • Diğer takımlardan farklı olarak bizim modellerimizin kadrosunda büyük bir artış oldu. Sadece fikir alışverişinde bulunduk ve farklı dillerde yazdık. Verileri bölme konusunda farklı bir yaklaşımımız vardı ve sanırım her birinin kendi hataları vardı.
  • Sıralama optimizasyonunun neden sınıflandırma optimizasyonundan daha kötü performans gösterdiği açık değildir.
  • Metinlerle çalışma konusunda biraz deneyim kazandım ve öneri sistemlerinin nasıl oluşturulduğuna dair bir anlayış kazandım.

SNA Hackathon 2019

Alınan duygular, bilgiler ve ödüller için organizatörlere teşekkür ederiz.

Kaynak: habr.com

Yorum ekle