Özel Python ile sıfırdan bir öneri motoru oluşturun (kodla)

Yazar: Pulkit Sharma

Çeviri: Shen Libin

Düzeltme: Fu Yushuai

Bu makale hakkında 10300 kelime, 10 dakika okumanız tavsiye edilir.

Bu makale, çeşitli öneri motoru algoritmalarını ve bunları Python kullanarak oluşturmak için temel çerçeveyi tanıtır.

Giriş

Günümüz toplumunda herkes çeşitli seçeneklerle karşı karşıyadır. Örneğin, amaçsızca okuyacak bir kitap arıyorsam, nasıl arayacağıma dair birçok olasılık var. Sonuç olarak, değerli kitaplar bulma umuduyla internette gezinmek ve çeşitli web sitelerinde arama yapmakla çok zaman kaybedebilirim. Şu anda başkalarının önerilerini arayabilirim.

Daha önce okuduğum kitaplardan yola çıkarak bana yeni kitaplar önerebilecek bir web sitesi veya mobil uygulama varsa kesinlikle bana çok yardımcı olacaktır. Şu anda şu keyifli deneyimi yaşayacağım: Web sitesine giriş yaptığımda, web sitesinde arama yaparak vakit kaybetmeden ilgi alanıma uygun 10 kitap görebiliyorum.

Bu, öneri motorlarının yaptığı şeydir ve güçleri artık çoğu şirket tarafından kullanılmaktadır. Amazon'dan Netflix'e, Google'dan Google Reading'e, öneri motorları makine öğrenimi teknolojisinin en kapsamlı uygulamalarından biridir.

Bu makalede, çeşitli öneri motoru algoritmalarını ve bunları Python kullanarak oluşturmak için temel çerçeveyi tanıtacağım. Ayrıca bu algoritmaların çalışmasının arkasındaki matematiksel ilkeleri tartışacağız ve son olarak kendi öneri motorumuzu oluşturmak için matris çarpanlara ayırma tekniklerini kullanacağız.

içindekiler

1 Öneri motoru nedir?

2 Öneri motoru nasıl çalışır?

2.1 Veri toplama

2.2 Veri depolama

2.3 Veri filtreleme

2.31 Verileri içeriğe göre filtreleme

2.32 İşbirlikçi filtreleme

3 MovieLens veri kümesine dayalı Python örnek öğrenimi

40'dan işbirliğine dayalı bir filtreleme modeli oluşturun

5 Basit ve popüler bir işbirliğine dayalı filtreleme modeli oluşturmak için Turicreate'i kullanın

6 Matris Ayrıştırmaya Giriş

7 Bir öneri motoru oluşturmak için matris ayrıştırmayı kullanın

8 Öneri Motorunun Değerlendirme Dizini

8.1 Geri çağırma oranı

8.2 Doğruluk

8.3 Ortalama Kare Hatası (RMSE)

8.4 MRR (Ortalama Karşılıklı Sıra)

8.5 MAP k'de (k K kesimde Ortalama Ortalama Hassasiyet)

8.6 NDCG (Normalleştirilmiş İndirimli Kümülatif Kazanç)

9 Başka ne deneyebilirsin?

Son not

1 Öneri motoru nedir?

Şimdiye kadar insanlar, arkadaşları veya güvendikleri kişiler tarafından önerilen ürünleri satın alma eğilimindedir. Bir ürünle ilgili herhangi bir soru olduğunda, insanlar genellikle bu yaklaşımı kullanır. Ancak dijital çağın gelişiyle birlikte bu çember, bir tür öneri motoru kullanan çevrimiçi web sitelerini kapsayacak şekilde genişledi.

Bir öneri motoru, verileri filtrelemek ve kullanıcılara en alakalı öğeleri önermek için farklı algoritmalar kullanır. Önce müşterilerin geçmiş davranış verilerini depolar ve daha sonra bu verilere dayanarak müşterilere satın alabilecekleri ürünleri önerir.

Yepyeni bir kullanıcı bir e-ticaret sitesini ziyaret ederse, web sitesinde o kullanıcıya ait herhangi bir geçmiş verisi bulunmaz. Peki böyle bir senaryoda, web sitesi ürünleri kullanıcılara nasıl tavsiye ediyor? Olası bir yöntem, müşterilere en çok satan ürünü önermektir, yani ürün yüksek talep görmektedir. Bir başka olası yöntem de kullanıcılara web sitesine en fazla kar getirebilecek ürünleri önermektir.

Kullanıcılara bazı ürünleri ihtiyaçlarına ve ilgi alanlarına göre önerebilirsek, bu, kullanıcı deneyimini olumlu yönde etkileyebilir ve sonunda birden fazla ziyaretin etkisini sağlayabilir. Bu nedenle, günümüz işletmeleri, kullanıcıların geçmiş davranış verilerini inceleyerek akıllı ve akıllı öneri motorları oluşturur.

Artık öneri motorları hakkında sezgisel bir anlayışa sahip olduğumuza göre, nasıl çalıştıklarına bir göz atalım.

2 Öneri motoru nasıl çalışır?

Bu konuyu derinlemesine incelemeden önce, önce kullanıcılara nasıl ürün önereceğimizi düşünelim:

  • Bir kullanıcıya en popüler ürünleri önerebiliriz
  • Kullanıcılar, kullanıcı tercihlerine (kullanıcı özellikleri) ve ardından ait oldukları kategoriye göre önerilen ürünler temelinde birden çok alt kategoriye ayrılabilir.

Yukarıdaki yöntemlerin her ikisinin de dezavantajları vardır. İlk yöntemde, en popüler ürünler her kullanıcı için aynıdır, bu nedenle kullanıcıların gördüğü öneriler aynıdır. İkinci yöntemde kullanıcı sayısı arttıkça kullanıcı özellikleri de artmaktadır. Bu nedenle, kullanıcıları birden fazla kategoriye ayırmak çok zor bir iş olacaktır.

