Python ile Öneri Sistemi Geliştirme: Veriden İlk Modele Kod Örnekleriyle
Beceri rehberi

Python ile Öneri Sistemi Geliştirme: Veriden İlk Modele Kod Örnekleriyle

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Bir öneri modelinin değeri, en basit rakibini aynı test verisinde geçip geçmediğiyle ölçülür. Etkileşim kaydını zamana göre bölüp popülerlik temeli, öğe tabanlı işbirlikçi filtreleme ve içerik benzerliğini Python koduyla kurmak, bu soruya dürüst bir yanıt verir.

Bir bakışta

  1. Veri rastgele değil zamana göre bölünmelidir. Rastgele bölmede model geleceği eğitimde görür ve çevrimdışı skor canlıda tekrarlanmaz.
  2. Popülerlik temeli, geçilmesi gereken ilk çizgidir. Karmaşık bir model bu temeli anlamlı biçimde geçemiyorsa verinin sinyali ya da modelin kurulumu sorgulanmalıdır.
  3. Öğe tabanlı model seyrek matrisle belleğe sığdırılır. cosine_similarity çağrısında dense_output=False, seyrek girdilerde sonucu seyrek döndürür.
  4. Ortalama recall tek başına yanıltabilir. Az etkileşimli kullanıcı grupları ve katalog kapsaması ayrıca ölçülmelidir.

Prototipin amacı: veriden ölçülmüş ilk modele

Öneri sistemi, kullanıcıya ilgisini çekebilecek ürünü, dersi ya da içeriği tahmin edip sıralayan yazılım bileşenidir. Büyük ölçekte çalışan bir öneri hattı kurulmadan önce, bir veri bilimcinin sorması gereken daha temel bir soru vardır: elimizdeki etkileşim kaydı kişiselleştirme için yeterli sinyal taşıyor mu? Bu sorunun yanıtı, kodla kurulmuş küçük bir prototip ve dürüst bir ölçümle verilir.

Prototipin akışı birbirine bağlı adımlardan oluşur: veriyi zamana göre bölmek, kıyas için popülerlik temeli kurmak, öğe tabanlı işbirlikçi filtrelemeyi seyrek matrisle uygulamak, yeni öğeler için içerik benzerliği eklemek ve her modeli aynı test verisinde recall ile karşılaştırmak. Kod parçaları pandas, SciPy ve scikit-learn ile yazılmıştır; sütun adları örnektir ve kendi verinize göre değiştirilmelidir.

Şekil 1

Her model, bir öncekini aynı test verisinde geçtiği ölçüde değerlidir

  1. Zamana göre bölmeBelirli bir tarihten öncesiyle eğit, sonrasıyla test et.
  2. Popülerlik temeliGörülmemiş en popüler öğeler: geçilmesi gereken ilk çizgi.
  3. Öğe tabanlı modelBirlikte tercih edilen öğeler arasında kosinüs benzerliği.
  4. İçerik benzerliğiEtkileşimi olmayan yeni öğeler için açıklama metni.
  5. KarşılaştırmaAynı k ile recall, kullanıcı grupları ve katalog kapsaması.
Kaynak: sayfa içeriğiMindset Institute

Veriyi hazırlamak: etkileşim tablosu ve zamana göre bölme

Başlangıç noktası her satırı bir etkileşim olan tablodur: kullanıcı, öğe, zaman ve olay türü (görüntüleme, sepete ekleme, satın alma). Aynı kullanıcı aynı öğeyle defalarca etkileşmişse ilk modelde bunları tekilleştirmek işi sadeleştirir.

import pandas as pd olaylar = pd.read_csv('olaylar.csv', parse_dates=['zaman']) olaylar = olaylar.drop_duplicates(['kullanici', 'oge']) train = olaylar[olaylar['zaman'] < kesim] test = olaylar[olaylar['zaman'] >= kesim]

Buradaki kesim, test dönemi olarak ayrılan son haftanın ya da son ayın başlangıç tarihidir. Veriyi rastgele değil zamana göre bölmek kritik önemdedir: rastgele bölmede model, gelecekte olacak etkileşimleri eğitimde görür ve skor olduğundan yüksek çıkar. Test dönemine yalnız eğitim döneminde de görünen kullanıcıları almak, işbirlikçi modelin değerlendirilebilmesi için gerekir; yeni kullanıcılar ayrıca ölçülür.

Şekil 2

Rastgele bölme modele geleceği gösterir

Rastgele bölme
Zamana göre bölme
Kullanıcının sonraki tercihi eğitime karışır
Kesim tarihinden öncesiyle eğitilir, sonrasıyla test edilir
Çevrimdışı skor olduğundan yüksek çıkar
Skor gerçek kullanımı taklit eder
Kaynak: sayfa içeriğiMindset Institute

Kıyas noktası: popülerlik temeli

Her öneri modeli önce en basit rakibini geçmek zorundadır. En çok etkileşim alan öğeleri, kullanıcının daha önce görmediklerinden önermek şaşırtıcı derecede güçlü bir temeldir.

populer = train['oge'].value_counts().index def populer_oner(goruldu, k): return [o for o in populer if o not in goruldu][:k]

Bu fonksiyon kullanıcının daha önce gördüğü öğeleri listeden çıkarır ve kalan en popüler öğeleri döndürür. Geliştirdiğiniz her model bu temelle aynı test verisinde karşılaştırılmalıdır. Karmaşık bir modelin popülerlik temelini anlamlı biçimde geçemediği durumlar sanıldığından sıktır; bu sonuç, verinin kişiselleştirme için yeterli sinyal taşımadığını ya da modelin yanlış kurulduğunu gösterir.

Öğe tabanlı işbirlikçi filtreleme: seyrek matris ve kosinüs benzerliği

Öğe tabanlı yaklaşımda iki öğe, aynı kullanıcılar tarafından birlikte tercih edildikçe birbirine benzer sayılır. Kullanıcı ve öğe kimlikleri sayısal indekslere çevrilir, etkileşimler seyrek bir matrise yerleştirilir ve öğe sütunları arasındaki kosinüs benzerliği hesaplanır.

import numpy as np from scipy.sparse import csr_matrix from sklearn.metrics.pairwise import cosine_similarity k_kat = train['kullanici'].astype('category') o_kat = train['oge'].astype('category') matris = csr_matrix((np.ones(len(train)), (k_kat.cat.codes, o_kat.cat.codes))) benzerlik = cosine_similarity(matris.T, dense_output=False) def oner(u, k): skor = (matris[u] @ benzerlik).toarray().ravel() skor[matris[u].indices] = -np.inf return np.argsort(-skor)[:k]

cosine_similarity, Y verilmediğinde X'in satırlarını kendi aralarında karşılaştırır; matrisin devriği verildiği için satırlar öğelerdir. dense_output=False, iki girdi de seyrek olduğunda sonucu seyrek matris olarak döndürür ve bellek tüketimini düşürür. oner fonksiyonu kullanıcının etkileşim satırını benzerlik matrisiyle çarpar, gördüğü öğeleri eksi sonsuzla eler ve en yüksek skorlu öğelerin indekslerini döndürür; indeksleri ürün kimliğine geri çevirmek için o_kat.cat.categories kullanılır.

Yeni öğeler için içerik benzerliği eklemek

İşbirlikçi model, hiç etkileşim almamış yeni bir öğeyi öneremez. Yeni yayımlanan bir ders ya da kataloğa yeni giren bir ürün için öğenin açıklama metninden içerik benzerliği hesaplanabilir:

from sklearn.feature_extraction.text import TfidfVectorizer vektorler = TfidfVectorizer().fit_transform(katalog['aciklama']) icerik_benzerlik = cosine_similarity(vektorler, dense_output=False)

Burada katalog her satırı bir öğe olan tablodur. Pratikte iki skor birleştirilir: etkileşimi yeterli olan öğelerde işbirlikçi skor ağır basar, yeni öğelerde içerik skoru devreye girer. Ağırlığı sezgiyle değil, aynı zamana göre bölünmüş test verisinde farklı değerleri deneyerek seçin. İçerik benzerliği tek başına kullanıcıyı hep benzer öğeler arasında tutar; bu yüzden çeşitlilik ayrıca izlenmelidir.

Çevrimdışı değerlendirme: recall ile karşılaştırma

Her kullanıcı için modelin önerdiği ilk k öğeden kaçının test döneminde gerçekten etkileşim aldığı ölçülür:

def recall_at_k(oneriler, gercek, k): isabet = len(set(oneriler[:k]) & set(gercek)) return isabet / min(k, len(gercek))

