๐ ์ธ๊ณต์ง๋ฅ ๊ต์ก ๋จ์ฒด OUTTA AI ๋ถํธ์บ ํ - ๋ฐ์ดํฐ๋ฐ ์ฐ์์ ์์
์ด์ปค๋จธ์ค ์ํ ๋ณ์ ์์ธก ๋ฐ ์ถ์ฒ์์คํ ๊ตฌํ
2023/06/27 โ 2023/08/24
Step1. ๋ฐ์ดํฐ ์์ง
์ฌ๋ฆฌ๋ธ์ ์คํจ์ผ์ด ์ ํ์ ๋ค์ํ ์ ๋ณด๋ฅผ ํฌ๋กค๋ง
- ์ ํ ์ ๋ณด: ๋ธ๋๋๋ช , ์ํ๋ช , ์นดํ ๊ณ ๋ฆฌ, ์ ๊ฐ, ํ ์ธ๊ฐ
- ๊ณ ๊ฐ ๋ฐ ๋ฆฌ๋ทฐ ์ ๋ณด: ์์ด๋, ๋ณ์ , ํผ๋ถํ์ , ํผ๋ถ๊ณ ๋ฏผ ๋ฑ
selenium, ChromeDriverManager, requests, BeautifulSoup, openpyxl ๋ฑ ํ์ฉ
Step2. ์ํ ๋ณ์ ์์ธก
Random Forest ๋ฐ KNN(K-Nearest Neighbor) ๋ชจ๋ธ ์ฌ์ฉ
SMOTE ์ค๋ฒ์ํ๋ง, StandardScaler, Grid Search ๋ฑ ํ์ฉ
๋ฐ์ดํฐ ๋ถ๊ท ํ ํ์ธ โ SMOTE ์ค๋ฒ์ํ๋ง ์ํ
[๋๋คํฌ๋ ์คํธ] ํผ์ฒ ์ค์๋ ์๊ฐํ / ํผ๋ํ๋ ฌ ์๊ฐํ
Step3. ์ถ์ฒ์์คํ ๊ตฌํ
๊ณ ๊ฐ-์ ํ ํ์ ํ๋ ฌ ์์ฑ, ๊ณ ๊ฐ ๊ฐ ์ ์ฌ๋ ๋ถ์ (cosine_similarity ํ์ฉ)
# ๊ณ ๊ฐ ๊ฐ ์ ์ฌ๋ ๊ณ์ฐ
from sklearn.metrics.pairwise import cosine_similarity
cos_matrix = cosine_similarity(df_users)
df_users_cosine = pd.DataFrame(cos_matrix, index=df_users.index, columns=df_users.index)
์ ํ ๋ฐ ๋ณ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก User-Based CF ์ถ์ฒ์์คํ ๊ตฌํ
๊ณ ๊ฐ ์์ด๋์ ์ํ๋ ์ ํ ์ ํ ์ ๋ ฅ โ ํด๋น ์ ์ ์ ์ ์ฌ๋๊ฐ ๋์ ๊ณ ๊ฐ์ ํ์ ๋์ ์ ํ ์ถ์ฒ
def user_based_recommend(user_id, product_type):
# ์ ์ ์์ด๋์ ์ ์ฌ๋ ๋์ 5๋ช
์ฐพ๊ธฐ
sim_users = df_users_cosine[user_id].sort_values(ascending=False)[1:6].index
# ์ ์ฌํ ์ ์ ๋ค์ ๋ฐ์ดํฐ ์ถ์ถ
sim_user_df = df[df['user_id'].isin(sim_users)]
# ์
๋ ฅํ product_type๊ณผ ์ผ์นํ๋ ์ ํ ์ถ์ถ ๋ฐ ์ ๋ ฌ
products = sim_user_df[sim_user_df['product_type'] == product_type].sort_values(by='rating', ascending=False)
# rating 4์ ์ด์์ธ ์ ํ๋ง ์ถ์ถ
products = products[products['rating'] >= 4.0]
# product_name ์ค๋ณต ์ ๊ฑฐ (์ฒซ ๋ฒ์งธ ๊ฐ๋ง ๋จ๊น)
products.drop_duplicates(subset='product_name', keep='first', inplace=True)
result = pd.DataFrame(products['product_name'])
result.columns = ['๋์ ๋น์ทํ ์ฌ์ฉ์๊ฐ ๋ง์กฑํ ' + product_type + ' ์ ํ']
return result
result = user_based_recommend(user_id=1, product_type='์ฐํ')
๋ก์ง: ์ ๋ ฅ ์์ด๋์ ์ ์ฌ๋ ๋์ 5๋ช ํ์ โ ํด๋น ์ ์ ๋ค์ ๋ฐ์ดํฐ ์ค ์ํ๋ product_type ํํฐ๋ง โ rating ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ โ rating 4์ ์ด์๋ง โ ์ํ๋ช ์ค๋ณต ์ ๊ฑฐ โ ์ถ์ฒ ๊ฒฐ๊ณผ ๋ฐํ