Buradaki temel sorun, önerileri kullanıcıların belirli ilgi alanlarına göre uyarlayamamaktır. Amazon'un, çoğu alışveriş yapan kişi tarafından satın alındığı için bir dizüstü bilgisayar satın almanızı önerdiği gibi. Neyse ki Amazon (veya diğer büyük şirketler) ürünleri önermek için yukarıdaki yöntemleri kullanmadı. Ürünleri daha doğru bir şekilde önermelerine yardımcı olmak için bazı kişiselleştirilmiş yöntemler kullanırlar.

Şimdi, öneri motorunun aşağıdaki adımlarla nasıl çalıştığına bakalım.

2.1 Veri toplama

Veri toplamak, bir öneri motoru oluşturmanın ilk ve en kritik adımıdır. Veri toplamanın iki yolu vardır: açık ve örtük. Görüntüleme verileri, kullanıcılar tarafından kasıtlı olarak sağlanan, film sıralaması gibi bilgilerdir.Aksine, Yinshi verileri kullanıcılar tarafından aktif olarak sağlanmamaktadır, ancak arama geçmişi, tıklama oranı, geçmiş siparişler vb. Gibi veri akışlarından toplanan bilgiler.

Yukarıdaki resimde, Netflix, farklı filmlerin kullanıcı derecelendirmeleri şeklinde açıkça veri topluyor.

Yukarıdaki şekilde Amazon tarafından kaydedilen geçmiş kullanıcı siparişlerini görebilirsiniz Bu örtük veri toplama modeline bir örnektir.

2.2 Veri depolama

Veri miktarı, modelin önerilerinin ne kadar iyi olduğunu belirler. Örneğin, bir film öneri sisteminde, bir filmi ne kadar çok kullanıcı değerlendirirse, diğer kullanıcılara o kadar iyi tavsiye edilir. Veri türü, kullanılan depolama türü üzerinde çok önemli bir etkiye sahiptir.Bu tür depolama, standart bir SQL veritabanı, NoSQL veritabanı veya bir tür nesne depolama içerebilir.

2.3 Veri filtreleme

Verileri topladıktan ve sakladıktan sonra, son tavsiye için gerekli olan ilgili bilgileri çıkarmak için verileri filtrelemeliyiz.

Filtreleme sürecini basitleştirmemize yardımcı olabilecek çeşitli algoritmalar vardır. Bir sonraki bölümde, her bir algoritmayı ayrıntılı olarak tanıtacağız.

2.3.1 İçerik tabanlı filtreleme

Bu algoritma tarafından önerilen ürünler geçmişte beğenilen kullanıcılara benzer.

Resim kaynağı: Orta

Örneğin, bir kullanıcı "Başlangıç" filmini beğenirse, algoritma aynı türden filmleri önerecektir. Ancak algoritma, seçilen ve önerilen film türlerini nasıl anlıyor?

Netflix'i örnek olarak alın: her bir kullanıcıyla ilgili tüm bilgileri vektör biçiminde saklarlar. Bu vektör, kullanıcının geçmiş davranışını yani kullanıcının beğendiği / beğenmediği filmleri ve verdikleri derecelendirmeleri içerir.Bu vektöre ayrıca profil vektörü de denir. Filmle ilgili tüm bilgiler, öğe vektörü adı verilen başka bir öğede saklanır. Öğe vektörü, tür, aktörler, yönetmen vb. Gibi her filmin ayrıntılarını içerir.

İçerik tabanlı filtreleme algoritması, kontur vektörü ile kosinüs benzerliği olan öğe vektörü arasındaki açının kosinüsünü bulur. A'nın kontur vektörü ve B'nin madde vektörü olduğunu varsayarsak, aralarındaki benzerlik şu şekilde hesaplanabilir:

-1 ile 1 arasındaki kosinüs değerine göre filmler azalan düzende sıralanabilir ve aşağıdaki iki yöntemden biri öneri için kullanılabilir:

  • En iyi N filmi seçin: En alakalı N filmi önerin (burada N, şirket tarafından belirlenebilir).
  • Derecelendirme ölçeği yöntemi: Bir eşik belirleyin ve eşiği aşan tüm filmleri önerin.

Benzerliği hesaplamak için kullanılabilecek diğer yöntemler şunlardır:

  • Öklid mesafesi: N boyutlu uzayda çizilirse, benzer varlıklar birbirine yakın olacaktır. Bu nedenle, varlıklar arasındaki mesafeyi hesaplayabilir ve bu mesafeye göre kullanıcılara içerik önerebiliriz. Aşağıdaki Öklid uzaklığı formülüdür:

  • Pearson korelasyonu: Bize iki varlığın ne kadar yakından ilişkili olduğunu söyler. Korelasyon ne kadar yüksekse, o kadar benzer. Pearson korelasyonu aşağıdaki formül kullanılarak hesaplanabilir:

Bu algoritmanın büyük bir dezavantajı vardır, yani aynı türden varlıkları tavsiye etmekle sınırlıdır. Kullanıcıların geçmişte satın almadıkları veya beğenmedikleri ürünleri asla önermeyecektir. Bu nedenle, kullanıcı geçmişte yalnızca aksiyon filmlerini izlediyse veya beğendiyse, sistem yalnızca aksiyon filmlerini önerecektir. Açıktır ki, bir öneri motoru oluşturmanın bu yöntemi zayıf genelleme performansına sahiptir.

Bu tür bir öneri sistemini geliştirebilecek bir algoritma bulmamız gerekiyor, sadece içeriğe dayalı önerilerde bulunmakla kalmıyor, aynı zamanda kullanıcı davranış bilgilerini de kullanabiliyor.

2.3.2 İşbirlikçi filtreleme

Bu yöntemi bir örnekle anlayalım. A kullanıcısı "Yıldızlararası", "Başlangıç" ve "Ön Hedef" gibi 3 filmi seviyorsa ve B kullanıcısı "Başlangıç", "Hedef Öncesi" ve "Ölümcül Büyü" nü seviyorsa, o zaman Benzer hobileriniz olsun. Kesinlikle söyleyebiliriz ki A "Ölümcül Büyü" ve B "Yıldızlararası" yı sevmelidir. Ortak çalışmaya dayalı filtreleme algoritması, film önermek için "kullanıcı davranışını" kullanır. Bu, endüstride en yaygın kullanılan algoritmalardan biridir çünkü herhangi bir ek bilgiye dayanmaz. İşbirliğine dayalı filtreleme teknolojilerinin birçok farklı türü vardır ve bu sorunları aşağıda ayrıntılı olarak tartışacağız.

