Triplet으로 Negative sampling을 하려면 아래와 같이 메서드를 만드시면 됩니다.
from tqdm import tqdm def negative_sampling(user_ids, item_ids, user_item_dict): negative_samples = [] all_items = set(item_ids) triplets = [] for user_id in tqdm(user_ids): postive_items = user_item_dict.get(user_id, set()) negative_items = all_items - postive_items
# If there are enough non-interacted items, sample num_negatives items if negative_items: for positive_item in postive_items: neg_item = np.random.choice(list(negative_items)) triplets.append({"userId": user_id, "posItemId": positive_item, "negItemId": neg_item}) return triplets
# Get unique user IDs and item IDs from the interactions unique_user_ids = interactions['UserId'].unique() unique_item_ids = interactions['ItemId'].unique()
# Convert negative samples to DataFrame negatives_df = pd.DataFrame(negatives)
수행시간은 M1맥북프로기준 6분정도 소요되었습니다.
위의 예시처럼 전체 상품에서 Negative를 뽑을 수도 있지만, 데이터가 훨씬 더 많고 sparse하고, 학습속도를 효율적으로 하기 위하여 In-batch negative sampling과 logQ loss correction을 통하여 성능을 높일 수 있습니다. 이와 관련된 내용은 해당 포스트를 참고하시면 좋을 것 같습니다.