Site icon Kartaca

Makine Öğrenmesi, E-Ticaret ve Uygulama Örnekleri


Makine Öğrenmesi, E-Ticaret ve Uygulama Örnekleri

Makine öğrenmesinin e-ticaret alanındaki en büyük artılarından biri kullanıcılara kişiselleştirilmiş hizmet sunulmasını kolaylaştırmasıdır. Bunun ne anlama geldiğini şöyle açıklayabiliriz:

Önceden anahtar kelime eşleştirmesi gibi basit yöntemlerle kullanıcının beğenme ihtimali olan ürünler öneri olarak sunulurdu. Şu anda ise, iki farklı hesaptan aynı e-ticaret sitesine girdiğimizde bizi farklı sayfalar karşılıyor. Makine öğrenmesi sayesinde, günümüzde, kullanıcının aldığı ürün türleri, hangi fiyat aralığındaki ürünleri aldığı, ayın hangi haftası daha fazla alım yaptığı, hangi tür kampanyalardan faydalandığı gibi onlarca veriyi kullanarak, kullanıcıyı alım yapmaya teşvik edecek sayfalar sunabiliyor, kampanya e-postaları veya SMS’leri gönderebiliyoruz.

Neler yapılabilir?

Amazon’un açıklamasına göre tavsiye motorları aracılığıyla yapılan satışlar, tüm satışların %35’ini oluşturmaktadır. Makine öğrenmesi ile kullanıcılarınızı milyonlarca veri arasından analiz ederek gelirlerinizi artırabilir, geri dönmeleri için onları ilgilendikleri kampanyalar hakkında düzenli olarak bilgilendirebilirsiniz.

Makine öğrenmesinin e-ticaret alanındaki çalışmaları

Netflix Örneği

Netflix, içerisinde yüzbinlerce içerik bulunduran bir dizi/film servisidir.

Her ne kadar doğrudan e-ticaret kategorisine girmese de, bir hizmet satılmakta ve bu satışın artması beklenmektedir.

Kaynak: http://itistherealthing.com/2017/08/22/can-ai-solve-your-ux-design-problems/

Netflix’in son zamanlarda en çok göz önüne çıkan özelliği dizi veya filmlerin kapak fotoğraflarıdır. Bu kapak fotoğrafları sizin izleme kültürünüze göre şekilleniyor. Örneğin, X oyuncusunun başrolde oynadığı hemen hemen tüm filmleri izlediyseniz, aynı oyuncu başka bir Y dizisinde konuk oyuncu olarak sadece 2 dakikalık bir sahnede oynasa bile, Netflix o filmin kapak fotoğrafına sizin hayranı olduğunuz oyuncuyu koyuyor.

Eski klasik yöntemler (yaş,cinsiyet) gibi demografik parametrelerle değil,

gibi verileri ve bilmediğimiz daha onlarca farklı veriyi işleyerek bize nokta atışı dizi ve filmler sunuyor.

Kaynak: https://becominghuman.ai/how-netflix-uses-ai-and-machine-learning-a087614630fe

Yukarıdaki örnekte gördüğünüz gibi aynı film fakat kullanıcıların sevdiği türe göre farklı kapak fotoğrafı üretilmiş, bu işlemlerin büyük çoğunluğu Credentials Sharing Insight adlı makine öğrenmesi yazılımıyla gerçekleşiyor.

BigQuery ML ile Yaş Tahmini Örneği

(Bu örnek temel kullanımı ve parametreleri açıklamak için eklenmiştir.)

İlk önce https://console.cloud.google.com/ adresine girip hesap oluşturuyoruz daha sonra arama kısmından BigQuery aramasını yapıp en üstteki sonuca tıklıyoruz.

Daha sonra aşağıdaki ekran karşımıza geliyor. Ekranın sağ altında bulunan Veri Kümesi Oluştur butonuna tıklıyoruz.

Daha sonra alttaki ekran görüntüsünde gözüken sağ menü açılıyor, veri kümesi kimliği verilerin saklanacağı sunucunun konumu ve eğer belirli bir süre sonra kendiliğinden silinmesi isteniyorsa aşağıdaki kutucuğa zamanını giriyoruz. Son olarak sayfanın altındaki Oluştur butonuna tıklayıp kaydediyoruz.

