> 백엔드 개발 > 파이썬 튜토리얼 > 추천 시스템이란 무엇이며 어떻게 사용하나요?

추천 시스템이란 무엇이며 어떻게 사용하나요?

DDD
풀어 주다: 2024-11-09 02:05:02
원래의
969명이 탐색했습니다.

What are Recommender Systems and how to use them

추천 시스템, 즉 추천 시스템은 정보를 필터링하는 데 사용되는 알고리즘입니다. 정보를 수집하면 특정 사용자와 가장 관련성이 높은 제안이 제공됩니다. 이는 정보의 양이 압도적으로 많은 플랫폼을 결정해야 할 때 도움이 됩니다.

협업 필터링

What are Recommender Systems and how to use them

협업 필터링은 과거 시청이나 특정 제품 평가 등 사용자의 과거 결정과 다른 사용자의 유사한 행동을 사용하여 모델을 구축하여 사용자가 무엇을 즐길지 예측합니다. 사용자 평가 매트릭스를 사용하며 평점 외에 인구통계나 기타 정보와 같은 다른 사용자 정보를 요구하지 않습니다. 이는 최소한의 정보에 의존하여 내용을 이해하지 않고도 상품을 추천할 수 있다는 점에서 협업 필터링의 큰 장점입니다.

Last.fm은 사용자가 정기적으로 듣는 밴드와 개별 ​​트랙을 관찰하고 이를 다른 사용자의 청취 행동과 비교하여 노래를 추천합니다. Last.fm은 사용자의 라이브러리에 표시되지 않지만 비슷한 관심사를 가진 다른 사용자가 자주 재생하는 트랙을 재생합니다. 이 접근 방식은 사용자의 행동을 활용하므로 협업 필터링 기술의 예입니다. Last.fm에서는 정확한 추천을 제공하기 위해 사용자에 대한 많은 정보가 필요합니다. 이는 협업 필터링 시스템에서 흔히 발생하는 콜드 스타트 ​​문제의 예입니다. (출처: WiKipedia, https://en.wikipedia.org/wiki/Recommender_system)

협업 필터링은 과거에 동의한 사람들이 앞으로도 동의할 것이라고 가정합니다. 현재 사용자와 유사한 이력을 가진 다른 사용자를 식별하고 이 동네를 사용하여 예측을 생성합니다. 이러한 방법은 메모리 기반 및 모델 기반 접근 방식으로 간주됩니다.

협업 필터링 알고리즘을 방해할 수 있는 몇 가지 문제는 콜드 스타트, 확장성 및 희소성입니다. 콜드 스타트는 정확한 추천을 하기에는 데이터가 부족함을 의미합니다. 또한 권장 사항을 계산하는 데 종종 필요한 대량의 계산 능력이 필요하므로 알고리즘의 확장성이 떨어집니다. 또한 인터넷에는 엄청난 양의 제품과 아이템이 있기 때문에 평가가 다소 희박합니다.

Python에서 협업 필터링 구현

우리는 최고의 브랜드와 화장품 리뷰가 포함된 데이터 세트를 사용할 것입니다. 이 데이터세트는 Kaggle 웹사이트(https://www.kaggle.com/datasets/jithinanievarghese/cosmetics-and-beauty-products-reviews-top-brands
)에서 찾을 수 있습니다.

rating_list = pd.read_csv('top_brands_cosmetics_product_reviews.csv', sep=',', usecols=['author', 'product_title', 'product_rating', 'review_date'])

items = pd.read_csv('top_brands_cosmetics_product_reviews.csv', 
                    usecols=['product_title', 'product_url', 'brand_name'], encoding='latin-1')

print(f'Number of ratings: {rating_list.author.nunique()} | Number of items: {items.product_title.nunique()}')
로그인 후 복사
로그인 후 복사

사용자 항목 매트릭스를 사용하여 학습을 피벗합니다.

X_train, X_test, y_train, y_test = train_test_split(rating_list, rating_list.product_rating, test_size=0.1, random_state=42)

ratings = X_train.pivot_table(index=['author'], columns=['product_title'], values='product_rating').fillna(0)
mean_ratings = ratings.mean(axis=1)
print(f'Number of users: {ratings.shape[0]} | Number of items: {ratings.shape[1]}')
로그인 후 복사
로그인 후 복사

유사성을 계산합니다.

def get_all_recommendations(user_id, model, use_means=True):
    distance, knn = model.kneighbors(ratings.fillna(0)) # nearest neighbors
    knn = pd.DataFrame(knn + 1, index=ratings.index)
    sim = pd.DataFrame(1 - distance, index=ratings.index) # invert the distance
    neighbors = knn.loc[user_id, 1:]
    similarities = sim.loc[user_id, 1:]
    similarities.index = ratings.loc[neighbors].index

    if use_means:
        return pd.Series(mean_ratings.loc[user_id] + ratings.loc[neighbors].subtract(mean_ratings.loc[neighbors], axis='index').mul(similarities, axis='index').sum(axis='index') / similarities.sum(), name='recommendation')
    else:
        return pd.Series(ratings.loc[neighbors].mul(similarities, axis='index').sum(axis='index') / similarities.sum(), name='recommendation')
로그인 후 복사
로그인 후 복사

특정 사용자, 제품, 모델에 대한 단일 추천을 계산합니다

def get_recommendations (user_id, product_id, model, use_means=True):
    if product_id not in ratings.columns:
        return 2.5
    recommendations = get_all_recommendations(user_id, model, use_means=use_means)
    return recommendations.loc[product_id]
로그인 후 복사
로그인 후 복사

RMSE(평균 제곱근 오차)를 계산하여 데이터세트의 모든 사용자에 대한 모든 제품의 평점을 예측합니다. 그런 다음 예측 등급을 테스트 세트의 실제 등급과 연결하고 RMSE.7을 계산합니다.

model = NearestNeighbors(n_neighbors=40, metric='cosine')
model.fit(ratings.fillna(0))

def get_RMSE(X_test, model, use_means=True):
    group = X_test[['product_title', 'product_rating']].groupby(X_test.author)
    mse = []
    i = 0
    for key in group.groups:
        if key not in rating_list['author']:
            continue  # Skip users not in the dataset
        predictions = get_all_recommendations(key, model=model, use_means=use_means)
        rated_products = group.get_group(key).set_index('product_title')
        df = rated_products.join(predictions).dropna().reset_index()
        mse.append(df)
        if i % 100 == 0:
            score = np.sqrt(mean_squared_error(df.product_rating, df.recommendation))
            print(f'{i}/{X_test.author.nunique()} - RMSE: {score:.4f}')
        i += 1
    mse = pd.concat(mse).reset_index(drop=True)
    score = np.sqrt(mean_squared_error(mse.product_rating, mse.recommendation))
    print(f'{X_test.author.nunique()}/{X_test.author.nunique()} - RMSE: {score:.4f}')

get_RMSE(X_test, model)
로그인 후 복사
로그인 후 복사
ratings_dict = {
    "item": [1, 2, 1, 2, 1, 2, 1, 2, 1],
    "user": ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E'],
    "rating": [1, 2, 2, 4, 2.5, 4, 4.5, 5, 3],
}

df = pd.DataFrame(ratings_dict)
reader = Reader(rating_scale=(1, 5))

data = Dataset.load_from_df(df[["user", "item", "rating"]], reader)

movielens = Dataset.load_builtin('ml-100k') 
trainingSet = movielens.build_full_trainset()
algo.fit(trainingSet)
로그인 후 복사
def get_recommendation(id_user, id_movie, ratings):
    #cosine similarity of the ratings
    similarity_matrix = cosine_similarity(ratings.fillna(0), ratings.fillna(0))
    similarity_matrix_df = pd.DataFrame(similarity_matrix, index=ratings.index, columns=ratings.index)

    cosine_scores = similarity_matrix_df[id_user]
    ratings_scores = ratings[id_movie]
    ratings_scores.dropna().dot(cosine_scores[~ratings_scores.isna()]) / cosine_scores[~ratings_scores.isna()].sum()
    return np.dot(ratings_scores.dropna(), cosine_scores[~ratings_scores.isna()]) / cosine_scores[
        ~ratings_scores.isna()].sum()

get_recommendation(196, 8, ratings) # get recommandations for user 196 for movie 8 
로그인 후 복사

콘텐츠 기반 필터링

What are Recommender Systems and how to use them

콘텐츠 기반 필터링 접근 방식은 항목의 사전 태그된 개별 특성을 활용하여 유사한 속성을 가진 추가 항목을 추천합니다. 항목 기능을 사용하여 사용자가 찾고 있는 항목과 관련된 항목을 선택하고 반환합니다. 일부 콘텐츠 기반 추천 알고리즘은 실제 콘텐츠가 아닌 설명에 따라 항목을 일치시킵니다.

Pandora는 노래나 아티스트의 속성을 사용하여 유사한 속성을 가진 음악을 재생하는 대기열을 시드합니다. 사용자 피드백은 사용자가 특정 노래를 "좋아요"할 때 특정 속성을 덜 강조하고 사용자가 노래를 "좋아요"할 때 다른 속성을 강조하여 스테이션의 결과를 개선하는 데 사용됩니다. 이는 콘텐츠 기반 접근 방식의 한 예입니다. Pandora는 시작하는 데 정보가 거의 필요하지 않으며 범위가 훨씬 제한적입니다(예를 들어 원래 시드와 유사한 권장 사항만 제공할 수 있음). (출처: 위키피디아, https://en.wikipedia.org/wiki/Recommender_system)

이 방법은 제품 설명과 사용자 프로필을 사용하므로 항목에 대한 데이터는 알려져 있지만 사용자에 대한 데이터는 없는 상황에 적합합니다. 콘텐츠 기반 추천자는 추천을 사용자별 분류 문제로 취급하고 항목의 특징을 기반으로 사용자가 좋아하는 것과 싫어하는 것에 대한 분류자를 학습합니다. 키워드는 항목을 설명하는 데 사용되며 사용자 프로필은 사용자가 좋아하는 것과 싫어하는 것을 나열하도록 구성됩니다. 다양한 후보 아이템을 사용자가 이전에 평가한 아이템과 비교하여 가장 잘 어울리는 아이템을 추천해 드립니다. 널리 사용되는 알고리즘은 TF-IDF 표현입니다. 사용자가 해당 아이템을 좋아할 확률을 추정하기 위해 베이지안 분류기, 클러스터 분석, 의사결정 트리, 인공 신경망과 같은 기계 학습 기술이 있습니다.

그러나 콘텐츠 기반 필터링은 사용자가 이미 좋아하는 항목과 매우 유사한 항목을 제안하는 경우가 많으므로 다양성이 제한되고 새로운 항목을 발견하기가 더 어려워집니다. 이로 인해 사용자가 특정 유형의 콘텐츠만 볼 수 있는 "거품"이 생성될 수 있습니다. 또한 항목에 라벨이 지정되거나 설명된 정도에 따라 달라지는데, 이는 정보가 충분하지 않거나 사용자가 신규 사용자이고 아직 많은 콘텐츠와 상호작용하지 않은 경우 문제가 될 수 있습니다.

Python에서 콘텐츠 기반 필터링 구현(BOW 사용)

rating_list = pd.read_csv('top_brands_cosmetics_product_reviews.csv', sep=',', usecols=['author', 'product_title', 'product_rating', 'review_date'])

items = pd.read_csv('top_brands_cosmetics_product_reviews.csv', 
                    usecols=['product_title', 'product_url', 'brand_name'], encoding='latin-1')

print(f'Number of ratings: {rating_list.author.nunique()} | Number of items: {items.product_title.nunique()}')
로그인 후 복사
로그인 후 복사

숫자 기계 학습 알고리즘을 적용할 수 있도록 플롯 요약을 벡터 표현으로 변환합니다.

X_train, X_test, y_train, y_test = train_test_split(rating_list, rating_list.product_rating, test_size=0.1, random_state=42)

ratings = X_train.pivot_table(index=['author'], columns=['product_title'], values='product_rating').fillna(0)
mean_ratings = ratings.mean(axis=1)
print(f'Number of users: {ratings.shape[0]} | Number of items: {ratings.shape[1]}')
로그인 후 복사
로그인 후 복사

각 플롯 요약은 고차원 의미 공간을 가리키는 일련의 단어로 변환됩니다(여기에서는 TF-IDF 모델이 사용됨). 문서에 단어가 나타나는 횟수를 계산하여 문서에서 해당 단어의 중요성을 결정합니다.

print(f'Matrix에는 {tfidf_model.shape[0]} 행과 {tfidf_model.shape[1]} 열이 포함되어 있습니다.')

BOW(Bag of Words) 모델은 문서에 단어가 나타나는 횟수를 계산합니다(희소, 벡터의 대부분 항목은 0입니다)

TF-IDF(용어 빈도 - 역 문서 빈도) 모델은 단어가 문서에 나타나는 횟수를 계산하지만 해당 단어가 모든 문서에 나타나는 빈도도 고려합니다. 문서 전체에 자주 나타나는 단어의 가중치를 낮추어 드물게 나타나는 단어보다 정보의 가치를 떨어뜨립니다. 모든 플롯 요약은 길이가 모든 플롯 요약의 어휘 크기와 동일한 단일 벡터로 인코딩되며, TD-IDF는 플롯 요약을 행렬로 변환합니다. 리뷰의 80% 이상에 나오는 단어와 2개 미만에 나오는 단어를 무시 → 노이즈가 줄어듭니다.

인기 메이크업 어휘를 활용하여 TF-IDF 모델을 살펴보세요.

def get_all_recommendations(user_id, model, use_means=True):
    distance, knn = model.kneighbors(ratings.fillna(0)) # nearest neighbors
    knn = pd.DataFrame(knn + 1, index=ratings.index)
    sim = pd.DataFrame(1 - distance, index=ratings.index) # invert the distance
    neighbors = knn.loc[user_id, 1:]
    similarities = sim.loc[user_id, 1:]
    similarities.index = ratings.loc[neighbors].index

    if use_means:
        return pd.Series(mean_ratings.loc[user_id] + ratings.loc[neighbors].subtract(mean_ratings.loc[neighbors], axis='index').mul(similarities, axis='index').sum(axis='index') / similarities.sum(), name='recommendation')
    else:
        return pd.Series(ratings.loc[neighbors].mul(similarities, axis='index').sum(axis='index') / similarities.sum(), name='recommendation')
로그인 후 복사
로그인 후 복사

플롯 요약 용어 빈도 발생 시그니처를 기반으로 서로 다른 제품 간의 코사인 유사성을 적용합니다.

def get_recommendations (user_id, product_id, model, use_means=True):
    if product_id not in ratings.columns:
        return 2.5
    recommendations = get_all_recommendations(user_id, model, use_means=use_means)
    return recommendations.loc[product_id]
로그인 후 복사
로그인 후 복사

데이터세트의 모든 제품에 함수를 적용하세요.

model = NearestNeighbors(n_neighbors=40, metric='cosine')
model.fit(ratings.fillna(0))

def get_RMSE(X_test, model, use_means=True):
    group = X_test[['product_title', 'product_rating']].groupby(X_test.author)
    mse = []
    i = 0
    for key in group.groups:
        if key not in rating_list['author']:
            continue  # Skip users not in the dataset
        predictions = get_all_recommendations(key, model=model, use_means=use_means)
        rated_products = group.get_group(key).set_index('product_title')
        df = rated_products.join(predictions).dropna().reset_index()
        mse.append(df)
        if i % 100 == 0:
            score = np.sqrt(mean_squared_error(df.product_rating, df.recommendation))
            print(f'{i}/{X_test.author.nunique()} - RMSE: {score:.4f}')
        i += 1
    mse = pd.concat(mse).reset_index(drop=True)
    score = np.sqrt(mean_squared_error(mse.product_rating, mse.recommendation))
    print(f'{X_test.author.nunique()}/{X_test.author.nunique()} - RMSE: {score:.4f}')

get_RMSE(X_test, model)
로그인 후 복사
로그인 후 복사

하이브리드 시스템

두 알고리즘을 결합하여 더욱 세련된 추천을 제공할 수도 있습니다. 추천 시스템은 사용자가 다른 방법으로는 찾지 못했을 항목을 발견하도록 도와줍니다. 추천 시스템은 비전통적인 데이터를 색인화하는 검색 엔진을 사용하여 구현되는 경우가 많습니다.

결론

결론적으로 추천 시스템은 개인화된 제안을 제공하여 사용자가 관련 콘텐츠와 제품을 찾을 수 있도록 돕는 데 핵심적인 역할을 합니다. 관심 있는 것을 찾는 데 필요한 시간과 노력을 줄여 경험을 향상시킵니다.

** GitHub에서 전체 코드를 확인하세요: https://github.com/alexiacismaru/recommender-systems

위 내용은 추천 시스템이란 무엇이며 어떻게 사용하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