๐ Django Project
๐ญ Machine Learning part
- google Colab์์ ์งํํ๋
์ ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง
๊ณผ ์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง
, ์ ์ฌ ์์ธ ํ์
ํํฐ๋ง
์ pyCharm์ผ๋ก ์ฎ๊ฒจ์ค๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํด ๋ณด์๋ค.
- ์ ๋ฒ์ฒ๋ผ modelํ๋ฅผ ์์ผ์ ๋ค๊ณ ์์ผ ์๊ฐํ๋ฉด์ ๋๋ฌด ๋ง๋งํด์ ํํฐ๋๊ป ์ง๋ฌธ์ ๋๋ ธ๊ณ , ์ฝ๋๋ฅผ ์ฌ์ฉ ๋ณด์๋๋ ๊ตณ์ด ๋ชจ๋ธํํ ํ์์๋ค๊ณ ํ์
จ๋ค.
- ๊ทธ๋ ๋ค๋ฉด ๋์๊ฒ ์ฃผ์ด์ง๋ ์ ํ์ง๋ 2๊ฐ๋ผ๊ณ ์๊ฐํ๋ค.
- ํด๋์ค๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฉด ์ง์ง ๋๋ฌด ์ข๋ค๊ณ ์๊ฐํ๋ค. ๊ณ์ ์ฐ์ตํด์ผ ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ง์ด ๋๋ ๋ถ๋ถ์ด๊ณ , ํํฐ๋๋ค์ ์ฝ๋ ์ค ํด๋์ค๋ก ์์ฑ๋์ด ์๋ ๊ฒ์ ๋ณด๋ฉด ์ ์ด๋ฐ ์๊ฐ์ ๋ชปํ์ง๋ผ๊ณ ๋๋ผ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ผ๋จ์
ํจ์ํ
์ ์ด์ ์ ๋์๋ค. (์๊ฐ์ด ํ๋ฝํ๊ณ ๋ด ์ง์์ด ํ๋ฝํ๋ค๋ฉด ๋ฆฌํฉํ ๋ง์ ๋ฌด์กฐ๊ฑด ํ ๊ฒ์ด๋ค.)
- ์ง๊ธ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์์ ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์ถ์ ํํฐ๋ง์
์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง
๊ณผ ์ ์ฌ ์์ธ ํ์
ํํฐ๋ง
์ด๋ค. ํ์ฌ ์ ์ฌ ์์ธ ํ์
ํํฐ๋ง
์ ๋ชจ๋ import์์ ์ค๋ฅ๊ฐ ์ข ์๊ณ , ๊ตฌ๊ธ๋ง์ ํด๋ณด์์ผ๋ ํด๊ฒฐ์ด ๋์ง ์์ ๋ด์ผ ์ง๋ฌธ์ ๋๋ฆด ์๊ฐ์ด๋ค.
- ์ฐ์ ์ ์ผ๋ก
์์ดํ
๊ธฐ๋ฐ ํ์
ํํฐ๋ง
์ ํจ์ํํ์๋ค.
- ์ฌ๊ธฐ์ ์ ๋ฅผ ์ข ๋จน์ ๋ถ๋ถ์ด ์๋ค. ๋ฐ๋ก
์ํ ์ด๋ฆ์ ์ถ๋ ฅ
ํ๋ ๊ฒ์ด๋ค.
- ํ์ฌ ํด๋น ํํฐ๋ง์ ์ด์ ์
์ฝ์ฌ์ธ ์ ์ฌ๋
์ด๋ค.
- ๊ฒฐ๊ณผ๋ฅผ ์ ๊ตฌํ๊ณ ๋จ์ํ
movie_list
๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ฉด ์ฝ์ฌ์ธ ์ ์ฌ๋๊ฐ ๋์ ์ํ๋ณ๋ก 20๊ฐ์ง๊ฐ ์ถ๋ ฅ๋๋ค. ์ด๋๋ ์ํ์ด๋ฆ์ด index
๋ก ๊ฐ์ด ๋์ค๊ฒ ๋๋ค.
- ์ฒ์์
Series
ํํ๋ฅผ ์๊ฐํ์ง ๋ชปํ๊ณ ๋จ์ํ ๋ฆฌ์คํธ์์ ๊ฐ์ ๊บผ๋ผ ๋์ฒ๋ผ ์ถ๋ ฅํ๋ ค ํ๋ค๊ฐ ํ์ง ๋ชปํ๊ณ ๊ตฌ๊ธ๋ง์ ํ๋ค.
- ๋ฆฌํด๊ฐ์ด
Series
์์ ๊นจ๋ซ๊ณ , index๋ฅผ ๋ฆฌํด๊ฐ์ผ๋ก ์ฃผ์๊ณ ์ํ์ ์ด๋ฆ์ 20๊ฐ ๋ฝ์ ์ ์์๋ค.
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
movies = pd.read_csv('movies.csv')
ratings = pd.read_csv('ratings.csv')
def item_based_filtering(movie):
movie_ratings = pd.merge(ratings, movies, on='movieId')
user_title = movie_ratings.pivot_table('rating', index='title', columns='userId')
user_title = user_title.fillna(0)
item_based_collab = cosine_similarity(user_title, user_title)
item_based_collab = pd.DataFrame(item_based_collab, index=user_title.index, columns=user_title.index)
movie_list = item_based_collab[movie].sort_values(ascending=False)[1:20]
return movie_list.index
m = item_based_filtering('Dark Knight, The (2008)')
for i in m:
print(i)
์ ์ ๊ธฐ๋ฐ ํ์
ํํฐ๋ง
์ ํ์ฌ ๋ด ๊ณํ์์๋ ์ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ํน์ ์ด๊ฒ์ ์ฐ๋ ๊ฒ์ด ์ ๋ต์ผ ์๋ ์์ด ํจ์ํํ๋ ๊น์ ๊ฐ์ด ์งํํด๋ณด์๋ค.
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
movies = pd.read_csv('movies.csv')
ratings = pd.read_csv('ratings.csv')
def user_based_filtering(movie):
movie_ratings = pd.merge(ratings, movies, on='movieId')
title_user = movie_ratings.pivot_table('rating', index='userId', columns='title')
title_user = title_user.fillna(0)
user_based_collab = cosine_similarity(title_user, title_user)
user_based_collab = pd.DataFrame(user_based_collab, index=title_user.index, columns=title_user.index)
chosen_user = user_based_collab[5].sort_values(ascending=False)[:10].index[1]
result = title_user.query(f'userId == {chosen_user}').sort_values(ascending=False, by=chosen_user, axis=1)
user_index_list = user_based_collab[5].sort_values(ascending=False)[:10].index.tolist()
print(f'๊ธฐ์ค ์ ์ ์ ์ ์ฌํ ์์(๋งจ ์์ด ๊ธฐ์ค ์ ์ ) : {user_index_list}')
user_weight_list = user_based_collab[5].sort_values(ascending=False)[:10].tolist()
print(f'๊ฐ์ค์น ๊ฐ : {user_weight_list}')
movie_title = movie
weighted_sum, weighted_user = [], []
for i in range(1, 10):
value = title_user[movie_title][user_index_list[i]]
if int(value) != 0:
weighted_sum.append(title_user[movie_title][user_index_list[i]] * user_weight_list[i])
weighted_user.append(user_weight_list[i])
print(weighted_sum)
print(weighted_user)
pred_rating = sum(weighted_sum) / sum(weighted_user)
return pred_rating
print(user_based_filtering("Batman Forever (1995)"))