Ứng dụng thành công và rộng rãi nhất của công nghệ học máy trong kinh doanh là Hệ trợ giúp quyết định.
Bạn đang duyệt qua Spotify để nghe một bài hát nhưng không thể quyết định bài hát nào. Bạn đang lướt qua YouTube để xem một số video nhưng không thể quyết định xem video nào. Có rất nhiều trường hợp khác như thế này, nơi chúng tôi có nhiều dữ liệu nhưng chúng tôi không thể quyết định mình muốn gì. Đây là nơi mà các hệ thống giới thiệu sẽ hỗ trợ chúng tôi.
Hệ thống giới thiệu phổ biến trên thị trường ngày nay và có tầm quan trọng thương mại lớn, bằng chứng là số lượng lớn các công ty bán giải pháp hệ thống giới thiệu. Hệ thống đề xuất đã thay đổi cách các trang web vô tri giao tiếp với người dùng của họ. Thay vì cung cấp trải nghiệm tĩnh trong đó người dùng tìm kiếm và có khả năng mua sản phẩm, các hệ thống giới thiệu tăng cường tương tác để cung cấp trải nghiệm phong phú hơn. Hệ thống đề xuất xác định các đề xuất một cách độc lập cho từng người dùng dựa trên các giao dịch mua và tìm kiếm trước đây cũng như hành vi của những người dùng khác.
Hôm nay, chúng ta sẽ tập trung vào việc cung cấp một hệ thống đề xuất cơ bản bằng cách đề xuất các mục giống nhất với một mục cụ thể, trong trường hợp này là phim. Hãy nhớ rằng đây không phải là một hệ thống đề xuất mạnh mẽ thực sự, để mô tả chính xác hơn, nó chỉ cho bạn biết những phim / mục nào giống nhất với lựa chọn phim của bạn.
Import vào thư viện
import numpy as np
import pandas as pd
Bạn có thể lấy tập dữ liệu bằng cách nhấp vào đây. Các cột trong tập dữ liệu có tên là ‘u.data’ đại diện cho ID người dùng, ID mặt hàng, Xếp hạng và dấu thời gian như chúng tôi đã xác định trong mã bên dưới.
Nhận dữ liệu
column_names = [‘user_id’, 'item_id’, 'rating’, 'timestamp’]
df = pd.read_csv('u.data’, sep=’\t’, names=column_names)
print(df.head())
Bây giờ chúng ta hãy lấy tên phim:
movie_titles = pd.read_csv(“Movie_Id_Titles”)
print(movie_titles.head())
Chúng ta có thể hợp nhất chúng lại với nhau:
df = pd.merge(df,movie_titles,on='item_id’)
print(df.head())
EDA
Hãy cùng khám phá dữ liệu một chút và xem một số bộ phim được xếp hạng hay nhất.
Visualization Imports
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('white’)
%matplotlib inline
Hãy tạo khung dữ liệu xếp hạng với xếp hạng trung bình và số lượng xếp hạng:
print(df.groupby('title’)['rating’].mean().sort_values(ascending=False).head())
print(df.groupby('title’)['rating’].count().sort_values(ascending=False).head())
ratings = pd.DataFrame(df.groupby('title’)['rating’].mean())
print(ratings.head())
Bây giờ đặt số lượng cột xếp hạng:
ratings['num of ratings’] = pd.DataFrame(df.groupby('title’)['rating’].count())
print(ratings.head())
sns.jointplot(x='rating’,y='num of ratings’,data=ratings,alpha=0.5)
plt.show()
Được chứ! Bây giờ chúng ta đã có ý tưởng chung về dữ liệu trông như thế nào, hãy chuyển sang tạo một hệ thống đề xuất đơn giản:
Đề xuất phim tương tự
Bây giờ, hãy tạo một ma trận có id người dùng trên một quyền truy cập và tiêu đề phim trên một trục khác. Sau đó, mỗi ô sẽ bao gồm xếp hạng mà người dùng đã cho phim đó. Lưu ý sẽ có rất nhiều giá trị NaN, vì hầu hết mọi người chưa xem hầu hết các bộ phim.
moviemat = df.pivot_table(index='user_id’,columns='title’,values='rating’)

display(tabulate(moviemat.head(5), moviemat.head(), tablefmt=“grid”))
print(ratings.sort_values('num of ratings’,ascending=False).head(10))
Hãy chọn hai bộ phim: starwars, một bộ phim khoa học viễn tưởng. Và Liar Liar, một bộ phim hài. Bây giờ, hãy lấy xếp hạng của người dùng cho hai bộ phim đó:
starwars_user_ratings = moviemat['Star Wars (1977)’]
liarliar_user_ratings = moviemat['Liar Liar (1997)’]
print(starwars_user_ratings.head())
Sau đó, chúng ta có thể sử dụng phương thức corrwith () để nhận các mối tương quan giữa hai chuỗi gấu trúc:
similar_to_starwars = moviemat.corrwith(starwars_user_ratings)
similar_to_liarliar = moviemat.corrwith(liarliar_user_ratings)
Khi thực hiện lệnh này, một cảnh báo sẽ được đưa ra trông giống như thế này.
Hãy làm sạch điều này bằng cách xóa các giá trị NaN và sử dụng DataFrame thay vì một chuỗi:
corr_starwars = pd.DataFrame(similar_to_starwars,columns=['Correlation’])
corr_starwars.dropna(inplace=True)
print(corr_starwars.head())
Bây giờ, nếu chúng tôi sắp xếp khung dữ liệu theo mối tương quan, chúng tôi sẽ nhận được những bộ phim tương tự nhất, tuy nhiên lưu ý rằng chúng tôi nhận được một số kết quả không thực sự có ý nghĩa. Điều này là do có rất nhiều bộ phim chỉ được xem một lần bởi những người dùng cũng đã xem chiến tranh giữa các vì sao (đó là bộ phim nổi tiếng nhất).
print(corr_starwars.sort_values('Correlation’,ascending=False).head(10))
Hãy khắc phục điều này bằng cách lọc ra các phim có ít hơn 100 bài đánh giá (giá trị này được chọn dựa trên biểu đồ trước đó).
corr_starwars = corr_starwars.join(ratings['num of ratings’])
print(corr_starwars.head().sort_values('num of ratings’,ascending=True))
Bây giờ hãy sắp xếp các giá trị và lưu ý cách tiêu đề có ý nghĩa hơn:
print(corr_starwars[corr_starwars['num of ratings’]>100].sort_values('Correlation’,ascending=False).head())
Giờ đây, bộ phim hài Liar Liar cũng vậy:
corr_liarliar = pd.DataFrame(similar_to_liarliar,columns=['Correlation’])
corr_liarliar.dropna(inplace=True)
corr_liarliar = corr_liarliar.join(ratings['num of ratings’])
print(corr_liarliar[corr_liarliar['num of ratings’]>100].sort_values('Correlation’,ascending=False).head())
Cảm ơn các bạn đã đọc.