Kullanıcılar arasında işbirliğine dayalı filtreleme

Algoritma önce kullanıcılar arasındaki benzerlik puanını bulur.Bu benzerlik puanına göre en benzer kullanıcıları seçecek ve bu benzer kullanıcıların daha önce beğendikleri veya satın aldıkları ürünleri önerecektir.

Resim kaynağı: Orta

Önceki film örneğimizle ilgili olarak, bu algoritma her bir kullanıcı arasındaki benzerlikleri, farklı filmlerin önceki derecelendirmelerine göre bulur. U kullanıcısının bir varlığının tahmini, diğer kullanıcılar tarafından bir i varlığının kullanıcı derecelendirmelerinin ağırlıklı toplamı hesaplanarak hesaplanır. Pu, i aşağıdaki formülle hesaplanır:

Formül sembollerinin anlamları aşağıdaki gibidir:

  • Pu, ben bir varlığın tahminidir
  • Rv, ben i filmindeki v kullanıcısının derecelendirmesi
  • Su, v kullanıcılar arasındaki benzerlik puanını yapar

Şimdi, kontur vektöründe kullanıcıları puanladık ve bu vektöre dayanarak diğer kullanıcıların derecelendirmelerini tahmin etmek istiyoruz. Sonraki adımlar aşağıdaki gibidir:

  • Tahmin için, kullanıcılar u ve v arasındaki benzerliğe ihtiyacımız var. Pearson korelasyonu şu anda kullanılabilir.
  • Öncelikle kullanıcılar tarafından puanlanan ürünleri bulup, puanlara göre kullanıcılar arasındaki korelasyonu hesaplıyoruz.
  • Tahminleri hesaplamak için benzer değerler kullanılabilir. Bu algoritma önce her bir kullanıcı arasındaki benzerliği hesaplar ve ardından her benzerliğe göre tahmin edilen değeri hesaplar. Alaka düzeyi yüksek kullanıcılar genellikle benzerdir.
  • Öneriler bu tahmin edilen değerlere göre verilmiştir. Bunu bir örnekle anlayalım:

Kullanıcı filmi derecelendirme matrisi:

Bir kullanıcı-film derecelendirme matrisi görebiliriz Bu formülü daha derinlemesine anlamak için yukarıdaki tabloda kullanıcılar (A, C) ve (B, C) arasındaki benzerliği bulalım. A ve C tarafından puanlanan filmler x2 ve x4 ve B ve C tarafından puanlanan filmler x2, x4 ve x5'tir.

A ve C kullanıcıları arasındaki korelasyon, B ve C arasındaki korelasyondan daha büyüktür. Bu nedenle, A ve C kullanıcıları daha fazla benzerliğe sahiptir ve A kullanıcısının sevdiği filmler C kullanıcısına tavsiye edilir ve bunun tersi de geçerlidir.

Bu algoritma, her kullanıcının benzerliğini hesaplamayı ve ardından her benzerlik puanının tahminini hesaplamayı içerdiği için çok zaman alıcıdır. Bu sorunu çözmenin bir yolu, tüm değerleri tahmin etmek yerine yalnızca birkaç kullanıcı (komşu) seçmektir, yani, tüm benzer değerleri tahmin etmek yerine yalnızca birkaç benzer değer seçeriz:

  • Bir benzerlik eşiği seçin ve bu değerin üzerindeki tüm kullanıcıları seçin
  • Kullanıcıları rastgele seçin
  • Bitişik kullanıcıları benzerlik değerine göre azalan sırada sıralayın ve ardından ilk n kullanıcıyı seçin
  • Komşu kullanıcıları seçmek için kümeleme algoritmasını kullanın

Kullanıcı sayısı az olduğunda, bu algoritma iyi çalışabilir. Çok sayıda kullanıcı olduğunda etkili değildir, çünkü tüm kullanıcı çiftleri arasındaki benzerliği hesaplamak çok zaman alır. Bu, emtia-emtia işbirliğine dayalı filtreleme ile sonuçlanır.Bu algoritma, kullanıcı sayısı önerilen malların sayısını çok aştığında çok etkilidir.

Emtia-emtia işbirliğine dayalı filtreleme

Bu algoritmada, her bir meta çifti arasındaki benzerliği hesaplıyoruz.

Resim kaynağı: Orta

Yani bizim durumumuzda, her film çifti arasındaki benzerliği bulacağız ve bu temelde, kullanıcıların geçmişte beğendiği benzer filmleri önerebiliriz. Bu algoritmanın çalışma prensibi, "bitişik kullanıcıların" derecelendirmelerinin ağırlıklı toplamı yerine yalnızca küçük bir değişiklikle kullanıcı-kullanıcı işbirliğine dayalı filtrelemeye benzer, ancak "bitişik ürünlerin" derecelendirmelerinin ağırlıklı bir toplamıdır. ile. Tahmin formülü aşağıdaki gibidir:

Ürünler arasındaki benzerliği hesaplıyoruz:

Artık her bir film çiftinin benzerliklerine, derecelendirmelerine ve tahminlerine sahibiz ve bu tahminlere dayanarak benzer filmler önerebiliriz. Bir örnekle anlayalım:

Buradaki ortalama film derecelendirmesi, belirli bir filmin tüm derecelendirmelerinin ortalamasıdır (bunu, kullanıcı-kullanıcı filtrelemesinde gördüğümüz tabloyla karşılaştırın). Ve daha önce gördüğümüz gibi kullanıcı-kullanıcı benzerliği bulmak yerine, ürün-meta benzerliği buluyoruz.

Bunun için öncelikle bu ürünleri derecelendiren kullanıcıları bulmamız ve derecelendirmelere göre ürünler arasındaki benzerliği hesaplamamız gerekiyor. Filmler (x1, x4) ve (x1, x5) arasındaki benzerliği bulalım. Yukarıdaki tablodan da görülebileceği gibi, hem x1 hem de x4 filmlerini derecelendiren kullanıcılar A ve B'dir ve hem x1 hem de x5 filmlerini derecelendiren kullanıcılar da A ve B'dir.