Bu değer tüm test kullanıcıları üzerinde ortalanır ve popülerlik temeli, işbirlikçi model ve birleşik model için aynı k ile ayrı ayrı hesaplanır. Yalnız ortalamaya bakmayın: kullanıcıları etkileşim sayısına göre gruplayıp ayrı ölçmek, modelin az verili kullanıcılarda temelden kötü olduğunu ortaya çıkarabilir. Önerilen öğelerin katalogun ne kadarını kapsadığı da hesaplanmalıdır; yalnız popüler öğeleri öneren bir model yüksek recall ile düşük kapsama gösterebilir.

Sonuçları her model için aynı tabloda raporlayın: ortalama recall, az ve çok etkileşimli kullanıcı gruplarındaki recall ve katalog kapsaması yan yana durduğunda, birleşik modelin hangi kullanıcılar için gerçekten fark yarattığı açıkça görülür. Bu tablo, prototipin bir sonraki aşamaya taşınmaya değip değmediği kararının dayanağıdır.

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Tavsiye Sistemleri (Recommendation Engines) programı, öneri modelini kendi verisiyle kurmak ve ölçmek isteyen veri bilimciler ve analistler için doğrudan karşılıktır: işbirlikçi ve içerik tabanlı yöntemleri, hibrit yapıları ve değerlendirmeyi uygulamalı olarak işler. Prototipten sonraki aşama olan derin öğrenmeli modeller, sıralama katmanı ve üretim altyapısı da aynı programda ele alınır.

İlgili Mindset programı

Tavsiye Sistemleri (Recommendation Engines)

Sık sorulanlar

Sık sorulan sorular

Öneri sistemi geliştirmek için hangi Python kütüphaneleri yeterlidir?

İlk prototip için pandas, NumPy, SciPy ve scikit-learn yeterlidir: pandas veriyi hazırlar, SciPy seyrek matrisi tutar, scikit-learn kosinüs benzerliği ve metin vektörleştirmeyi sağlar. Matris çarpanlarına ayırma ya da derin öğrenme tabanlı modellere geçildiğinde bu işe özel kütüphaneler ve derin öğrenme çerçeveleri devreye girer.

Öğe tabanlı mı, kullanıcı tabanlı işbirlikçi filtreleme mi seçmeliyim?

Öğe sayısı kullanıcı sayısından azsa ve öğeler zamanla az değişiyorsa öğe tabanlı yaklaşım genellikle daha kararlıdır: öğe benzerlikleri seyrek yeniden hesaplanabilir ve öneri açıklaması kolaydır, örneğin bu dersi izleyenler şunu da izledi. Kullanıcı tabanlı yaklaşımda benzerlik her yeni etkileşimle değişir. Seçimi her iki modeli aynı test verisinde ölçerek yapın.

Recall at k nasıl hesaplanır ve neden kullanılır?

Bir kullanıcıya önerilen ilk k öğeden test döneminde gerçekten etkileşim alanların sayısı, kullanıcının test dönemindeki etkileşim sayısına bölünür; bölen k'dan büyükse k alınır. Sonuç tüm kullanıcılarda ortalanır. Öneri listesi sınırlı uzunlukta gösterildiği için doğruluk yerine listenin üst kısmındaki isabeti ölçmek daha anlamlıdır.

Popülerlik temelini daha zorlu bir rakip haline nasıl getiririm?

Tüm zamanların popülerliği yerine yalnız eğitim döneminin son haftalarındaki etkileşimleri sayın; ilginin hızlı değiştiği kataloglarda yakın dönem popülerliği daha zorlu bir rakip olabilir. Kullanıcının en çok etkileştiği kategorideki popüler öğeleri önermek de basit bir kişiselleştirme katmanı ekler. Temel ne kadar güçlüyse, modelinizin onu geçmesi o kadar anlamlı bir kanıttır; zayıf bir temeli geçmek modelin iyi olduğunu göstermez.

Benzerlik matrisi belleğe sığmazsa ne yapılır?

Önce dense_output=False ile seyrek sonuç alın. Bu yetmezse her öğe için yalnız en benzer komşuları saklayın ve gerisini atın; öneri kalitesi genellikle az etkilenir. Katalog çok büyükse benzerliği vektör gömmeleri ve yaklaşık en yakın komşu araması ile hesaplamak gerekir; bu noktada prototipten üretim mimarisine geçmiş olursunuz.

Python ile Öneri Sistemi Nasıl Geliştirilir?