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?
- Belirli bir süre düzenli alışveriş yapmış ve daha sonra alışveriş yapmayı azaltmış veya tamamen bırakmış müşteriler incelenerek, makine öğrenmesi ile sebepleri tespit edilebilir ve benzer profildeki müşteriler analiz edilerek müşteri kayıplarının önüne geçilebilir.
- Ürünlerin satış potansiyeline göre fiyat optimizasyonları yapılabilir ve bu şekilde elde uzun süre kalacak ürünlere yatırım yapmayarak depolama maliyetleri düşürülebilir.
- Müşterinin konumu kullanılarak bölgesel analiz yapılabilir; bölgenin hava sıcaklığı gibi ekstra alanlar üzerinden değerler göz önüne alınarak tavsiyelerde bulunulabilir
- Makine öğrenmesinin diğer önemli avantajı da tekrar müşterisini artırmaya olan desteğidir. (Müşteri kazanma maliyeti oldukça yüksektir ve müşteri elde tutma oranını sadece %5 arttırarak, kârlılıkta %75’e varan bir artış yakalanabilir.*)
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ı
- Bölümlendirme, Kişiselleştirme ve Hedefleme: Müşterilerin profillerini çıkarıp belirli kümelere ayırarak onları satın almaya yönlendirme
- Fiyatlandırma Optimizasyonu: Rakip firmaların fiyatlarına göre veya belirli fiyat aralıklığındaki satış oranlarına göre optimizasyon
- Arama Sıralaması: Arama yaparken müşteri ürünlerin arasında kaybolmadan istediği ürüne rahat ulaşabilsin diye müşteri profiline göre arama sonuçları sunulması
- Ürün Önerileri: Bu ürüne bakanlar bunlara da baktı veya şu ürünler hoşunuza gidebilir gibi müşterinin alışveriş modeline uygun ürünler tavsiye edilmesi
- Müşteri Desteği ve Self Servis: Müşteriye daha hızlı hizmet sunabilmek için chat bot veya akıllı asistan(Bankacılıkta kullanılanlar gibi) hizmeti sunulması (Anlık destek sağlayan bu araçlarla müşteri sorununu daha hızlı çözer ve daha memnun ayrılır.)
- Arz ve Talep Tahmini: Makine öğrenmesiyle müşteriler hangi dönemlerde ne tarz ürünlere rağbet ettiğini ve hangi ürünlerin satışlarının azaldığını tahmin edip, buna göre planlama ve satın alma yapılması
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.

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,
- Filmi izlerken hangi sahneleri geriye, hangi sahneleri ileri sardı?
- Tek seferde mi yoksa parça parça mı izledi?
- İzlediği cihaz türü ne?
- İzlerken ses seviyesi ne durumdaydı ?
- Filmi kaç kere durdurdu?
gibi verileri ve bilmediğimiz daha onlarca farklı veriyi işleyerek bize nokta atışı dizi ve filmler sunuyor.

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;
- Şu kaynaktan tablo oluştur yazan açılır menüye tıklayın Yükle’yi seçin.
- Dosya seç kısmından test verisinin olduğu konuma gidip, dosyanızı seçin.
- Hedef kısmında projenizi ve veri kümenizi seçin. Daha sonra alttaki Tablo adı kısmını doldurun.
- 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 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 'VeriKümesiAdı.ModelAdı'
model_type alanına kullanmak istediğimiz regrasyonu yazıyoruz
{ ‘LINEAR_REG’ | ‘LOGISTIC_REG’ | ‘KMEANS’ | ‘TENSORFLOW’ }
Biz linear_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 `VeriKumesiAdi.ModelAdi`, (select * from VeriKumesiAdi.testTablo))
ML.EVALUATE
Modeli değerlendirmede kullanılırML.PREDICT
Modeli kullanarak tahmin yapmak için kullanılır
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:
- CustomerID — Müşteri ID
- Gender— Cinsiyet
- Age — Yaş
- Annual_Income — Yıllık Gelir (1000$)
- Spending_Score — AVM tarafından müşterilere verilmiş 0–100 arası puan
İ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.
- Centroid_id: Kümeni numarası
- Feature: Özelliği içeren sütun adı
- Numerical_value: Ağırlık merkezinin sayısal değeridir.
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:
Centroid id 2 olan kümeyi incelediğimizde yıllık gelirin çok yüksek fakat alışveriş yapma alışkanlığının düşük olduğunu görüyoruz.
Centroid id 5 olan kümeyi incelediğimizde yıllık gelirin çok yüksek alışveriş yapma alışkanlığının da çok yüksek olduğunu görüyoruz.
Centroid id 4 olan kümeyi incelediğimizde yıllık gelirin ortalama alışveriş yapma alışkanlığının da ortalama değerlerde olduğunu görüyoruz.
Centroid id 1 olan kümeyi incelediğimizde yıllık gelirin düşük alışveriş yapma oranında düşük olduğunu görüyoruz.
Centroid id 3 olan kümeyi incelediğimizde yıllık gelirin düşük fakat alışveriş yapma oranının çok yüksek olduğunu görüyoruz.
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_item_number, date, store_number, store_name, address, city, zip_code, store_location, county_number, county, category, category_name, vendor_number, vendor_name, item_number, item_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