X1 ve x4 filmlerinin benzerliği, x1 ve x5 filmlerinin benzerliğinden daha büyüktür. Bu benzerlik değerlerine göre, herhangi bir kullanıcı x1 filmini ararsa, onlar için film x4 önerilecektir ve bunun tersi de geçerlidir. Bu kavramları daha fazla uygulamadan önce, cevabı bilmemiz gereken bir soru var - veri setine yeni kullanıcılar veya yeni filmler eklenirse ne olacak? Buna soğuk başlangıç denir ve iki türü vardır:

  • Kullanıcı soğuk başlatma
  • Ürün soğuk çalıştırma

Bir kullanıcının soğuk başlatılması, veritabanına yeni bir kullanıcının eklenmesi anlamına gelir.Kullanıcının geçmiş kaydı olmadığı için sistem kullanıcının tercihlerini bilmediği için bu kullanıcıya ürün önermek zor olacaktır. Peki bu sorunu nasıl çözeceğiz? Temel bir yaklaşım, en popüler ürünleri tavsiye eden popülerliğe dayalı bir strateji benimsemektir. Bunlar son moda trendleri tarafından belirlenebilir.Gelecekte kullanıcının tercihlerini bildiğimizde, ürün önermek kolaylaşacaktır.

Öte yandan, ürün soğuk başlatma, yeni bir ürünün piyasaya sürülmesi veya sisteme eklenmesi anlamına gelir. Herhangi bir ürünün değerini belirlemek için kullanıcının davranışı çok önemlidir. Bir ürün ne kadar çok etkileşim kabul ederse, modelimizin ürünü doğru kullanıcılara tavsiye etmesi o kadar kolay olur. Bu sorunu çözmek için içerik tabanlı filtrelemeyi kullanabiliriz. Sistem ilk olarak yeni ürünün içeriğini tavsiye etmek için kullanır, ancak son kullanıcı ürünün etkileşimini tavsiye eder.

Şimdi bu kavramlar hakkındaki anlayışımızı güçlendirmek için Python'da bir vaka çalışması kullanalım. Bu örnek çok ilginç, bilgisayarınızı açın ve başlayın.

3 MovieLens veri kümesine dayalı Python örnek öğrenimi

Bu MovieLens veri kümesini bir model oluşturmak ve son kullanıcılara film önermek için kullanacağız. Minnesota Üniversitesi'ndeki GroupLens araştırma projesi bu verileri topladı. Veri seti buradan indirilebilir:

https://grouplens.org/datasets/movielens/100k/

Bu veri seti şunları içerir:

  • 1682 filmden 943 izleyici 100.000 kez izledi (1-5 kez)
  • Kullanıcı demografik bilgileri (yaş, cinsiyet, meslek vb.)

İlk olarak, standart kitaplığı içe aktaracağız ve verileri python'a okuyacağız:

pandaları pd olarak içe aktar% matplotlib inlineimport matplotlibimport matplotlib.pyplot olarak pltimport numpy np olarak # sütun adı dosyada verilmediği için her bir CSV için sütun adlarını geçirin ve pandaları kullanarak okuyun. # Benioku dosyasından sütun adlarını kontrol edebilirsiniz dosya # Okuma kullanıcıları dosyası: u_cols = kullanıcılar = pd.read_csv ('ml-100k / u.user', sep = '|', names = u_cols, encoding = 'latin-1') #Reading derecelendirme dosyası: r_cols = rating = pd.read_csv ('ml-100k / u.data', sep = '\ t', names = r_cols, kodlama = 'latin-1') # Okuma öğeleri dosyası: i_cols = öğeler = pd.read_csv ('ml- 100k / u.item ', sep =' | ', isimler = i_cols, kodlama =' latin-1 ')

Veri setini yükledikten sonra, her dosyanın içeriğini (kullanıcılar, derecelendirmeler, filmler) görüntülemeliyiz:

  • kullanıcı
print (users.shape) users.head ()

Dolayısıyla veri setinde 943 kullanıcı olduğunu ve her bir kullanıcının kullanıcı kimliği, yaş, cinsiyet, meslek ve posta kodu olmak üzere 5 özelliğe sahip olduğunu görebiliyoruz. Şimdi puanlama dosyasına bakalım.

  • Puan
baskı (rating.shape) rating.head ()

Farklı kullanıcı ve film kombinasyonları için 100 bin film derecelendirmesine sahibiz. Şimdi nihayet film dosyasını kontrol edin.

  • film
print (items.shape) items.head ()

Bu veri seti, son 19 sütunu belirli filmlerin türünü belirleyen toplam 24 sütun olmak üzere 1682 filmin özniteliklerini içerir. Bunlar ikili sütunlardır, yani 1 değeri, filmin bu türe ait olduğu anlamına gelir, aksi takdirde 0'dır.

GroupLens, veri setini eğitim ve test olmak üzere ikiye ayırmıştır.Her kullanıcının test verisi toplam 9430 satır olmak üzere 10 seviyeye sahiptir. Daha sonra bu dosyaları python ortamında okuyoruz.

r_cols = rating_train = pd.read_csv ('ml-100k / ua.base', sep = '\ t', names = r_cols, kodlama = 'latin-1') rating_test = pd.read_csv ('ml-100k / ua. test ', sep =' \ t ', names = r_cols, kodlama =' latin-1 ') rating_train.shape, rating_test.shape

Şimdi nihayet öneri motorumuzu oluşturma zamanı!

40'dan işbirliğine dayalı bir filtreleme modeli oluşturun

Kullanıcı-kullanıcı benzerliğine ve film-film benzerliğine dayalı filmler önereceğiz. Bunun için önce bağımsız kullanıcıların ve filmlerin sayısını saymamız gerekiyor.

n_users = rating.user_id.unique (). shapeen_items = rating.movie_id.unique (). şekil

Şimdi, kullanıcılar ve filmler arasındaki benzerliği hesaplamak için kullanılabilecek bir kullanıcı film matrisi oluşturacağız.

data_matrix = np.zeros ((n_users, n_items)) rating.itertuples () satırındaki satır için: data_matrix = line