Veri kümesi oluşturulduktan sonra tablo oluşturmamız gerekiyor. Bunun için aşağıdaki görselde bulunan Tablo Oluştur butonuna tıklayın.

Ekranın sağında açılan menüden;

  1. Şu kaynaktan tablo oluştur yazan açılır menüye tıklayın Yükle’yi seçin.
  2. Dosya seç kısmından test verisinin olduğu konuma gidip, dosyanızı seçin.
  3. Hedef kısmında projenizi ve veri kümenizi seçin. Daha sonra alttaki Tablo adı kısmını doldurun.
  4. Son olarak Şema kısmından kolon isimlerini ve veri tiplerini doldurup kaydedin.

Bu işlemler bittikten sonra ekranın sol alt kısmında “Tablo oluşturuldu kaynağa git.” bildirimini göreceksiniz.

Aşağıdaki görseldeki sorgu alanı üzerinden sorgunuz yazıp tablonuzu test edebilirsiniz.

Sorguyu yazarken DataSetName.TableName (VeriKümesiAdı.Tabloadı) şeklinde yazmaya dikkat edin. Sadece tablo adı yazarsanız hata alabilirsiniz.

Şimdi eğitim aşamasına geçiyoruz. İlk önce model oluşturmamız gerekiyor. Bunun için sorgu kısmını açıyoruz ve aşağıdaki şekilde ilerliyoruz.

CREATE MODEL 'DataSetName.ModelName'

model_type alanına kullanmak istediğimiz regresyonu yazıyoruz.

{ ‘LINEAR_REG’ | ‘LOGISTIC_REG’ | ‘KMEANS’ | ‘TENSORFLOW’ }

Bizlinear_reg kullanacağız bunun için input_label_cols parametresini ekliyoruz.

input_label_cols kısmına tahmin yapmasını istediğimiz kolonu yazıyoruz. Bu alana sayısal değer alan bir kolon girmeliyiz.

Son olarak, öğrenme işlemini yapacağımız tablomuzu yazıyoruz.

Model oluştuktan sonra test verilerimizin bulunduğu bir tablo oluşturuyoruz.

Dikkat Edilmesi Gerekenler

*Eğitim ve test veri setlerimiz farklı olmalıdır. Aynı verilerle test işlemi yaparsak sonuçlar ezberlenebileceği için algoritmanın sağlıklı sonuç verip vermediğini öğrenemeyiz.

* Aşırı uyum (Overfitting) sorunu eldeki veriler üzerinde test edildiğinde çok iyi sonuçlar verir, fakat yeni veri setlerinde işlem yapmaya çalıştığında hata oranı çok yüksek çıkar. Çünkü verinin içindeki gürültüyü de ezberler.

Örnek: Bir sınava gireceksiniz ve son 5 yıldaki tüm soru kalıplarını öğrendiniz. Sınavda karşınıza farklı bir soru tipi geldiğinde soruyu çözememe ihtimaliniz çok yüksektir çünkü bu öğrenme değil ezberleme işlemidir.

Bu sorunun çözümü için 2 yöntem vardır;

1. Çapraz Doğrulama (Cross Validation)

Veri kümesini belli bir sayıda eşit parçaya bölüyoruz. Genelde bu sayı 10 oluyor. 9 tanesi eğitim seti seçilirken bir tanesi test veri seti seçiliyor.

10 parçadan her seferinde farklı test kümesi alacak şekilde eğitim ve sınıflandırma işlemini 10 kere gerçekleştiriyoruz.

Sonunda her fazda elde ettiğimiz doğruluk değerinin ortalamasını alıyoruz. Sonuç bize sınıflandırma algoritmamızın doğruluk oranını verecektir.

2. Düzenlileştirme (Regularization)

Düzenlileştirmenin amacı, modelde aşırı uyumu önleyerek; ezberleme değil öğrenme işleminin gerçekleşmesini sağlamaktır. Bunları veri setini genişletme, sentetik veri üretme(daha çok resim,video gibi işlemlerde kullanılır), düğüm seyreltme gibi işlemler yaparak gerçekleştirir.

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `DataSetName.ModelName`,
    (
      SELECT
        *
      FROM
        `DataSetName.TestTable`
    )
  );

Biz tahmin işlemi yaptıracağımız için ML.PREDICT parametresini kullandık. Sorgu sonucunda predicted_XY kolonunda tahmin edilen değerleri görebilirsiniz.

