Recommendation AI

AI Öneri Sistemi: Kişiselleştirilmiş Öneriler

Collaborative filtering, content-based filtering, hybrid recommendation sistemleri. Amazon, Netflix, Spotify tarzı AI-powered recommendation engine.

🎯Öneri Sistemi Türleri

Recommendation Engine (Öneri Motoru), kullanıcı davranışlarını analiz ederek kişiselleştirilmiş ürün/içerik önerileri sunar. Satışları %20-35 artırır.

Collaborative Filtering

Mantık: Benzer kullanıcılar
Örnek: "Bunu alanlar şunu da aldı"
Güç: Yeni ilişkileri keşfeder
Zayıf: Cold start problemi

Content-Based

Mantık: Ürün özellikleri
Örnek: "Benzer ürünler"
Güç: Yeni kullanıcıda çalışır
Zayıf: Sürpriz öneriler yok

Hybrid (Melez)

Mantık: İkisinin karışımı
Örnek: Netflix, Spotify
Güç: Her durumda iyi
Zayıf: Kompleks

Collaborative Filtering

# User-based Collaborative Filtering (Scikit-learn)
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

# Kullanıcı-Ürün matrisi (rating: 1-5, 0: görülmemiş)
user_item_matrix = pd.DataFrame({
    'Laptop_A': [5, 4, 0, 0, 2],
    'Laptop_B': [4, 0, 0, 5, 3],
    'Mouse_C': [0, 3, 4, 4, 0],
    'Keyboard_D': [0, 0, 5, 4, 0],
    'Monitor_E': [2, 0, 3, 0, 4]
}, index=['User_1', 'User_2', 'User_3', 'User_4', 'User_5'])

# Kullanıcılar arası benzerlik hesapla (cosine similarity)
user_similarity = cosine_similarity(user_item_matrix.fillna(0))
user_similarity_df = pd.DataFrame(
    user_similarity,
    index=user_item_matrix.index,
    columns=user_item_matrix.index
)

print(user_similarity_df)
#           User_1  User_2  User_3  User_4  User_5
# User_1    1.000   0.894   0.267   0.387   0.678
# User_2    0.894   1.000   0.298   0.433   0.601
# ...

# User_1 için öneri
def recommend_for_user(user_id, n_recommendations=3):
    # 1. Benzer kullanıcıları bul
    similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:4]  # Top 3

    # 2. Benzer kullanıcıların beğendiği ama user_id'nin görmediği ürünleri bul
    recommendations = {}

    for similar_user, similarity_score in similar_users.items():
        # Bu kullanıcının beğendiği ürünler
        liked_items = user_item_matrix.loc[similar_user][user_item_matrix.loc[similar_user] >= 4]

        for item, rating in liked_items.items():
            # User_1 bu ürünü daha önce görmediyse
            if user_item_matrix.loc[user_id, item] == 0:
                if item not in recommendations:
                    recommendations[item] = 0
                # Ağırlıklı puan (benzerlik × rating)
                recommendations[item] += similarity_score * rating

    # Skorlara göre sırala
    sorted_recommendations = sorted(recommendations.items(), key=lambda x: x[1], reverse=True)

    return sorted_recommendations[:n_recommendations]

# User_1 için öneriler
print(recommend_for_user('User_1'))
# [('Keyboard_D', 4.23), ('Mouse_C', 3.87), ('Monitor_E', 2.15)]

Content-Based Filtering

# Content-Based Filtering (ürün özelliklerine göre)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel

# Ürün verileri
products = pd.DataFrame({
    'product_id': ['P1', 'P2', 'P3', 'P4', 'P5'],
    'name': ['ASUS Laptop', 'Dell Laptop', 'Logitech Mouse', 'HP Monitor', 'Apple MacBook'],
    'description': [
        'ASUS gaming laptop 15 inch RTX 4060 Intel i7 Windows',
        'Dell business laptop 14 inch integrated graphics Intel i5 Windows',
        'Logitech wireless mouse ergonomic gaming RGB',
        'HP 27 inch 4K monitor IPS panel USB-C',
        'Apple MacBook Air M2 chip 13 inch macOS lightweight'
    ]
})

# TF-IDF ile metin vektörleştirme
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(products['description'])

# Ürünler arası benzerlik (cosine similarity)
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

print(cosine_sim)
# P1-P2: 0.42 (her ikisi de laptop, benzer)
# P1-P3: 0.15 (laptop vs mouse, az benzer)
# P1-P5: 0.31 (laptop, orta benzer)

# Ürün önerisi
def recommend_similar_products(product_id, n=3):
    idx = products[products['product_id'] == product_id].index[0]

    # Benzerlik skorları
    sim_scores = list(enumerate(cosine_sim[idx]))

    # Kendi hariç sırala
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)[1:n+1]

    # Ürün ID'lerini döndür
    product_indices = [i[0] for i in sim_scores]

    return products.iloc[product_indices][['product_id', 'name']]

# ASUS Laptop için benzer ürünler
print(recommend_similar_products('P1'))
#   product_id            name
# 1         P2     Dell Laptop
# 4         P5  Apple MacBook
# 3         P4      HP Monitor

Matrix Factorization (SVD)

# Singular Value Decomposition (SVD) ile öneri
from scipy.sparse.linalg import svds

# User-item matrisi (0: görülmemiş)
R = user_item_matrix.fillna(0).values

# SVD uygula (k=2: 2 latent faktör)
U, sigma, Vt = svds(R, k=2)

# Sigma'yı diagonal matrise çevir
sigma = np.diag(sigma)

# Tahmin matrisi
predicted_ratings = np.dot(np.dot(U, sigma), Vt)

# DataFrame'e çevir
predicted_df = pd.DataFrame(
    predicted_ratings,
    columns=user_item_matrix.columns,
    index=user_item_matrix.index
)

print(predicted_df)
#         Laptop_A  Laptop_B  Mouse_C  Keyboard_D  Monitor_E
# User_1     4.87      4.23     2.34        3.12        2.56
# User_2     3.98      3.45     2.89        2.67        1.98
# ...

# User_1 için en yüksek tahminli ürünleri öner (daha önce görmediklerinden)
def recommend_svd(user_id, n=3):
    user_row = predicted_df.loc[user_id]
    original_row = user_item_matrix.loc[user_id]

    # Daha önce görülmemiş ürünler
    unseen = original_row[original_row == 0].index

    # Tahmin skorlarına göre sırala
    recommendations = user_row[unseen].sort_values(ascending=False).head(n)

    return recommendations

print(recommend_svd('User_1'))
# Keyboard_D    3.12
# Mouse_C       2.34
# Monitor_E     2.56

SVD Avantajları:

Boyut azaltma: Binlerce ürün → 50-200 latent faktöre indirger
Gürültü filtreleme: Rastgele puanlamaları yok sayar
Hız: Büyük veri setlerinde hızlı
Netflix Prize: SVD bu yarışmayı kazandı

Deep Learning (Neural Collaborative Filtering)

# TensorFlow/Keras ile Neural Collaborative Filtering
import tensorflow as tf
from tensorflow.keras import layers, Model

# Model mimarisi
class RecommenderNet(Model):
    def __init__(self, num_users, num_items, embedding_size=50):
        super(RecommenderNet, self).__init__()

        # User embedding
        self.user_embedding = layers.Embedding(
            num_users,
            embedding_size,
            embeddings_initializer='he_normal',
            embeddings_regularizer=tf.keras.regularizers.l2(1e-6)
        )
        self.user_bias = layers.Embedding(num_users, 1)

        # Item embedding
        self.item_embedding = layers.Embedding(
            num_items,
            embedding_size,
            embeddings_initializer='he_normal',
            embeddings_regularizer=tf.keras.regularizers.l2(1e-6)
        )
        self.item_bias = layers.Embedding(num_items, 1)

    def call(self, inputs):
        user_vector = self.user_embedding(inputs[:, 0])
        user_bias = self.user_bias(inputs[:, 0])
        item_vector = self.item_embedding(inputs[:, 1])
        item_bias = self.item_bias(inputs[:, 1])

        # Dot product + biases
        dot_user_item = tf.reduce_sum(user_vector * item_vector, axis=1, keepdims=True)
        rating = dot_user_item + user_bias + item_bias

        return tf.nn.sigmoid(rating) * 5  # 0-5 arası rating

