پیاده سازی سیستم های توصیه گر در پایتون — از صفر تا صد

۳۰۱۸ بازدید
آخرین به‌روزرسانی: ۲۹ مرداد ۱۴۰۲
زمان مطالعه: ۱۷ دقیقه
پیاده سازی سیستم های توصیه گر در پایتون — از صفر تا صد

«سیستم های توصیه گر» (Recommender | Recommendation Systems)، زیر مجموعه‌ای از «سیستم‌های فیلتر اطلاعات» (Information Filtering Systems)  محسوب می‌شوند. هدف سیستم های توصیه گر، پیشنهاد مناسب‌ترین آیتم‌ها (داده، کالا، سرگرمی و سایر موارد) به کاربران است. در سیستم های توصیه گر، داده‌های مرتبط با رفتار کاربران (در خرید کالا، دریافت داده‌ها، تماشای سرگرمی و سایر موارد) تحلیل و مدل‌سازی می‌شوند. سپس، از مدل تولید شده برای پیش‌بینی مناسب‌ترین آیتم برای کاربران استفاده می‌شود. بیشترین استفاده سیستم های توصیه گر، در پیاده‌سازی کاربردهای تجاری (به ویژه، در حوزه محصولات و خدمات مصرفی کاربران) است.

فهرست مطالب این نوشته

افرادی که در شرکت‌های تجاری بزرگ، مدیریت واحدهای بهینه‌سازی تجربه مشتریان و یا استراتژی محصولات تجاری را بر عهده دارند، بدون شک از سیستم‌های توصیه‌گر محصولات، برای ارتقاء یا بهبود تجربه خرید مشتریان خود استفاده می‌کنند. امروزه، یکپارچه‌سازی سیستم های توصیه گر محصولات و خدمات با استراتژی‌های تولید یا عرضه محصولات، به یکی از استانداردهای سازمان‌ها و شرکت‌های تجاری بزرگ و چند ملیتی، برای پیشی گرفتن از رقبا تبدیل شده است. این شرکت‌ها، از سیستم های توصیه گر محصولات و خدمات برای «شخصی‌سازی» (Personalizing) محتوا و محصولات قابل پیشنهاد به کاربران استفاده می‌کنند.

سیستم های توصیه گر، یکی از شایع‌ترین و قابل فهم‌ترین کاربردهای «کلان داده» (Big Data)، «هوش مصنوعی» (Artificial Intelligence) و «یادگیری ماشین» (Machine Learning) محسوب می‌شوند. سیستم های توصیه گر در حوزه‌های مختلفی قابل استفاده هستند. از این دسته از سیستم‌ها، برای تولید «لیست پخش» (Playlist) در سرویس‌های فیلم و موسیقی نظیر «نتفلیکس» (Netflix) و «یوتیوب» (YouTube) استفاده می‌شود. همچنین، در سرویس‌هایی نظیر آمازون، برای پیشنهاد محصولات به کاربران و در پلتفرم‌هایی نظیر شبکه‌های اجتماعی، برای پیشنهاد محتوا به کاربران مورد استفاده قرار می‌گیرند. در این مطلب، یک سیستم توصیه‌گر، برای پیشنهاد کردن آیتم‌ها و کالاهای خرید به کاربران پیاده‌سازی می‌شود.

سیستم های توصیه گر (Recommender systems)

چالش‌های پیاده‌سازی سیستم های توصیه گر

با یک جستجوی ساده در اینترنت در می‌یابید که روش‌های مختلفی برای پیاده‌سازی سیستم های توصیه گر مبتنی بر «داده‌های رتبه‌بندی» (Rating Data) نظیر موسیقی و فیلم وجود دارد. مشکل بزرگی که سیستم های توصیه گر مبتنی بر داده‌های رتبه‌بندی دارند این است که مدل‌های تولید شده را نمی‌توان برای استفاده در دیگر دامنه‌های کاربردی تعمیم داد؛ به ویژه، زمانی که داده‌های این دامنه‌های کاربردی، «مقیاس‌نشده» (Non-Scaled Data) باشند.

داده‌هایی نظیر «داده‌های فراوانی» (Frequency Data) و «داده‌های خرید» (Purchase Data)، مقیاس نشده هستند. به عنوان نمونه، داده‌های رتبه‌بندی در سرویس‌های نظیر آمازون یا نتفلیکس، مقادیری بین (0 تا 5) یا (0 تا 10) هستند (امتیاز کاربران به کالا یا یک محصول سرگرمی)؛ با این حال، داده‌های خرید، پیوسته و بدون «حد بالا» (Upper Bound) هستند.

مشکل دیگر برخی از سیستم های توصیه گر تحت وب این است که بدون ارزیابی مدل توصیه‌گر، پیشنهادهای تولید شده توسط سیستم را به کاربران ارائه می‌دهند. برای بسیاری از «مهندسان و دانشمندان داده» (Data Engineers and Scientists)، پیاده‌سازی سیستم های توصیه گر با استفاده از میلیون‌ها داده، بدون ارزیابی مدل، کاری بسیار خطرناک است. همچنین، پیاده‌سازی سیستم های توصیه گر با هدف عرضه یا بهبود محصولات و عدم ارزیابی عملکرد آن‌ها در شرایط جهان واقعی، بدون شک منجر به شکست خواهد شد.

اهداف پیاده‌سازی سیستم های توصیه گر

در این مطلب، سعی شده است تا تعدادی سیستم های توصیه گر برای داده‌های خرید پیاده‌ساری شوند. سیستم‌های پیاده‌سازی شده روی داده‌های مقیاس‌نشده آموزش می‌بینند. همچنین، سیستم های توصیه گر پیاده‌سازی شده ارزیابی می‌شوند تا عملکرد بهینه آن‌ها در کاربردهای «جهان واقعی» (Real-Time) تضمین و بهترین مدل از بین آن‌ها انتخاب شود. در نهایت از مدل آموزش دیده، برای پیشنهاد کردن محصولات و آیتم‌های خرید جدید به کاربران استفاده می‌شود.