Algoritmanın hata oranını tespit edelim:

Yukarıdaki görsel bize algoritmamızın hata oranlarını göstermektedir. Kolon isimlerine göre hangisi ne ifade ediyor inceleyelim.

MAE(Mean Absolute Error): Tahmin edilen değer gerçek değerden çıkartılır bu tüm tahminler için yapıldıktan sonra toplamları N (Tahmin sayısı) bölünür. Değerler mutlak değer içinde hesaplandığı için pozitif olur.

MSE (Mean Squared Error): MSE, bir ML modelinin, tahminleyicinin performansını ölçer, her zaman pozitif değerlidir ve MSE değeri sıfıra yakın olan tahminleyicilerin daha iyi bir performans gösterdiği söylenebilir.

MdAE (Median Absolute Error): Median Absolute Error, gerçek değerler ve tahmin değerleri arasındaki tüm mutlak farkların medyanı alınarak hesaplanır. İyi bir performans gösteren tahminleyicinin MdAE değeri sıfıra yakın değerler alır.

R2_Score: r2_score’un en başarı hali 1 değeridir fakat 1 olabilmesi için tüm tahminleri doğru yapması gereklidir. Bizim örneğimizde 0,499 değeri çıktı. Bu demek oluyor ki; kullandığımız regresyon algoritması veri setimizi iyi öğrenemedi. Bu durumda, sonucu 1’e yaklaştırana kadar farklı algoritmalar denememiz gerekir.

Müşteri Segmentasyonu Örneği

Elimizdeki veri setini kullanarak, bir alışveriş merkezinin gelirlerini arttırmak için müşteri segmentasyonu örneği yapacağız.

Veri setimizde aşağıdaki alanlar var:

İlk olarak veri setimizde null alan olup olmadığını test ediyoruz.

SELECT
  *
FROM
  `staj-krtc.magaza.musteri`
WHERE
  CustomerID IS NULL
  OR Gender IS NULL
  OR Age IS NULL
  OR Annual_Income IS NULL
  OR Spending_Score IS NULL;

Sorgu sonucunda null alan çıkmadı. (Bu işlemi, veri setimizi eğitirken null alanlar karmaşıklığa yol açmasın diye yaptık. Eğer null alanlar olsaydı, öncelikle bunları temizlememiz gerekecekti.)

Veri setimizi biraz inceleyelim; cinsiyet dağılımına göre baktığımızda müşterilerin %42,6’sının erkek, %57,4’ünün kadın olduğunu görüyoruz.

Cinsiyete göre ortalama yıllık gelir ve AVM tarafından alışverişlere göre verilen müşteri puanları:

Erkeklerde ortalama yıllık gelir 57,2K $ ve puan 48,3

Kadınlarda ortalama yıllık gelir 55,33K $ ve puan 51,2

Bu değerlerden anladığımıza göre, kadınlar erkeklerden daha az kazanmalarına rağmen daha fazla alışveriş yapmaktadırlar.

Aşağıdaki grafikten bunu daha rahat görebiliriz:

Veri setimizi eğitmek için bir model oluşturmamız gerekiyor. Bunun için ilk önce hangi alanları kullanacağımızı tespit etmeliyiz. (Yanlış veya gereksiz alanları kullanmak modelimizde karmaşıklığa sebep olacaktır.)

Biz bu örnekte, yıllık gelir ve müşteri puanını kullanacağız. Algoritma olarak K-means algoritması kullanacağız. K-means algoritması bir kümeleme algoritmasıdır ve modeli oluştururken kaç kümeden oluşacağını belirtmemiz gerekir. Örneğimizde 5 kümeden oluşmasını istedik.

Modelin Görselleştirilmesi

Kümeleme sonuçlarını daha kolay inceleyebilmemiz için görselleştirmemiz gerekiyor. Aşağıdaki sorguyu yazarak başlıyoruz:

SELECT
  *
FROM
  ML.CENTROIDS(MODEL `staj-krtc.magaza.segmentation_sample`);

ML.CENTROIDS: K-means veya k-median algoritmaları tarafından belirlenen ve kümenin merkezinin değerini gösteren algoritmadır.

Kümeleri daha iyi karşılaştırabilmek için UNNEST operatörünü kullanarak sorgumuzu yazalım:

Sorgumuzun sonucunda kümeleme işlememizi sonucunu daha düzenli şekilde görebiliriz.

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `staj-krtc.magaza.segmentation_sample`,
    (
      SELECT
        *
      FROM
        `staj-krtc.magaza.musteri`
    )
  );

Sorgusunu yazıyoruz ve aşağıdaki gibi bir çıktı karşımıza çıkıyor burada müşterilerin 5 kümeye de olan uzaklıklarının hesaplandığını ve müşteri hangi kümeye daha yakınsa o kümeye dahil edildiğini görüyoruz.

NEAREST_CENTROIDS_DISTANCE.CENTROID_ID: Küme ID’si

NEAREST_CENTROIDS_DISTANCE.DISTANCE: Kümelere olan uzaklık

Modelimizi yazarken belirtmediğimiz için kmeans uygulaması mesafe hesaplamasını oklid ile hesaplıyor, şimdi görselleştirme işlememize geçelim.

Data Studio kullanarak kümelerimizi görselleştirebiliriz bunun için Data Studio ile Keşfedin butonuna tıklıyoruz

Aşağıdaki grafikte müşterilerin ortalama yıllık gelirlerini ve dahil oldukları kümeye göre AVM puanlarını görebiliyoruz.

Grafiğimizi yorumlayalım:

Sonuç: Bu kümeler incelendiğinde en dikkat çeken kümelerin 2 ve 3 numaralı kümeler olduğunu görebiliriz. 3 numaralı kümedeki müşterilerin üzerinde çalışmaya pek ihtiyaç yok gibi gözüküyor çünkü, düşük gelir oranına rağmen yüksek alışveriş alışkanlıkları zaten var. Fakat 1,4,5 ve özellikle 2 numaralı kümelerdeki müşterilerin üzerinde durulup daha çok alışverişe teşvik edecek kampanyalar yapılabilir.

Satın Alma Tahmini Örneği

Satın alma tahmini örneğinde Iowa eyaletini sağlamış olduğu verileri kullanağız. BigQuery örnekleri içerisinden ilgili veri setine ulaşabilirsiniz (bigquery-public-data.iowa_liquor_sales.sales).

Veri setimizde aşağıdaki kolonlar bulunmaktadır. Veri setini eğitirken county_number, item_number ve pack alanlarını kullanacağız.

invoice_and_itcode_number, date, store_number, store_name, address, city, zip_code, store_location, county_number, county, category, category_name, vendor_number, vendor_name, itcode_number, itcode_description, pack, bottle_volume_ml, state_bottle_cost, state_bottle_retail, bottles_sold, sale_dollars, volume_sold_liters, volume_sold_gallons

Amaç: Herhangi bir ilçedeki dükkanda herhangi bir üründen kaç paket satılabileceğini tespit etmek.

Modelimizi oluştururken algoritma olarak linear_reg kullanacağız.

İlk önce veri setimizdeki null olan alanları tespit edip temizliyoruz daha sonra modelimizi oluşturuyoruz. (model_type ve input_label_cols gibi alanları ne olduğu yukarıda yaş örneğimizde açıklamıştık.)

Veri setimizde yaklaşık 16 milyona yakın kayıt bulunmaktadır. Tek veri setimizi bölmemek için küçükten büyüğe doğru sıralayıp ilk 8 milyonu üzerinden modelimizi eğittik. Daha sonra tüm veri seti üzerinde test edeceğiz. Aslında bu pek önerilmez çünkü eğitim verileri test veri setinde de olduğu için skor olduğundan fazla çıkabilir.

Modelimizi test ettik ve r2 skorumuzu 0,23 olarak bulduk, r2 değeri 1’e yaklaştıkça modelimiz başarılı demektir. Fakat gerçek hayatta bu değerlerin çok yüksek çıkması mantıklı değildir ve beklenemez çünkü bu tahmin ettiğimiz değerler sadece veri setimizdeki değişkenlere bağlı değildir. Bizim kontrolümüzde olmayan, hava sıcaklığı, piyasaya yeni çıkan benzer ürünler gibi örnekler bizim satışlarımızı kontrolümüzde olmadan değiştirebilir.

Yazan: Furkan Özalp

Yayınlanma Tarihi: 11.09.2019


Exit mobile version