# Model oluştur
model = RecommenderNet(num_users=1000, num_items=5000, embedding_size=50)

model.compile(
    loss=tf.keras.losses.MeanSquaredError(),
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001)
)

# Eğitim verisi: [user_id, item_id] → rating
# train_data = [[123, 456], [124, 457], ...]  # user-item pairs
# train_labels = [4.5, 3.0, ...]  # ratings

# model.fit(train_data, train_labels, epochs=10, batch_size=64)

# Tahmin
user_id = 123
item_id = 789
predicted_rating = model.predict([[user_id, item_id]])[0][0]
print(f"Predicted rating: {predicted_rating:.2f}/5.0")

Real-World Uygulama

# E-ticaret önerisi: Hybrid yaklaşım
class HybridRecommender:
    def __init__(self):
        self.collaborative_model = None  # Collaborative filtering
        self.content_model = None  # Content-based
        self.trending_products = []  # Popüler ürünler

    def get_recommendations(self, user_id, n=10):
        recommendations = []

        # 1. Collaborative filtering (50% ağırlık)
        if self.collaborative_model:
            collab_recs = self.collaborative_model.recommend(user_id, n=15)
            recommendations.extend([(item, score * 0.5, 'collaborative') for item, score in collab_recs])

        # 2. Content-based (30% ağırlık)
        user_history = get_user_purchase_history(user_id)
        if user_history:
            for product in user_history[-3:]:  # Son 3 ürün
                similar = self.content_model.find_similar(product, n=5)
                recommendations.extend([(item, score * 0.3, 'content') for item, score in similar])

        # 3. Trending/Popular (20% ağırlık - cold start için)
        if len(recommendations) < 5:
            recommendations.extend([(item, 0.2, 'trending') for item in self.trending_products[:5]])

        # 4. Business rules (filtreler)
        recommendations = self.apply_business_rules(user_id, recommendations)

        # 5. Skor toplama ve sıralama
        from collections import defaultdict
        final_scores = defaultdict(float)

        for item, score, source in recommendations:
            final_scores[item] += score

        # En yüksek skorlu N ürün
        sorted_recs = sorted(final_scores.items(), key=lambda x: x[1], reverse=True)

        return sorted_recs[:n]

    def apply_business_rules(self, user_id, recommendations):
        """İş kuralları uygula"""
        filtered = []

        for item, score, source in recommendations:
            # Stokta var mı?
            if not is_in_stock(item):
                continue

            # Kullanıcı daha önce aldı mı?
            if user_purchased_before(user_id, item):
                continue

            # Kategori limiti (aynı kategoriden max 3 ürün)
            category_count = sum(1 for i, _, _ in filtered if get_category(i) == get_category(item))
            if category_count >= 3:
                continue

            filtered.append((item, score, source))

        return filtered

# Kullanım
recommender = HybridRecommender()
recommendations = recommender.get_recommendations(user_id=12345, n=10)

for product_id, score in recommendations:
    print(f"Ürün: {product_id}, Skor: {score:.2f}")

İş Etkileri ve Metrikler

Öneri Sistemi Performansı

+35%
Satış Artışı
+45%
Cross-sell
+28%
Kullanıcı Engagement

Örnek ROI: E-Ticaret

Aylık ziyaretçi: 100K
Conversion rate öncesi: %2 (2K sipariş)
AI öneri sonrası: %2.7 (2.7K sipariş, +%35)
Ortalama sepet: 500 TL
Ek gelir: 700 sipariş × 500 TL = 350K TL/ay
Sistem maliyeti: 80K TL (kurulum) + 15K TL/ay (işletme)
ROI: İlk ayda %319

AI Öneri Sisteminizi Kuralım

Collaborative filtering, content-based, hybrid recommendation sistemleri ile satışlarınızı %35'e kadar artırın.

Demo İste