در این مطلب، از مدل «سیستم های توصیه گر مشارکتی» (Collaborative Recommender Systems) برای پیشنهاد محصولات جدید به کاربران و شخصی‌سازی تجربه خرید آن‌ها استفاده می‌شود. همچنین، پیاده‌سازی گام به گام و با جزئیات این روش در زبان برنامه‌نویسی پایتون و بسته نرم‌افزاری یادگیری ماشین (Turicreate) پوشش داده خواهد شد. گام‌های مورد نیاز برای پیاده‌سازی روش پیشنهادی عبارتند از:

  • «تبدیل» (Transformation) و «نرمال‌سازی» (Normalization) داده‌ها.
  • «آموزش» (Training) مدل‌های توصیه‌گر پیاده‌سازی شده.
  • «ارزیابی» (Evaluation) عملکرد مدل‌های آموزش دیده.
  • انتخاب مدل بهینه از میان مدل‌های پیاده‌سازی شده.

بررسی اجمالی سناریوی خرید محصول

یک فروشگاه زنجیره‌ای عرضه محصولات را فرض کنید. این فروشگاه زنجیره‌ه‌ای، یک نرم‌افزار همراه جدید عرضه کرده است که به مشتریان خود اجازه می‌دهد بدون نیاز به حضور فیزیکی در فروشگاه، محصولات مورد نیاز خود را انتخاب و سفارش دهند. در چنین سناریویی، امکان استفاده از سیستم های توصیه گر محصولات وجود دارد.

به عبارت دیگر، نرم‌افزار همراه می‌تواند هنگامی که مشتریان، صفحه «سفارشات» (Orders) را باز می‌کنند، 10 محصول مشابه با سبد خرید آن‌ها را انتخاب و به آن‌ها پیشنهاد دهد. کاربران می‌توانند با انتخاب محصولات مشابه، اقلامی را که مورد علاقه آن‌ها است به سبد خرید اضافه کند. همچنین، این امکان برای کاربران فراهم شده است تا لیست پیشنهادات تولید شده بر مبنای تراکنش‌های (خرید) یک کاربر خاص را جستجو و مشاهده کنند. در چنین حالتی:

  • ورودی مسأله: «شناسه کاربری مشتری» (Customer ID)
  • خروجی مسأله: لیست رتبه‌بندی شده از محصولاتی (Product IDs) که به احتمال زیاد، کاربران تمایل دارند به سبد خرید خود اضافه کنند.

سیستم های توصیه گر (Recommender systems)

پیاده‌سازی سیستم های توصیه گر خرید به مشتریان

در این بخش، مراحل گام به گام برای پیاده‌سازی یک سیستم توصیه‌گر، با جزئیات کامل شرح داده می‌شود.

وارد کردن بسته‌های نرم‌افزاری لازم برای پیاده‌سازی سیستم‌ توصیه‌گر در پایتون

برای پیاده‌سازی سیستم های توصیه گر خرید در زبان برنامه‌نویسی پایتون، از چهار بسته نرم‌افزاری مهم استفاده شده است. این بسته‌ها عبارتند از:

  • بسته‌های نرم‌افزاری pandas و numpy: از این بسته‌ها، برای «دست‌کاری عددی داده‌ها» (Numerical Data Manipulation) استفاده می‌شود.
  • بسته نرم‌افزاری turicreate: برای انتخاب مدل یادگیری مناسب برای پیاده‌سازی سیستم های توصیه گر و ارزیابی آن‌ها، از این بسته استفاده می‌شود.
  • بسته نرم‌افزاری sklearn: از این بسته، برای تقسیم کردن داده‌ها به دو مجموعه «آموزش» (Train) و «تست» (Test) استفاده می‌شود.

با استفاده از قطعه کد زیر، بسته‌های ذکر شده در زبان برنامه‌نویسی پایتون، بارگیری و آماده استفاده می‌شوند:

1%load_ext autoreload
2%autoreload 2
3
4import pandas as pd
5import numpy as np
6import time
7import turicreate as tc
8from sklearn.cross_validation import train_test_split
9
10import sys
11sys.path.append("..")

بارگیری داده‌های لازم برای آموزش و تست سیستم های توصیه گر

برای پیاده‌سازی سیستم های توصیه گر، از دو مجموعه داده با فرمت ساختاری (CSV.) استفاده می‌شود. مجموعه داده‌های استفاده شده در این مطلب، از طریق این لینک یا این مخزن گیت‌هاب [+] قابل بارگیری هستند. مشخصات این مجموعه داده‌ها به شکل زیر هستند.

  • مجموعه داده recommend_1.csv: این مجموعه داده، لیستی متشکل از تعداد 1000 شناسه مشتری را شامل می‌شود. از این لیست، برای نمایش پیشنهادات تولید شده بر مبنای تراکنش‌های (خرید) یک کاربر، با شماره مشتری خاص استفاده می‌شود (customers).
  • مجموعه داده trx_data.csv: این مجموعه داده، تراکنش‌های کاربری (محصولات خریداری شده) را شامل می‌شود (transactions).

با استفاده از قطعه کد زیر، مجموعه داده‌های ذکر شده در زبان برنامه‌نویسی پایتون، بارگیری می‌شوند:

1customers = pd.read_csv('../data/recommend_1.csv') 
2transactions = pd.read_csv('../data/trx_data.csv')

با استفاده از قطعه کدهای زیر، ساختار مجموعه داده‌های ذکر شده نمایش داده می‌شوند:

1print(customers.shape)
2customers.head()

سیستم های توصیه گر (Recommender systems)

1print(transactions.shape)
2transactions.head()

سیستم های توصیه گر (Recommender systems)

آماده‌سازی داده‌ها

در این بخش، داده‌های نمایش داده شده در بخش قبل به گونه‌ای مرتب‌سازی می‌شوند که در آن‌ها، لیست آیتم‌های (خریدهای) موجود در ستون products مجموعه داده transactions، به تعدادی سطر شکسته می‌شوند؛ به طوری که هر سطر جدیدِ تولید شده، «شماره شناسه مشتری» (customerId)، «شناسه محصول خریداری شده» (productId) و «تعداد دفعات خرید محصول» (purchase_count) توسط کاربر را شامل خواهد شد. به عبارت دیگر، یک مجموعه داده‌ای جدید، با سه دسته اطلاعات (شماره شناسه مشتری، شناسه محصول خریداری و تعداد دفعات خرید محصول) تولید می‌شود. این مجموعه داده، مجموعه داده «اصلی» (Main) نامیده می‌شود. با استفاده از قطعه کد زیر، مجموعه داده transactions، به مجموعه داده اصلی تبدیل می‌شود:

1data = pd.melt(transactions.set_index('customerId')['products'].apply(pd.Series).reset_index(), 
2             id_vars=['customerId'],
3             value_name='products') \
4    .dropna().drop(['variable'], axis=1) \
5    .groupby(['customerId', 'products']) \
6    .agg({'products': 'count'}) \
7    .rename(columns={'products': 'purchase_count'}) \
8    .reset_index() \
9    .rename(columns={'products': 'productId'})
10data['productId'] = data['productId'].astype(np.int64)

با استفاده از قطعه کد زیر، ساختارِ مجموعه داده اصلی نمایش داده می‌شود:

1print(data.shape)
2data.head()

سیستم های توصیه گر (Recommender systems)

در ادامه، علاوه بر مجموعه داده اصلی، دو مجموعه داده دیگر نیز تولید می‌شوند. هدف از تولید این دو مجموعه داده، مقایسه عملکرد سیستم روی نمایش‌های مختلف تولید شده از داده‌های خرید است. مشخصات این دو مجموعه داده به شرح زیر است:

  1. مجموعه داده جایگزین: این مجموعه داده، ساختاری شبیه به مجموعه داده اصلی دارد؛ با این تفاوت که، مقادیر موجود در ستون «تعداد دفعات خرید محصول»، با عدد 1 جایگزین می‌شوند (در مجموعه داده جایگزین، نام ستون purchase_count به purchase_dummy تغییر پیدا می‌کند). این مجموعه داده، تنها خریدن یک محصول توسط کاربران را نمایش می‌دهد و نه تعداد دفعات خرید.
  2. مجموعه داده اصلی نرمال‌سازی شده: این مجموعه داده نیز، ساختاری شبیه به مجموعه داده اصلی دارد؛ با این تفاوت که، در ستون « تعداد دفعات خرید محصول» به جای تعداد واقعی دفعات خرید، مقدار نرمال شده تعداد دفعات خرید (مقداری بین 0 و 1) جایگزین می‌شود (در مجموعه داده اصلی نرمال شده، نام ستون purchase_count به scaled_purchase_freq تغییر پیدا می‌کند). به عبارت دیگر، نمونه‌ها بر اساس تعداد دفعات خرید، نرمال‌سازی می‌شوند.

تولید مجموعه داده جایگزین

در مجموعه داده جایگزین، تنها خریداری شدن یا نشدن یک محصول لحاظ می‌شود و نه تعداد دفعات خرید آن. یکی از دلایل ایجاد این مجموعه داده، مشاهدات انجام شده از رفتار خرید مشتریان است. این مشاهدات نشان می‌دهند «مشتریانی که یک محصول یکسان را (به تعداد دفعات متفاوت) خرید می‌کنند، ممکن است سلیقه خرید یکسانی داشته باشند». با استفاده از قطعه کد زیر، مجموعه داده جایگزین تولید می‌شود:

1def create_data_dummy(data):
2    data_dummy = data.copy()
3    data_dummy['purchase_dummy'] = 1
4    return data_dummy
5data_dummy = create_data_dummy(data)

تولید مجموعه داده اصلی نرمال‌سازی شده

برای نرمال‌سازی مقادیر موجود در ستون purchase_count به ازاء تمامی مشتریان، ابتدا لازم است تا ماتریس user-item با استفاده از مجموعه داده اصلی ساخته شود.

1df_matrix = pd.pivot_table(data, values='purchase_count', index='customerId', columns='productId')

سیستم های توصیه گر (Recommender systems)

1df_matrix_norm = (df_matrix-df_matrix.min())/(df_matrix.max()-df_matrix.min())

سیستم های توصیه گر (Recommender systems)

1# create a table for input to the modeling  
2d = df_matrix_norm.reset_index() 
3d.index.names = ['scaled_purchase_freq'] 
4data_norm = pd.melt(d, id_vars=['customerId'], value_name='scaled_purchase_freq').dropna()
5print(data_norm.shape)
6data_norm.head()

سیستم های توصیه گر (Recommender systems)

گام‌های بالا (برای تولید ماتریس user-item) را می‌توان توسط تابعی به شکل زیر با هم ترکیب کرد.

1def normalize_data(data):
2    df_matrix = pd.pivot_table(data, values='purchase_count', index='customerId', columns='productId')
3    df_matrix_norm = (df_matrix-df_matrix.min())/(df_matrix.max()-df_matrix.min())
4    d = df_matrix_norm.reset_index()
5    d.index.names = ['scaled_purchase_freq']
6    return pd.melt(d, id_vars=['customerId'], value_name='scaled_purchase_freq').dropna()

در این بخش، مقادیر موجود در ستون purchase_count، توسط مقادیری بین 0 تا 1 نرمال‌سازی می‌شوند (مقدار یک، بیانگر بیشترین تعداد دفعات خرید برای یک آیتم و مقدار صفر نیز، بیانگر تعداد دفعات خرید برابر صفر برای آن آیتم است).

در این مطلب، مجموعه داده اصلی با نام (purchase_count)، مجموعه داده جایگزین با نام (purchase_dummy) و مجموعه داده اصلی نرمال‌سازی شده با نام (scaled_purchase_count) نیز شناخته می‌شوند.

تقسیم‌بندی سه مجموعه داده تولید شده به مجموعه داده‌های آموزشی و تست

