Ne izleyelim? - Azure Machine Learning Studio
15 Aug 2019Hangi filmi izlesem, seveceğim yeni bir dizi olsa da başlasam diyor musunuz? imdb.com üzerinde izlediğiniz film ve dizilere puan veriyor musunuz? Haydi o zaman Azure Machine Learning Studio (kısaca Azure ML diyeceğim) ile yeni tavsiyeler yaptıralım.
Puanlarımızı indirelim
imdb.com adresinden verdiğimiz puanlara gidelim (umarım link görülebiliyordur 😀).
Puanlarımızı .csv dosyası olarak indirelim.
Aşağıdaki gibi bir içeriği olan dosyamızı bir kenara kaldıralım.
Ben 2007 yılından bu güne 1611 dizi ve filme oy vermişim, tabi 2007 öncesi izlediklerimi de hatırlayıp olabildiğince izlediğim her şeye puan vermeye çalışıyorum (ve biraz fazla izliyor olabilirim).
Gerekiyorsa üye olup en azından 100 civarı oy vermeye çalışmanızı tavsiye ederim.
Azure ML
Azure ML adresinden giriş yapalım, eğer üye değilseniz Free Workspace ile ücretsiz giriş yapabilirsiniz (10 GB limit oluyor). Aşağıdaki gibi bir ekran ile karşılaşmanız gerekiyor.
Sol altta yer alan New butonu ile yeni bir deney oluşturalım.
Bizi aşağıdaki gibi bir ekran karşılayacak.
Ben ilk iş sol üstte gördüğünüz tarih yerine akılda kalacak bir isim veriyorum, tavsiye ederim çok karışıyor yoksa.
Yine New butonu ile indirdiğimiz puanlarımızı Dataset olarak yükleyelim.
Yükleme tamamlandığında Saved Datasets menüsünde My Datasets altına gelecek, sürükleyip ortalığa bırakalım.
Dataset
Dataset; ayrılmış, json, excel, parquet, pandas DataFrame, SQL sorgusu ve binary formatlarını destekleyen veriyi temsil eden bir yapı. Basitçe ortak veri formatı gibi görebilirsiniz. Bir Dataset oluşturduğumuzda veriye nasıl ulaşılacağı bilgisi ve kaynağın meta bilgisi kopyalanır, veriler kopyalanmaz. Veri esas kaynağında durur, gerektiğinde yorumlanarak okunur böylece ekstra saklama alanı harcanmaz.
Eklediğimiz puanlarımıza sağ tıklayıp Visualize diyerek içeriği görebilirsiniz.
Azure ML bize bir çok hazır Dataset’de sağlıyor, bunlardan bir tanesi hazır film puanları. Zaten bu olmasa veri toplamakla da uğraşmamız gerekecekti. Azure bize 227.472 adet hazır puan bilgisini sunuyor. Hemen deneyimize ekleyelim.
İsterseniz içeriğine yine aynı şekilde Visualize seçeneğiyle bakabilirsiniz. Hatta bakın, gıcık bir durum var çünkü.
MovieId alanı sayı tipinde, oysa bizim indirdiğimiz kendi oylarımızda tt ile başlayan ve 0 ile padleft yapılmış durumda. Birini diğerine çevirmemiz gerekiyor.
Sol tarafta gördüğünüz menüde veriler üzerinde bir çok işlem yapmanızı sağlayan araçlar bulunuyor. İtiraf edeyim ben de bir çoğunu bilmiyorum, zaten öğrenme yöntemi olarak bu tür listeleri ezberlemeyi doğru bulmuyorum, ne yapmak istediğimizi biliyorsak neye ihtiyacımız olduğunu tahmin edebiliyoruz, ufak bir araştırma yaparak da gerekli aracı hızlıca öğrenebiliyoruz. O yüzden hepsine değinmektense kullandıklarımızı anlatacağım sadece.
Veri dönüşümü için benim favorim Apply SQL Transformation oldu. SQLite sorgu motorunu kullanarak veriler üzerinde istediğimiz işlemleri yapabiliyoruz. Bu arada SQLite sorgu dili biraz farklı, TSQL, PLSQL yazıp hayal kırıklığına uğramadan uyarayım dedim.
Arama kutusuna sql yazıp Apply SQL Transformation kutusunu sürükleyip ratings.csv altına bırakalım ve üst soldaki noktayı ratings.csv alt tarafı ile bağlayalım. Seçiliyken sağ tarafta sorgumuzu girebileceğimiz bir kutu açılacak. Bize sadece kullanıcı ID (kendimizi diğer kullanıcılardan ayırmak için -1 veriyoruz), film ID ve oy bilgileri lazım. Tamamlanmış hali aşağıdaki gibi.
Şimdi kendi oylarımızdan 3 alan seçerek yeni veri kümemizi oluşturduk, bu listeye Azure ML tarafından bize sunulan listeyi de ekleyip kalabalık bir liste oluşturacağız. Ancak bunun için öncelikle sütun sayılarımızın eşit olması gerekiyor. Sol taraftan öncelikle Select Columns in Dataset bileşenini ekleyerek resimdeki gibi 3 alanımızı seçelim.
Şimdi kendi oylarımız ile hazır oyları birleştirebiliriz. Burada dikkat edilmesi gereken bir nokta var, eğer verileri birleştirmezseniz Azure ML bizim daha önce verdiğimiz oyları tespit edemiyor, tavsiyeleri zaten izlediğimiz yapımlar oluyor (Örneğin bu birleştirme işini yapmadığımda bana hazır veriler içindeki en yüksek puanları almış filmleri önerdi).
Yeşil tikler dikkatinizi çekmiştir, oluşturduğumuz deneyi istediğimiz zaman alt tarafta yer alan RUN komutu ile çalıştırabiliriz. Hatta istersek tüm diyagram yerine sadece seçili bileşeni de çalıştırabiliyoruz.
Şimdi bu biriktirdiğimiz verileri yorumlama zamanı.
Train Matchbox Recommender
Train Matchbox Recommender Microsoft tarafından geliştirilmiş, olasılıksal bir modele (Bayesian) dayanan büyük ölçekli bir öneri sistemidir. Bu model, bir kullanıcının tercihlerini film, içerik veya diğer ürünler gibi ögeleri nasıl derecelendirdikleri üzerine yapılan gözlemlerle öğrenebilir. Bu gözlemlere dayanarak, istendiğinde kullanıcılara yeni ürünler önerir.
Kullanıcılar tarafından verilmiş puan bilgilerinin yanında kullanıcılar ve içerikler hakkındaki meta verileri de öğrendikleri arasına katabiliyor.
Sözlük tanımını geçersek, Microsoft, tavsiye sistemi geliştirebilmemiz için bize var olan puan bilgilerinden öğrenebilen hazır bir bileşen sunuyor. Hemen deneyimize ekleyelim. Kullanıcı ve içerik meta bilgilerimiz olmadığından onları eşleştirmeden bırakıyoruz.
Train Matchbox Recommender ile yapabileceğimiz ayarlar da aşağıdaki gibi (bileşeni seçtiğimizde sağ tarafta görebilirsiniz).
Number of traits: Kullanıcı meta verilerinden kaç tanesini öğrenirken kullanacağı bilgisi. Biz meta verileri kullanmadığımız için varsayılan değeri bırakabiliriz.
Number of recommendation algorithm iterations: Algoritmanın verileri kaç kez işleyeceği. Varsayılan değer kalabilir.
Number of training batches: Algoritma verileri parçalara ayırarak paralelde çalıştırabiliyor. Bu değer ile kaç grup olacağını söylüyoruz, idealde işlemcinin core sayısı kadar girmeliyiz. Yine varsayılan değer kalabilir.
Artık elimizdeki verileri öğrenmiş bir sistemimiz var, sırada bildiklerine göre yorum yapabilmesini sağlamaya geldi.
Score Matchbox Recommender
Score Matchbox Recommender öğrenilmiş modeli kullanarak tahminler yürütebilen bir bileşen. Bu bileşen de kullanıcılar ve içerikler hakkındaki meta verileri değerlendirmeye alabiliyor. Biz yine bunları boş geçeceğiz, bize gerekenler eğittiğimiz tavsiyeci, tahmin yürütmesini istediğimiz veriler ve eğitim sırasında kullandığımız veri kümesi.
Score Matchbox Recommender için yapabileceğimiz ayarlar ise aşağıdaki gibi.
Recommender prediction kind: Puan tahmini, yakın kullanıcılar ve yakın içerikler seçenekleri de bulunan listeden biz içerik tavsiyesi istediğimiz için Item Recommendation seçeneğini seçiyoruz (varsayılan seçenek).
Recommender item selection: Algoritmadan tüm seçenekler, puan verdiklerimiz (teyit etmek için) ya da puan vermediğimiz veriler (tavsiye için) için tahmin yürütmesini isteyebiliriz. From Unrated Items seçiyoruz.
Maximum number of items to recommend to a user: Kaç adet tavsiye istediğimiz. 5 değeri kalabilir, daha fazla tavsiye istiyorsanız bu değeri arttırabilirsiniz.
Whether to return the predicted ratings of the items along with the labels: Algoritmadan tahmin edilen içeriklerin yanında bizim vereceğimizi tahmin ettiği puanı da söylemesini isteyebiliyoruz. Seçmeden geçtim.
Bir bakalım nasıl tavsiyede bulunmuş. Deneyimizi çalıştırıp Score Matchbox Recommender bileşenine sağ tıklayarak Score Dataset -> Visualize ile sonucu görselleştirelim.
5 adet tavsiyeyi görebiliyoruz. Ancak hepsi Film ID değerleri. İsimleri öğrenmemiz lazım, bunun için de verileri yine Azure ML’in bize sağladığı IMDB Movie Titles bileşeni ile yapacağız. Ancak bir sorun var, verileri Join ile birleştirebilmek için yatayda yer alan bu 5 öneriyi dikeye çevirmemiz gerekiyor. Ben bu iş için Execute Python Script bileşenini kullandım.
Script aşağıdaki gibi:
import pandas as pd
def azureml_main(dataframe1 = None, dataframe2 = None):
values = [dataframe1[c] for c in dataframe1.columns[1:]]
return pd.DataFrame(values)
Python bilenler için çok kolay olan kodumuzu yine de açıklayalım. Bileşenimize gelen ilk parametre olan dataframe1 sütunlarından ilki hariç (çünkü ilk alan UserId) her biri için veriyi alıp bir diziye ekliyoruz, ve bu dizi ile yeni bir DataFrame oluşturup dönüyoruz.
Görselleştirme ekranını açtığımızda karşılaştığımız sonuç ise aşağıdaki gibi (tabii tavsiyeler bana özel).
Son işlem olarak bu listeyi aşağıdaki gibi IMDB Movie Titles bileşeni ile Join Data kullanarak birleştiriyoruz. Deneyimizin son hali aşağıdaki gibi.
Tavsiyeleri ise Join Data bileşenini görselleştirerek görebiliriz.
Sonunda tavsiyelerimi aldım, listeye bakınca izleyip çok sevdiğim ancak puan vermeyi unuttuğum Lawrance of Arabia, zaten izleme listemde olan Witness for the Prosecution yanında büyük ihtimal seveceğim The Class of 92, Paris, Texas, It’s a Wonderful Life gibi filmler yer alıyor. Kesinlikle başarılı tahminler 😊.
Mutlu kodlamalar!