Şimdi benzerliği hesaplayalım. Sklearn'ın pairwise_distance fonksiyonunu kosinüs benzerliğini hesaplamak için kullanabiliriz.

sklearn.metrics.pairwise içe aktar pairwise_distancesuser_similarity = pairwise_distances (data_matrix, metric = 'cosine') item_similarity = pairwise_distances (data_matrix.T, metric = 'cosine')

Bu, dizi biçiminde öğe-öğe ve kullanıcı-kullanıcı arasındaki benzerliği verir. Bir sonraki adım, bu benzer değerlere dayanarak tahmin yapmaktır.Aşağıda bu tahmini yapmak için bir fonksiyon tanımlıyoruz.

def tahmin (derecelendirmeler, benzerlik, tür = 'kullanıcı'): eğer tür == 'kullanıcı': ortalama_kullanıcı_rating = derecelendirmeler.ortalama (eksen = 1) # Ortalama_kullanıcı_rating ile derecelendirme derecelendirmeleri_diff = (derecelendirmeler) ile aynı biçime sahip olması için np.newaxis kullanırız -mean_user_rating) pred = ortalama_kullanıcı_rating + benzerlik.dot (rating_diff) / np.array (). T elif türü == 'öğe': pred = rating.dot (benzerlik) / np.array () return pred

Son olarak, kullanıcı benzerliği ve film benzerliğine dayalı tahminler yapacağız.

user_prediction = tahmin (data_matrix, user_similarity, type = 'user') item_prediction = tahmin (data_matrix, item_similarity, type = 'öğe')

Tüm bu önerileri otomatik olarak oluşturabilen bir kütüphanemiz olduğu ortaya çıktı. Şimdi Python'da bir öneri motoru oluşturmak için turicreate'i nasıl kullanacağımızı öğrenelim. Turicreate ile tanışmak ve bilgisayarınıza kurmak için lütfen buraya bakın:

https://github.com/apple/turicreate/blob/master/README.md 5 Basit ve popüler bir işbirliğine dayalı filtreleme modeli oluşturmak için Turicreate'i kullanın

Turicreate kitaplığını kurduktan sonra, önce içeri aktarın ve ardından ortamımızdaki eğitim ve test veri setlerini okuyun.

ithal turicreatetrain_data = turicreate.SFrame (rating_train) test_data = turicreate.Sframe (rating_test)

Kullanıcı ve film özelliklerinin yanı sıra kullanıcı davranışına sahibiz, böylece içerik tabanlı ve işbirliğine dayalı filtreleme algoritmaları yapabiliriz. Basit bir popüler modelle başlayıp ardından işbirliğine dayalı bir filtreleme modeli oluşturacağız.

Öncelikle kullanıcılara en popüler filmleri öneren bir model oluşturuyoruz, yani tüm kullanıcılar aynı öneriyi alacak. Bunu başarmak için Turicreate'deki popülerlik önerici öneri işlevini kullanabiliriz.

Popular_model = turicreate.popularity_recommender.create (train_data, user_id = 'user_id', item_id = 'movie_id', target = 'rating')

Kullandığımız çeşitli değişkenler şunlardır:

  • train_data: SFrame ihtiyacımız olan eğitim verilerini içerir
  • user_id: Bu sütun, her kullanıcının kimliğini içerir
  • item_id: Bu sütun, önerilecek her filmi içerir (film kimliği)
  • hedef: Bu sütun, kullanıcı tarafından verilen derecelendirmeyi veya düzeyi içerir

Tahmin süresi doldu! Veri kümemizdeki ilk 5 kullanıcı için en iyi 5 filmi önereceğiz.

popülerlik_rows = popülerlik_model.recommend (kullanıcılar =, k = 5) popülerlik_rows_rows (num_rows = 25)

Tüm kullanıcıların önerilerinin aynı-1467, 1201, 1189, 1122, 814 olduğunu unutmayın. Sıraları aynı! Bu, önerilen tüm filmlerin ortalama derecelendirmesinin 5 puan olduğunu, yani filmi izleyen tüm kullanıcıların en yüksek puanı verdiğini doğrular. Bu nedenle popüler sistem performansımız beklentilerimizle uyumludur.

Popüler modeli oluşturduktan sonra, şimdi işbirliğine dayalı bir filtreleme modeli oluşturacağız. Film benzerlik modelini eğitelim ve ilk 5 kullanıcı için en iyi 5 öneriyi sunalım.

#Modeli eğitme 5) item_sim_recomm.print_rows (num_rows = 25)

Burada her kullanıcının önerisinin (film kimliği) farklı olduğunu görebiliriz. Farklı kullanıcılar için farklı öneri setlerimiz var, bu da kişiselleştirmenin mevcut olduğu anlamına geliyor.

Bu modelde, her bir kullanıcı tarafından verilen her film için bir derecelendirmeye sahip değiliz. Tüm bu eksik puanları tahmin etmenin bir yolunu bulmalıyız. Bunu yapmak için, kullanıcıların filmleri nasıl derecelendirdiklerini tanımlayabilecek bir dizi özellik bulmalıyız. Bunlara gizli özellikler denir. Mevcut özelliklerden en önemli potansiyel özellikleri çıkarmanın bir yolunu bulmalıyız. Bir sonraki bölüm, önemli gizli özellikleri çıkarmamıza yardımcı olmak için düşük boyutlu yoğun matrisleri kullanan matris çarpanlara ayırma tekniğini tanıtacaktır.

6 Matris Ayrıştırmaya Giriş

Matris çarpanlarına ayırmayı anlamak için bir örnek kullanıyoruz. Farklı kullanıcılar tarafından farklı filmlere verilen kullanıcı filmi derecelendirme matrisini (1-5) düşünün.

Buradaki kullanıcı kimliği, farklı kullanıcıların benzersiz kimliğidir ve her filme ayrıca benzersiz bir kimlik atanır. 0,0, kullanıcının belirli bir filmi derecelendirmediği anlamına gelir (1, kullanıcının verebileceği en düşük derecelendirmedir). Bu eksik derecelendirmeleri tahmin etmeyi ve kullanıcıların bir filmi nasıl derecelendirdiklerini belirleyebilecek bazı potansiyel özellikleri bulmak için matris ayrıştırmayı kullanmayı umuyoruz. Orijinal matrisi farklı bileşenlere ayırıyoruz ve bu parçaların çarpımını orijinal matrise eşit hale getiriyoruz.

K potansiyel özelliği bulmak istediğimizi varsayalım. Bu nedenle, puanlama matrisimizi R (MxN) P (MxK) ve Q (NxK) olarak bölebiliriz, böylece P x QT (QT, Q matrisinin devrikidir) R matrisine yaklaşır:

:

  • M, toplam kullanıcı sayısıdır
  • N toplam film sayısıdır
  • K toplam potansiyel özelliktir
  • R, MxN kullanıcı filmi derecelendirme matrisidir
  • P, kullanıcılar ve özellikler arasındaki ilişkiyi temsil eden MxK kullanıcı özelliği korelasyon matrisidir
  • Q, filmler ve özellikler arasındaki ilişkiyi temsil eden NxK film özelliği korelasyon matrisidir
  • , özelliğin önemli ağırlığını temsil eden K * K çapraz özellik ağırlık matrisidir

Matris ayrıştırma yöntemi, potansiyel özellikleri seçmek ve verilerdeki gürültüyü ortadan kaldırmak için kullanılır. Nasıl yapılır? Kullanıcıların filmi nasıl derecelendirdiğini belirleyemeyen özellikleri kaldırır. Şimdi, bir film qik'in tüm potansiyel özellikleri k için kullanıcı puk derecelendirmesini elde etmek için, bu iki vektörün iç çarpımını hesaplayabilir ve tüm potansiyel özelliklere dayalı bir puan elde etmek için bunları ekleyebiliriz.

Bu, matris ayrıştırmasının bize filmleri tahmin etmemiz için verdiği puandır ve bu filmler kullanıcılar tarafından derecelendirilmez. Ancak kullanıcı filmi derecelendirme matrisimize nasıl yeni veriler ekleyeceğiz, yani filme yeni bir kullanıcı katılırsa ve derecelendirirse, bu verileri mevcut matrise nasıl ekleyeceğiz?

Bu süreci anlamanızı kolaylaştırmak için matris çarpanlarına ayırmayı kullanıyorum. Sisteme yeni bir kullanıcı girerse, köşegen ağırlık matrisi ve ürün-özellik korelasyon matrisi değişmeyecektir.Tek değişiklik, kullanıcı özelliği korelasyon matrisi P'dir. Bunu bir miktar matris çarpımı ile başarabiliriz.

Sahibiz:

Her iki tarafı da Q matrisi ile çarpın:

Şimdi elimizde:

ve bu yüzden:

Daha da basitleştirin ve P matrisini alın:

Bu, güncellenmiş kullanıcı özelliği korelasyon matrisidir. Benzer şekilde, sisteme yeni bir film eklenirse, güncellenmiş film özelliği ilişkilendirme matrisi Q'yu almak için benzer adımları takip edebiliriz.

Bilinçli olmalıyız R matrisini P ve Q'ya ayırsak da, hangi P ve Q matrisinin R matrisine daha çok benzediğine nasıl karar veririz? Bunu bir gradyan iniş algoritması ile yapabiliriz.Amaç, gerçek puan ile P ve Q kullanılarak değerlendirilen puan arasındaki karesel hatayı en aza indirmektir. Kare hata formülü aşağıdaki gibidir:

  • eui hata demektir
  • rui i adlı kullanıcıya göre filmin gerçek derecelendirmesini temsil eder.
  • ui, kullanıcının u'nun i filmi derecelendirmesini tahmin etmek anlamına gelir

Amacımız, hatayı en aza indirmek için p ve q'nun değerini belirlemektir, bu nedenle, bu matrislerin optimize edilmiş değerini elde etmek için p ve q'nun değerini güncellememiz gerekir, böylece hatayı en aza indiririz. Şimdi puk ve qki için bir güncelleme kuralı tanımlayacağız. Gradyan inişindeki güncelleme kuralı, minimize edilecek hata gradyanı ile tanımlanır.

Artık gradyanlarımız olduğundan, puk ve qki için güncelleme kuralları uygulayabiliriz:

, her güncellemenin boyutunu belirleyen öğrenme hızıdır. Hata en aza indirilene kadar yukarıdaki güncelleme işlemini tekrarlayın ve sonunda skoru tahmin etmek için kullanılabilecek optimum P ve Q matrislerini elde edebiliriz. Bu algoritmanın nasıl çalıştığını hızlıca gözden geçirelim ve ardından derecelendirilmemiş filmlerin derecelendirmelerini tahmin etmek için bir öneri motoru oluşturacağız.

Matris çarpanlara ayırma tahmin puanı şu şekilde çalışır:

# f = 1,2 için, ...., k: # rui için R: # rui'yi tahmin et # puk ve qki'yi güncelle

Her potansiyel özelliğe bağlı olarak, R matrisindeki tüm eksik puanlar, tahmini rui değerleri ile doldurulacaktır. Ardından, optimum değerlerini elde etmek için puk ve qki'yi güncellemek için gradyan iniş yöntemini kullanın. İşlem aşağıdaki şekilde gösterilmektedir:

Artık bu algoritmanın iç işleyişini anladığımıza göre, bir matrisin bileşenlerine nasıl ayrıştırılacağını görmek için bir örnek alacağız.

Aşağıda gösterildiği gibi 2x3 matris kullanın:

Burada 2 kullanıcımız ve 3 film için ilgili derecelendirmelerimiz var. Şimdi, bu matrisi aşağıdaki gibi alt bölümlere ayırıyoruz:

AAT'nin özdeğerleri bize P matrisini verecek ve ATA'nın özdeğerleri bize Q matrisini verecektir. , AAT veya ATA matrisinin öz değerlerinin kareköküdür.

AAT'nin karakteristik değerini hesaplayın:

AAT'nin öz değeri 25 ve 9'dur. Aynısı doğru, ATA'nın özdeğerini hesaplayabiliriz. Bu değerler 25, 9, 0'dır ve şimdi AAT ve ATA'ya karşılık gelen özellik vektörlerini hesaplayabiliriz.

Özdeğer = 25, elimizde:

Aşağıdakilere basitleştirilebilir:

Matris çekirdeğindeki birim vektör:

Benzer şekilde, = 9 elimizde:

Aşağıdakilere göre basitleştirilebilir:

Matris çekirdeğindeki birim vektör:

Son özellik vektörü için q1 ve q2'ye dik bir birim vektör bulabiliriz. ve bu yüzden,

2X3 matrisi, AAT veya ATA özdeğerlerinin kareköküdür, yani 25 ve 9:

Son olarak, P2X2'yi pi = Aqi veya pi = 1 / (Aqi) formülüyle hesaplayabilirim:

Dolayısıyla, A matrisiyle ayrıştırılan matris aşağıdaki gibidir:

P ve Q matrislerimiz var, optimize edilmiş versiyonlarını elde etmek için gradyan inişini kullanabiliriz, şimdi bir öneri motoru oluşturmak için matris çarpanlarına ayırmayı kullanıyoruz.

7 Bir öneri motoru oluşturmak için matris ayrıştırmayı kullanın

İlk olarak, kendisi tarafından derecelendirilmemiş tüm filmler için kullanıcının derecelendirmesini tahmin etmek için bir işlev tanımlarız.

MF sınıfı (): # Kullanıcı filmi derecelendirme matrisini başlatma, gizli özellik sayısı, alfa ve beta. def __init __ (self, R, K, alpha, beta, iterations): self.R = R self.num_users, self .num_items = R.shape self.K = K self.alpha = alpha self.beta = beta self.iterations = iterations # Kullanıcı özelliğini ve film özelliği matrisini başlatma (self): self.P = np.random. normal (ölçek = 1. / self.K, size = (self.num_users, self.K)) self.Q = np.random.normal (scale = 1. / self.K, size = (self.num_items, self .K)) # Bias terimlerini başlatma self.b_u = np.zeros (self.num_users) self.b_i = np.zeros (self.num_items) self.b = np.mean (self.R) # Eğitim örnekleri listesi self.samples = # Belirli sayıda yineleme için stokastik gradyan inişi training_process = aralıktaki i için (self.iterations): np.random.shuffle (self.samples) self.sgd () mse = self.mse () training_process.append (( i, mse)) if (i + 1)% 20 == 0: print ("Yineleme:% d; hata =% .4f"% (i + 1, mse)) return training_process # Hesaplama toplam ortalama karesel hata tanımı (self): xs, ys = self.R.nonzero () tahmin edilen = self.full_matrix () hata = 0 x için, zip'de y (xs, ys): hata + = pow (self.R-tahmini, 2) return np.sqrt (hata) # Optimize edilmiş P ve Q matrisini elde etmek için stokastik gradyan inişi def sgd (öz): kendi örneklerinde i, j, r için: tahmin = self.get_rating (i, j) e = (r- tahmin) self.b_u + = self.alpha * (e-self.beta * self.b_u ) self.b_i + = self.alpha * (e-self.beta * self.b_i) self.P + = self.alpha * (e * self.Q-self.beta * self.P) self.Q + = self.alpha * (e * self.P-self.beta * self.Q) # i kullanıcısı ve moive j def get_rating (self, i, j) için derecelendirmeler: tahmin = self.b + self.b_u + self.b_i + self.P.dot (self.QT) return tahmini # Tam kullanıcı filmi derecelendirme matrisi def full_matrix (self): return mf.b + mf.b_u + mf.b_i + mf.P.dot (mf .QT)

Artık skoru tahmin edebilen bir fonksiyonumuz var. Bu fonksiyonun girdisi:

  • R-Kullanıcı-Film Derecelendirme Matrisi
  • K- gizli özelliklerin sayısı
  • Alfa - Stokastik gradyan inişinin öğrenme hızı
  • Beta-Regularization parametre sapması
  • Yinelemeler - stokastik gradyan inişi gerçekleştirmek için yineleme sayısı

Kullanıcı filmi derecelendirmesini bir matris formuna dönüştürmeli ve dönüşümü tamamlamak için python'daki pivot işlevini kullanmalıyız.

R = np.array (rating.pivot (dizin = 'kullanıcı_kimliği', sütunlar = 'film_kimliği', değerler = 'derecelendirme'). Fillna (0))

fillna (0); bu, tüm eksik değerlerin 0 ile doldurulduğu anlamına gelir. Artık R matrisine sahip olduğumuza göre, potansiyel özelliklerin sayısını başlatabiliriz, ancak bu özelliklerin sayısı orijinal özelliklerin sayısından az veya ona eşit olmalıdır.

Şimdi tüm eksik derecelendirmeleri tahmin ediyoruz

Parametreler şu şekilde başlatılır: K = 20, alpha = 0.001, beta = 0.01, iterasyon sayısı = 100. mf = MF (R, K = 20, alpha = 0.001, beta = 0.01, iterations = 100) training_process = mf.train () print () print ("P x Q:") print (mf.full_matrix ()) print ()

Aşağıdakiler bize her 20 yinelemeden sonraki hata değerini ve son olarak tam kullanıcı filmi derecelendirme matrisini verir. Çıktı şu şekildedir:

Öneri motorumuzu oluşturduk ve ardından bir sonraki bölümde öneri motorunun performansının nasıl değerlendirileceğine odaklanıyoruz.

8 Öneri Motorunun Değerlendirme Dizini

Öneri motorunun performansını değerlendirmek için aşağıdaki değerlendirme göstergelerini kullanabiliriz.

8.1 Geri çağırma oranı

  • Aslında önerilen filmler arasında, kullanıcıların yüzde kaçı
  • Formül aşağıdaki gibidir:

  • Burada tp, kullanıcıya önerilen filmdeki beğeni sayısını temsil eder tp + fn, beğendiği kişilerin toplam sayısını temsil eder.
  • Bir kullanıcı 5 filmi beğenirse ve öneri motoru bunlardan 3 tanesini görüntülemeye karar verirse, geri çağırma oranı 0,6 olur
  • Hatırlama oranı ne kadar yüksekse, öneri etkisi o kadar iyi olur

8.2 Doğruluk

  • Kullanıcılar önerilen tüm filmlerden ne kadarını gerçekten seviyor?
  • Aşağıdaki şekilde hesaplanmıştır:

  • Burada tp, kendisine önerilen film sayısını, tp + fp ise kullanıcıya önerilen toplam film sayısını temsil eder.
  • Kullanıcıya 5 film önerirseniz ve o 4 filmden hoşlanırsa doğruluk 0,8 olacaktır.
  • Doğruluk ne kadar yüksekse, öneri etkisi o kadar iyi olur
  • Ama şu durumu bir düşünün: Eğer sadece tüm filmleri tavsiye edersek, kesinlikle kullanıcıların sevdiği filmleri kapsayacaktır. Yani% 100 geri çağırma oranımız var! Ancak doğruluğunu dikkatlice düşünün: 1000 film öneriyorsak ve kullanıcılar yalnızca 10 filmini seviyorsa, doğruluk% 0,1'dir, bu gerçekten düşüktür. Bu nedenle, amacımız doğruluğu ve hatırlamayı en üst düzeye çıkarmak olmalıdır.

8.3 Ortalama Kare Hatası (RMSE)

Tahmin puanındaki hatayı ölçer:

  • Tahmin edilen, model tarafından tahmin edilen puan ve Gerçek puan orijinal puandır
  • Bir kullanıcı bir filme 5 puan verirse, puanının 4, ardından RMSE'nin 1 olduğunu tahmin ederiz.
  • RMSE ne kadar küçükse, öneri etkisi o kadar iyi olur

Yukarıdaki göstergeler bize modelin verdiği tavsiyelerin ne kadar doğru olduğunu anlatıyor ancak tavsiyelerin sırasına dikkat etmiyorlar yani önce tavsiye edilen ürünlere ve sonrasında siparişe dikkat etmiyorlar. Ayrıca bazı ölçütlere de ihtiyacımız var, önerilen ürünlerin sırasını dikkate almaları gerekiyor. Daha sonra, bazı sıralama ölçütlerine (sıralama ölçütleri) bir göz atacağız:

8.4 MRR (Ortalama Karşılıklı Sıra)

  • Değerlendirme öneri listesi

  • Kullanıcıya 3 adet A, B, C filmi önerdiğimizi ve siparişlerinin verildiğini varsayalım. Ancak kullanıcılar yalnızca C filmini sever, çünkü C filminin derecesi 3'tür, dolayısıyla Karşılıklı Sıra 1/3'tür.
  • MRR ne kadar büyükse, öneri etkisi o kadar iyi olur

8.5 MAP k'de (k K kesimde Ortalama Ortalama Hassasiyet)

  • Kesinlik ve geri çağırma, tavsiyedeki sırayla ilgili değildir
  • Kesme k doğruluğu, yalnızca 1'den k'ye kadar önerilen alt küme dikkate alınarak hesaplanan doğruluktur.

  • Üç öneri verdiğimizi varsayalım. Burada 0, önerinin yanlış olduğu ve 1 önerinin doğru olduğu anlamına gelir. O zaman k'nin doğruluğu, ortalama doğruluk (1/3) * (0 + 1/2 + 2/3) = 0.38'dir.
  • Ortalama doğruluk ne kadar yüksekse, öneri o kadar doğru olur

8.6 NDCG (Normalleştirilmiş İndirimli Kümülatif Kazanç)

  • MAPNDCGMAPNDCG
  • 10AJABCDE5FGHIJNDCG1
  • NDCG
9

454 .5

5ABCDEABCDEBDACE

B, A, D, C, E

Bu makaleyi faydalı buluyor musunuz?

Comprehensive Guide to build a Recommendation Engine from scratch (in Python)https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-recommendation-engine-python/

Çevirmen Profili

NLPTHU

- Bitiş -

Tsinghua-Qingdao Veri Bilimi Enstitüsü'nün resmi WeChat kamu platformunu takip edin " THU Veri Pastası "Ve kız kardeş numarası" Veri Pastası THU "Daha fazla ders avantajı ve kaliteli içerik elde edin.

Kimin yakacak odunu iyi yanıyor Önümüzdeki yıl için iyi bir işaret var
önceki
Köydeki ilk sekreter He Zhonghua: üç yılını içtenlikle memleketi babalarını ve yaşlılarını yoksulluktan kurtulup zengin olmaya yönlendirerek geçirdi.
Sonraki
Wuhan yatırımı çekiyor ve ardından 81,3 milyar yuan toplam yatırımla 43 projeye yoğunlaşarak "Montaj Numarasını" uçuruyor
Tsinghua Üniversitesi'nin lisans öğrencileri için en büyük onuru: On yıllık resimli özel ödül sahipleri (geçmiş yılların bir listesi ile)
Elinizdeki 3 puan 0 puan olur mu? Cardiff City koçunun öfkesi neredeyse yok olabilir, hakem zorlu bir çalışma sezonunu mahvedebilir!
Intelin hakimiyeti yeniden sorgulandı ve Microsoftun bulut hizmetleri ARM işlemci mimarisini hedefliyor
Resimli Wuhan | Gök yüksekliğinde Japon balığı Wuhan'da görücüye çıktı
Kuru ürünler Yüz tanımanın kısa tanıtımı (örneklerle, Python kodu)
Çocuklarıma ev ödevlerinde yardım etmeli miyim? Alman ebeveynler de tartışıyor!
Sezonda beşinci kez puanlar Tottenham'ın üzerine çıktı ve Arsenal generalleri alay etti: Her zaman gölgemizde yaşıyorlar!
Üretim ve satışları birbirine bağlamak için teknolojiyi kullanın Çin'in gıda ve tarımsal üretim ile satış ve e-ticaret geliştirme konferansı düzenlendi
Çok ilerisinde! 27 yaşındaki Çin Süper Ligi, Dörtlüsü öldürecek ve Avrupa'nın ilk on Altın Çizme'sine girecek!
Makine öğreniminde matematik: yeni yayınlanmış sıcak bir taslak
35 yaşından önce, uluslararası futbolcunun bu kadar patlayıcı kasları var ve Süper Lig'de hala ana gücü oynayabilmesine şaşmamalı!
To Top