تقسیم‌بندی داده‌ها به دو دسته آموزشی و تست، یکی از مهم‌ترین گام‌های ارزیابی یک «مدل پیش‌بینی» (Predicting Model) محسوب می‌شود. معمولا بخش بزرگتری از مجموعه داده برای آموزش مدل و بخش کوچکتر باقی‌مانده برای تست آن مورد استفاده قرار می‌گیرد. در این مطلب، 80 درصد داده‌ها برای آموزش سیستم توصیه‌گر و 20 درصد باقی‌مانده، برای تست آن به کار می‌روند. از داده‌های آموزشی برای آموزش مدل پیش‌بینی و از داده‌های تست برای ارزیابی عملکرد مدل استفاده می‌شود. با استفاده از قطعه کد زیر، تابع لازم برای تقسیم‌بندی داده‌ها تعریف می‌شود:

1def split_data(data):
2    '''
3    Splits dataset into training and test set.
4    
5    Args:
6        data (pandas.DataFrame)
7        
8    Returns
9        train_data (tc.SFrame)
10        test_data (tc.SFrame)
11    '''
12    train, test = train_test_split(data, test_size = .2)
13    train_data = tc.SFrame(train)
14    test_data = tc.SFrame(test)
15    return train_data, test_data

پس از تعریف تابع بالا، از طریق قطعه کد زیر می‌توان هر کدام از مجموعه داده‌های «اصلی»، «جایگزین» و «اصلی نرمال‌سازی شده» را به دو دسته آموزشی و تست تقسیم‌بندی کرد.

1train_data, test_data = split_data(data)
2train_data_dummy, test_data_dummy = split_data(data_dummy)
3train_data_norm, test_data_norm = split_data(data_norm)

تعریف مدل پیش‌بینی برای سیستم های توصیه گر با استفاده از بسته Turicreate

پیش از اینکه روش‌های توصیه‌گر پیشرفته نظیر توصیه‌گیر مشارکتی را برای پیشنهاد آیتم به مشتریان پیاده‌سازی کنیم، بهتر است که مدل «پایه» یا «خط مبنا» (Baseline) پیاده‌سازی کنیم تا بتوانیم عملکرد سیستم توصیه‌گر پیشرفته را با مدل پایه مقایسه کنیم. در این بخش، دو دسته مدل توصیه گر پیاده‌سازی شده‌اند:

  • مدل توصیه‌گر پایه به نام «مدل محبوبیت» (Popularity Model)
  • سیستم توصیه‌گر پیشرفته به نام «توصیه‌گیر مشارکتی» (Collaborative Recommender)

پیش از پیاده‌سازی سیستم های توصیه گر ذکر شده، متغیرهای لازم برای پیاده‌سازی آن‌ها از طریق قطعه کد زیر تعریف می‌شوند:

1# constant variables to define field names include:
2user_id = 'customerId'
3item_id = 'productId'
4users_to_recommend = list(customers[user_id])
5n_rec = 10 # number of items to recommend
6n_display = 30 # to display the first few rows in an output dataset

ویژگی مهم بسته Turicreate در زبان پایتون، سادگی تعریف مدل‌های یادگیری لازم برای پیاده‌سازی سیستم های توصیه گر است. با استفاده از تابع زیر، روش‌های توصیه‌گر پایه و پیشرفته، پیاده‌سازی و فراخوانی می‌شوند.

1def model(train_data, name, user_id, item_id, target, users_to_recommend, n_rec, n_display):
2    if name == 'popularity':
3        model = tc.popularity_recommender.create(train_data, 
4                                                    user_id=user_id, 
5                                                    item_id=item_id, 
6                                                    target=target)
7    elif name == 'cosine':
8        model = tc.item_similarity_recommender.create(train_data, 
9                                                    user_id=user_id, 
10                                                    item_id=item_id, 
11                                                    target=target, 
12                                                    similarity_type='cosine')
13elif name == 'pearson':
14        model = tc.item_similarity_recommender.create(train_data, 
15                                                    user_id=user_id, 
16                                                    item_id=item_id, 
17                                                    target=target, 
18                                                    similarity_type='pearson')
19        
20    recom = model.recommend(users=users_to_recommend, k=n_rec)
21    recom.print_rows(n_display)
22    return model

 پیاده‌سازی و آموزش «مدل محبوبیت» به عنوان توصیه‌گر پایه

مدل محبوبیت از محبوب‌ترین آیتم‌ها (محصولات) در بین مشتریان، برای پیشنهاد دادن آیتم‌های جدید به مشتریان استفاده می‌کند. این آیتم‌ها، پر فروش‌ترین محصولات در بین تمامی مشتریان ثبت شده در سیستم هستند. برای آموزش مدل محبوبیت، از داده‌های آموزشی در مجموعه داده‌های «اصلی»، «جایگزین» و «اصلی نرمال‌سازی شده» استفاده می‌شود.

آموزش مدل محبوبیت با استفاده از مجموعه داده «اصلی»:

1name = 'popularity'
2target = 'purchase_count'
3popularity = model(train_data, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

آموزش مدل محبوبیت با استفاده از مجموعه داده «جایگزین»:

1name = 'popularity'
2target = 'purchase_dummy'
3pop_dummy = model(train_data_dummy, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

آموزش مدل محبوبیت با استفاده از مجموعه داده «اصلی نرمال‌سازی شده»:

1name = 'popularity'
2target = 'scaled_purchase_freq'
3pop_norm = model(train_data_norm, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

نتایج به دست آمده برای مدل محبوبیت

  • پس از تولید مدل‌ها، آیتم‌های پیشنهادی با استفاده از امتیازات به دست آمده از مدل محبوبیت، پیش‌بینی می‌شوند. همان طور که در جداول بالا مشهود است، به ازاری هر کدام از 1000 مشتری موجود در مجموعه داده‌ها، 10 آیتم پیشنهادی، به ترتیب نزولی و به همراه امتیاز آن‌ها پیش‌بینی شده است (در جداول بالا، پیش‌بینی‌های انجام شده برای سه کاربر با شناسه 1533، 20400 و 19750 نمایش داده شده است).
  • در نتایج تولید شده، مدل‌های آموزش دیده شده روی مجموعه داده‌های مختلف، آیتم‌های متفاوتی را به کاربران پیشنهاد می‌کنند ولی در هر مدل، آیتم‌های پیشنهاد داده شده به همه کاربران یکسان است. دلیل این امر این است که مدل محبوبیت، از محبوب‌ترین آیتم‌ها (محصولات) در بین مشتریان، برای پیشنهاد دادن آیتم‌ها به همه کاربران استفاده می‌کند.

پیاده‌سازی و آموزش «مدل توصیه‌گر مشارکتی»

در سیستم‌های فیلتر مشارکتی اطلاعات، آیتم‌ها بر اساس اینکه مشتریان مشابه، چه آیتم‌هایی (محصولات) را خریداری می‌کنند، پیشنهاد می‌شوند. فرض کنید مشتری 1 و مشتری 2 محصولات مشابهی خریداری کرده باشند؛ به عنوان نمونه، مشتری 1، آیتم‌های x و y و z را خریداری و مشتری 2، آیتم‌های x و y. در چنین حالتی، سیستم توصیه‌گر مشارکتی، آیتم z را به مشتری دوم نیز پیشنهاد می‌دهد.

روش توصیه‌گر مشارکتی

برای تعریف مشابهت میان کاربران، مراحل زیر طی می‌شوند:

  • ابتدا یک ماتریس user-item تولید می‌شود. در این ماتریس، مقادیر اندیس‌ها (سطرها)، شناسه‌های یکتای مشتریان و مقادیر ستون‌ها، شناسه یکتای محصولات را نمایش می‌دهند.
  • در مرحله بعد، ماتریس «شباهت آیتم به آیتم» (Item-to-Item Similarity) محاسبه می‌شود. هدف اصلی تولید این ماتریس، مشخص کردن میزان شباهت یک محصول به محصول دیگر است. برای محاسبه شباهت میان محصولات، می‌توان از روش‌هایی نظیر «شباهت کسینوسی» (Cosine Similarity) و «همبستگی پیرسون» (Pearson Correlation) استفاده کرد.
    1. برای محاسبه شباهت میان محصولات X و Y، تمامی مشتریانی که محصولات X و Y را خریداری کرده‌اند مشخص می‌شوند. فرض کنید مشتری 1 و 2، هر دو این محصولات را خریداری کرده باشند.
    2. سپس، دو «بردار آیتم» (Item-Vector) به نام‌های V1 و V2 در «فضای کاربری» (User Space) مشتری (1 و 2) تولید می‌شود. مشابهت/همبستگی میان این دو بردار، از طریق روش مشابهت کسینوسی و یا همبستگی پیرسون محاسبه می‌شود (هر چه مقدار محاسبه شده به 1 نزدیک‌تر باشد، مشابهت دو بردار بیشتر است).
  • سپس، به ازاء هر مشتری، احتمال خریدن یک محصول (و یا تعداد دفعات احتمالی خرید)، برای تمامی محصولاتی که مشتری خریداری نکرده است، محاسبه می‌شود.

مدل توصیه‌گر مشارکتی مبتنی بر مشابهت کسینوسی

در این روش، مشابهت میان دو بردار از طریق محاسبه کسینوس زاویه بین بردار متناظر با آیتم A و B به دست می‌آید. مشابهت کسینوسی از طریق رابطه زیر به دست می‌آید:

$$similarity=cos(\theta)=\frac{A\cdot B}{\parallel A \parallel \; \parallel B \parallel}=\frac{\sum_{i=1}^n A_{i} B_{i}}{\sqrt{\sum_{i=1}^n A_i^2} \sqrt{\sum_{i=1}^n B_i^2}}$$

هر چقدر که دو بردار در فضای کاربری به هم نزدیک‌تر باشند، زاویه میان آن‌ها کمتر و در نتیجه، مشابهت کسینوسی آن‌ها بیشتر می‌شود. برای آموزش مدل توصیه‌گر مشارکتی مبتنی بر مشابهت کسینوسی، از مجموعه آموزشی در مجموعه داده‌های «اصلی»، «جایگزین» و «اصلی نرمال شده» استفاده می‌شود.

آموزش مدل توصیه‌گر مشارکتی مبتنی بر مشابهت کسینوسی با استفاده از مجموعه داده «اصلی»:

1name = 'cosine'
2target = 'purchase_count'
3cos = model(train_data, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

آموزش مدل توصیه‌گر مشارکتی مبتنی بر مشابهت کسینوسی با استفاده از مجموعه داده «جایگزین»:

1name = 'cosine'
2target = 'purchase_dummy'
3cos_dummy = model(train_data_dummy, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

آموزش مدل توصیه‌گر مشارکتی مبتنی بر مشابهت کسینوسی با استفاده از مجموعه داده «اصلی نرمال‌سازی شده»:

1name = 'cosine' 
2target = 'scaled_purchase_freq' 
3cos_norm = model(train_data_norm, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

مدل توصیه‌گر مشارکتی مبتنی بر همبستگی پیرسون

در این روش، مشابهت میان دو بردار از طریق محاسبه «ضریب پیرسون» (Pearson Coefficient) میان دو بردار به‌دست می‌آید. همبستگی پیرسون از طریق رابطه زیر به دست می‌آید:

$$Peaeson=\frac{\sum_{i=1}^n (x_{i} -\overline{x}) (y_{i} -\overline{y})}{\sqrt{\sum_{i=1}^n (x_{i} -\overline{x})^{2}\sum_{i=1}^n (y_{i} -\overline{y})^{2}}}$$

برای آموزش مدل توصیه‌گر مشارکتی مبتنی بر همبستگی پیرسون، از مجموعه آموزشی در مجموعه داده‌های «اصلی»، «جایگزین» و «اصلی نرمال شده» استفاده می‌شود.

آموزش مدل توصیه‌گر مشارکتی مبتنی بر همبستگی پیرسون با استفاده از مجموعه داده «اصلی»:

1name = 'pearson'
2target = 'purchase_count'
3pear = model(train_data, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

آموزش مدل توصیه‌گر مشارکتی مبتنی بر همبستگی پیرسون با استفاده از مجموعه داده «جایگزین»:

1name = 'pearson'
2target = 'purchase_dummy'
3pear_dummy = model(train_data_dummy, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

آموزش مدل توصیه‌گر مشارکتی مبتنی بر همبستگی پیرسون با استفاده از مجموعه داده «اصلی نرمال‌سازی شده»:

1name = 'pearson'
2target = 'scaled_purchase_freq'
3pear_norm = model(train_data_norm, name, user_id, item_id, target, users_to_recommend, n_rec, n_display)

سیستم های توصیه گر (Recommender systems)

ارزیابی سیستم های توصیه گر پیاده‌سازی شده

برای ارزیابی عملکرد سیستم های توصیه گر پیاده‌سازی شده، از معیارهایی نظیر «خطای ریشه میانگین مربع‌ها» (Root Mean Squared Errors)، «دقت» (Precision) و «صحت» (Recall) استفاده می‌شود.

معیار خطای ریشه میانگین مربع‌ها

این معیار، خطای مقادیر پیش‌بینی شده را محاسبه می‌کند. هر چه قدر مقدار خطای ریشه میانگین مربع‌ها کمتر باشد، پیش‌بینی‌های تولید شده بهتر خواهند بود.

معیار صحت

این معیار مشخص می‌کند که چند درصد از محصولاتی که مشتری خریداری می‌کند، در واقع به او پیشنهاد شده است. به عنوان نمونه، اگر مشتری 5 محصول را خریداری کند و سیستم توصیه‌گر، سه عدد از این محصولات را به او پیشنهاد داده باشد، میزان صحت این سیستم برابر 0٫6 خواهد بود.

معیار دقت

این معیار مشخص می‌کند که از بین تمامی محصولات پیشنهاد شده، چه تعدادی از آن‌ها مورد علاقه مشتری بوده است. به عنوان نمونه، اگر پنج محصول به مشتری پیشنهاد شوند و او، چهار عدد از این محصولات را خریداری کند، میزان دقت سیستم برابر 0٫۸ خواهد بود.

ابتدا، متغیرهای لازم برای ارزیابی مدل‌های توصیه‌گر پیاده‌سازی شده از طریق قطعه کد زیر تعریف می‌شوند:

1models_w_counts = [popularity_model, cos, pear]
2models_w_dummy = [pop_dummy, cos_dummy, pear_dummy]
3models_w_norm = [pop_norm, cos_norm, pear_norm]
4names_w_counts = ['Popularity Model on Purchase Counts', 'Cosine Similarity on Purchase Counts', 'Pearson Similarity on Purchase Counts']
5names_w_dummy = ['Popularity Model on Purchase Dummy', 'Cosine Similarity on Purchase Dummy', 'Pearson Similarity on Purchase Dummy']
6names_w_norm = ['Popularity Model on Scaled Purchase Counts', 'Cosine Similarity on Scaled Purchase Counts', 'Pearson Similarity on Scaled Purchase Counts']

با استفاده از قطعه کد زیر، عملکرد سیستم های توصیه گر پیاده‌سازی شده ارزیابی و با یکدیگر مقایسه می‌شوند:

1eval_counts = tc.recommender.util.compare_models(test_data, models_w_counts, model_names=names_w_counts)
2eval_dummy = tc.recommender.util.compare_models(test_data_dummy, models_w_dummy, model_names=names_w_dummy)
3eval_norm = tc.recommender.util.compare_models(test_data_norm, models_w_norm, model_names=names_w_norm)

نتایج ارزیابی عملکرد روش‌های توصیه‌گر پیاده‌سازی شده

  • ارزیابی عملکرد با توجه به معیار خطای ریشه میانگین مربع‌ها

سیستم های توصیه گر (Recommender systems)

  • ارزیابی عملکرد با توجه به معیارهای دقت و صحت
برای مشاهده اندازه بزرگ‌تر این تصویر، روی آن کلیک کنید.

نتایج به دست آمده از ارزیابی

  •  ارزیابی نتایج «مدل محبوبیت» در برابر مدل‌های «توصیه‌گر مشارکتی»: همان‌طور که در نتایج بالا قابل مشاهده است، مدل‌های توصیه‌گر مشارکتی، نتایج بهتری نسبت به مدل محبوبیت روی داده‌های مجموعه داده «اصلی» تولید کرده‌اند. نکته مهم در مورد نتایج تولید شده این است که مدل محبوبیت، نتایج شخصی‌سازی شده در اختیار کاربران قرار نمی‌دهد و یک لیست از آیتم‌های پیشنهادی را در اختیار تمامی کاربران قرار می‌دهد.
  • ارزیابی نتایج بر مبنای معیار دقت و صحت: با توجه به نتایج به دست آمده، می‌توان دریافت که داده‌های موجود در مجموعه داده «جایگزین»، سبب تولید آیتم‌های پیشنهادی بهتری نسبت به دیگر داده‌ها می‌شوند. همچنین، میزان خطای ریشه میانگین مربع‌ها در مدل‌های آموزش دیده روی مجموعه داده‌های «اصلی»، «جایگزین» و «اصلی نرمال شده»، تقریبا برابر است.
  • ارزیابی نتایج بر مبنای معیار خطای ریشه میانگین مربع‌ها: با توجه به نتایج نمایش داده شده، از آنجایی که میزان خطای ریشه میانگین مربع‌ها، در روش توصیه‌گیر مشارکتی مبتنی بر همبستگی پیرسون بالاتر از روش مبتنی بر شباهت کسینوسی است، در نتیجه، مدل نهایی توصیه‌گر، مدل مبتنی بر شباهت کسینوسی خواهد بود.

در نهایت، مدل توصیه‌گر مشارکتی مبتنی بر شباهت کسینوسی که روی مجموعه داده «جایگزین» آموزش دیده است، به عنوان مدل نهایی برای تولید آیتم‌های پیشنهادی به مشتریان انتخاب می‌شود.

مدل توصیه‌گر نهایی

در انتها، دو تابع دیگر معرفی خواهد شد؛ یکی از این توابع، وظیفه تولید خروجی‌های سیستم توصیه‌گر در قالب فایل (CSV.) و دیگری، وظیفه نمایش لیست پیشنهادات تولید شده بر مبنای تراکنش‌های (خرید) یک کاربر خاص را دارد. در ابتدا لازم است تا مدل انتخابی، با استفاده از داده‌های آموزشی مجموعه داده «جایگزین» آموزش ببیند. سپس، مدل آموزش دیده روی داده‌های تست ارزیابی شود.

1final_model = tc.item_similarity_recommender.create(tc.SFrame(data_norm), 
2                                            user_id=user_id, 
3                                            item_id=item_id, 
4                                            target='purchase_dummy', similarity_type='cosine')
5recom = final_model.recommend(users=users_to_recommend, k=n_rec)
6recom.print_rows(n_display)

تولید خروجی‌های سیستم توصیه‌گر در قالب فایل (CSV.)

ابتدا، فرمت کنونی خروجی سیستم پیشنهادی با استفاده از کد زیر نمایش داده می‌شود.

1df_rec = recom.to_dataframe()
2print(df_rec.shape)
3df_rec.head()

سیستم های توصیه گر (Recommender systems)

سپس، از تابع زیر برای تولید خروجی مطلوب در قالب فایل (CSV.) استفاده می‌شود.

1def create_output(model, users_to_recommend, n_rec, print_csv=True):
2    recomendation = model.recommend(users=users_to_recommend, k=n_rec)
3    df_rec = recomendation.to_dataframe()
4    df_rec['recommendedProducts'] = df_rec.groupby([user_id])[item_id] \
5        .transform(lambda x: '|'.join(x.astype(str)))
6    df_output = df_rec[['customerId', 'recommendedProducts']].drop_duplicates() \
7        .sort_values('customerId').set_index('customerId')
8    if print_csv:
9        df_output.to_csv('../output/option1_recommendation.csv')
10        print("An output file can be found in 'output' folder with name 'option1_recommendation.csv'")
11    return df_output

با فراخوانی تابع بالا و برابر با True کردن مقدار پارامتر print_csv، خروجی مدل توصیه‌گر پیشنهادی در قالب فایل (CSV.) ذخیره خواهد شد.

1df_output = create_output(pear_norm, users_to_recommend, n_rec, print_csv=True)
2print(df_output.shape)
3df_output.head()

سیستم های توصیه گر (Recommender systems)

تابع تولید پیشنهاد برای مشتریان با استفاده از شناسه یکتا آن‌ها

در نهایت، با استفاده از تابع زیر و با داشتن شماره شناسه یکتای مشتریان، لیستی از آیتم‌های پیشنهادی برای مشتریان تولید و در خروجی نمایش داده می‌شوند.

1def customer_recomendation(customer_id):
2    if customer_id not in df_output.index:
3        print('Customer not found.')
4        return customer_id
5    return df_output.loc[customer_id]
1customer_recommendation(4)

سیستم های توصیه گر (Recommender systems)

1customer_recommendation(21)

سیستم های توصیه گر (Recommender systems)

کدهای جایگزین برای پیاده‌سازی مدل توصیه‌گر مشارکتی مبتنی بر شباهت کسینوسی (آموزش دیده روی مجموعه داده «جایگزین») در ادامه آمده است. این کد، با کدهای ارائه شده در این مطلب تفاوت دارند. در این کد، از بسته Turicreate، برای پیاده‌سازی و ارزیابی مدل توصیه‌گر پیشنهادی استفاده نشده است. شایان توجه است که کدهای ارائه شده در مطلب (کدهایی که از بسته Turicreate استفاده کرده‌اند)، بهینه‌تر و سریع‌تر از این کد هستند.

1# Formation data challenge
2# Moorissa Tjokro
3
4# This is an additional python scripts I used for developing recommendation model
5# Notebook uses the turicreate library for a more efficient evaluation approach
6
7import pandas as pd
8import numpy as np
9from collections import Counter
10from scipy.spatial.distance import cosine
11
12class Formation:
13    def __init__(self, input_file, customer_file, output_file, csv_output=True):
14
15        self.input_file = input_file
16        self.customer_file = customer_file
17        self.output_file = output_file
18        self.csv_output = True
19        self.n_recommendations = 10
20        self.n_neighbors = 10
21
22
23    def load_data(self, filename):
24        """
25        Loads input data in csv format
26        Args:
27            filename (str): a csv file, e.g. 'data.csv'
28        Returns:
29            (pandas.DataFrame)
30        """
31        return pd.read_csv('../data/'+filename)
32
33
34    def purchase_frequency(self, user):
35        """
36        Returns a dictionary of items bought for each given user,
37        with each item id as keys and their corresponding number of times
38        the item is bought as values.
39        Args:
40            user (int): user ID
41        Returns:
42            (dictionary)
43        """
44        N = self.transactions.set_index('customerId')['products'][user][:]
45        if type(N)!=str:
46            N = np.array("|".join(N.values.reshape(1, len(N))[0]))
47        bought = [int(i) for i in str(N).split('|')]
48        return dict(Counter(bought))
49
50
51    def create_matrix_user_items(self):
52        """
53        Creates a user-to-item matrix, where index values represent unique
54        user IDs and columns represent unique item IDs.
55        The matrix shape is (n_users x n_items).
56        Args:
57            None
58        Returns:
59            None
60        """
61        dic_users = {}
62        for user in self.transactions.customerId.unique():
63            dic_users[user] = self.purchase_frequency(user)
64
65        self.matrix_user_items = np.array(pd.DataFrame(dic_users).T.fillna(0))
66
67
68    def create_matrix_items(self):
69        """
70        Creates an item-to-item matrix, where both indices and columns represent
71        unique item IDs.
72        The matrix shape is square (n_items x n_items).
73        Args:
74            None
75        Returns:
76            None
77        """
78        n = self.n_items
79        self.matrix_items = np.zeros([n, n])
80
81        for i in range(n):
82            for j in range(n):
83                self.matrix_items[i][j] = 1-cosine(self.matrix_user_items[:, i],
84                                                   self.matrix_user_items[:, j])
85
86    def create_matrix_neighbors(self):
87        """
88        Creates a matrix for selecting top neighbors for each item i based on
89        similarity scores, where index values represent unique items and columns
90        represent items that are most similar to that item.
91        The matrix shape is square (n_items x n_neighbors).
92        Args:
93            None
94        Returns:
95            None
96        """
97        n = self.n_items
98        m = self.n_neighbors
99
100        self.matrix_neighbor_items = np.zeros([n, m])
101        self.matrix_neighbor_indices = np.zeros([n, m])
102
103        for i in range(n):
104            sorted_indices = np.argsort(self.matrix_items[i])[::-1][:m]
105            self.matrix_neighbor_indices[i] = sorted_indices
106            self.matrix_neighbor_items[i] = self.matrix_items[i][sorted_indices]
107
108    def create_matrix_similarity(self):
109        """
110        Creates a similarity matrix, where index values represent unique
111        user IDs and columns represent unique item IDs. Scores are filled in
112        based on user purchase and neighboring items.
113        The matrix shape is (n_users x n_items).
114        Args:
115            None
116        Returns:
117            None
118        """
119        self.matrix_pred = np.zeros([self.n_users, self.n_items])
120
121        for user in range(self.n_users):
122            for item in range(self.n_items):
123                top_neighbor_item_scores = self.matrix_neighbor_items[item][1:]
124                indices = self.matrix_neighbor_indices[item][1:].astype(np.int64)
125                user_purchase = self.matrix_user_items[user][indices]
126                self.matrix_pred[user][item] = sum(user_purchase*top_neighbor_item_scores)/ \
127                                               sum(top_neighbor_item_scores)
128
129    def create_recommendations(self, csv_output=True):
130        """
131        Creates a recommendation matrix for all items and a dataframe consisting of
132        top 10 recommended items. Allows for returning a csv output file with
133        specified customerId and their recommendations.
134        Args:
135            None
136        Returns:
137            None
138        """
139        u = self.n_users
140        r = self.n_recommendations
141        c = 'customerId'
142        matrix_recom_scores = np.zeros([u, r])
143        matrix_recom_indices = np.zeros([u, r])
144
145        for user in range(u):
146            sorted_indices = np.argsort(self.matrix_pred[user])[::-1][:r]
147            matrix_recom_indices[user] = sorted_indices
148            matrix_recom_scores[user] = self.matrix_pred[user][sorted_indices]
149
150        df_recommend = pd.DataFrame(matrix_recom_indices)
151        df_recommend[c] = df_matrix.index
152        self.df_top10 = df_recommend[[c]+list(df_recommend.columns[:r])] \
153            .astype(np.int64).set_index(c).loc[customers[c]]
154        self.df_top10['recommendedProducts'] = self.df_top10[list(range(n_recommendations))] \
155            .apply(lambda x: '|'.join(x.fillna('').map(str)), axis=1)
156        if csv_output:
157            self.df_top10[['recommendedProducts']].to_csv('../output/'+output_file)
158
159
160    def process_data(self):
161        """
162        Runs all stages of data processing, from loading the data, matrix transformation,
163        evaluating the model, and outputting the recommendation items for users.
164        Args:
165            None
166        Returns:
167            None
168        """
169        # 1. load data
170        self.transactions = self.load_data(self.input_file)
171        self.customers = self.load_data(self.customer_file)
172        self.n_users = self.transactions.customerId.nunique()
173
174        # 2. create user-to-item matrix
175        self.create_matrix_user_items()
176        self.n_items = self.matrix_user_items.shape[1]
177
178        # 3. create item-to-item matrix
179        self.create_matrix_items()
180
181        # 4. create neighboring items matrix
182        self.create_matrix_neighbors()
183
184        # 5. create similarity matrix
185        self.create_matrix_similarity()
186
187        # 6. create recommendations matrix
188        self.create_recommendations(csv_output=self.csv_output)

جمع‌بندی

در این مطلب، گام‌های مرحله به مرحله برای تولید سیستم‌های توصیه‌گیر در زبان برنامه‌نویسی پایتون شرح داده شده‌اند. همچنین، روش‌های توصیه‌گر مشارکتی مبتنی بر مشابهت کسینوسی و همبستگی پیرسون، پیاده‌سازی شدند و ارزیابی و مقایسه عملکرد آن‌ها با مدل توصیه‌گر پایه در دستور کار قرار گرفت.

مدل‌های پیاده‌سازی شده، روی سه مجموعه داده «اصلی»، «جایگزین» و «اصلی نرمال شده» آموزش و تست شدند. نتایج ارزیابی نشان می‌دهد که مدل توصیه‌گر مشارکتی مبتنی بر شباهت کسینوسی که روی مجموعه داده «جایگزین» آموزش دیده است، بهترین آیتم‌های پیشنهادی را برای مشتریان تولید می‌کند.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۲۵ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Medium
۷ دیدگاه برای «پیاده سازی سیستم های توصیه گر در پایتون — از صفر تا صد»

سلام. ماژول turicreate رو نمیشناسه توی گوگل کولب. چطور میشه نصبش کرد؟ ممنون

سلام وقت بخیر
من دانشجوی دکتری رشته مدیریت فناوری اطلاعات هستم و پایان نامه من در خصوص سیستم های توصیه گر آیتم محور است که در آن از خوشه بندی فازی استفاده می شود می خواستم بپرسم برای اجرای پایان نامه ام از متلب باید استفاده کنم یا پایتون؟؟
ممکن است در انجام پایان نامه ام به من کمک کنید البته با دریافت حق الزحمه

سلام وقت بخیر
ببخشید من paython 2.7.18 را نصب کردم اما این کدها در آن error می دهد می شه راهنمایی کنید باید از کجا شروع کنم؟
البته من از قسمت IDLE استفاده کردم

با سلام هنگام اجرای بخش تست و آموزش، با خطای زیر مواجه میشوم، لطفا راهنمایی کنید علت چیست مرسی
module ‘turicreate’ has no attribute ‘SFrame’

با سلام؛

از همراهی شما با مجله فرادرس سپاس‌گزاریم. بر اساس خطا، خصیصه SFrame در جایی مورد استفاده قرار گرفته است، در حالی که در ماژول «turicreate» وجود ندارد. احتمالا در پیاده‌سازی کد بر اساس مقاله، اشتباهی انجام شده و یا نیاز به انجام تغییراتی در کد متناسب با پیاده‌سازی جدید آن در سیستم خودتان هستید.

خیلی عالی بود ممنون

ba salam
ein kod naghese faile paython mishe bezarid??????

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *