암벽 등반 노선 추천 엔진 구축
파이썬으로 추천 엔진을 구축하는 암벽등반자 가이드
제1부 - 인용
추천 엔진이나 추천 시스템이 없는 곳이 없다. 음악, 영화, 제품 추천부터 우리에게 어떤 시사와 뉴스를 보여줄 것인가.
만약 암벽등반자가 스스로 암벽등반 추천 엔진을 세워 유사하고 재미있는 암벽등반을 발견할 수 있다면 이것은 매우 멋있을까?
이 강좌를 읽으면 Python으로 이러한 엔진을 구축할 수 있습니다.
Note: Jupyter notebook for this tutorial is available on Github.
시작하기 전에 추천 엔진을 구축하는 네 가지 일반적인 방법을 살펴보겠습니다.
Note: Jupyter notebook for this tutorial is available on Github.
인기 기반 추천: 가장 간단한 추천.일부 표준 (예: 비디오 시청 횟수 또는 노래 재생 횟수) 에 따라 항목 목록을 만들 수 있습니다.트위터 트렌드나 Reddit 댓글이 이런 방법의 좋은 예다.
내용 기반 추천: 이런 유형의 시스템은 하나의 항목을 입력으로 하고 하나의 특징에 따라 유사한 항목을 건의합니다.예를 들어 영화 한 편을 정하면 추천 엔진은 유형, 감독, 배우에 따라 비슷한 영화를 찾는다.
협업 필터 추천: 아마존을 방문할 때'X하는 사람도 Y하는 사람'이라는 조언을 본 적이 있을 것이다.다른 사용자의 과거 행동이나 선호를 바탕으로 이 엔진은 유사한 선택을 예측할 수 있다.
혼합 추천: 마지막으로 상기 두 개 이상의 추천자를 조합할 수 없는 이유가 없습니다.사실 혼합 추천은 현실 응용에서 흔히 볼 수 있다. 왜냐하면 연구에 의하면 더욱 정확한 건의를 할 수 있기 때문이다.Spotify의 새로운 음악 추천이 좋은 예다.예를 들어 우선 이번 달 유행가(유행도 기반 추천자)를 열거하고 유파와 예술가별로 분류된 비슷한 노래(내용 기반 추천자)만 추천한다.
데이터 세트 정보
이 데이터집에는 미국 네바다의 유명한 홍암협곡 등산지 3161회 등산에 대한 사용자 7950명의 84786회 평점이 담겨 있다.네바다 주가 뽑힌 이유는 간단하다. 왜냐하면 나는 이미 그곳에서 몇 시즌을 뛰었기 때문이다.
사용자 평점은 Mountain Project에서 따릅니다.익명 사용자 ID의com.
판다 데이터 상자에 데이터를 불러옵니다.
import pandas as pd
df = pd.read_csv("./openbeta-ratings-nevada.zip", compression="zip")
df.sample(5)
출력:유행하는 암벽 등반
우리가 연구할 수 있는 기본적인 지표는 등반자들이 얻은 평점 수량을 계산함으로써 어떻게 인기 정도에 따라 순위를 매기는가이다.
# aggregate climbs and count number of ratings
df.groupby(['route_id','name'])['ratings'] .count()
.reset_index(name="count")
출력:계수에 따라 결과를 정렬하면 상위 20명만 표시됩니다.
popular = df.groupby(['route_id','name'])['ratings'] .count()
.reset_index(name="count")
.sort_values(by=['count'], ascending=False)
popular.head(20)
출력:우리 찾았어!홍암에서 유행하는 암벽 등반 종목 목록.만약 네가 이전에 이 지역에 가 본 적이 있다면, 너는 틀림없이 그 이름들을 알아볼 것이다.
공동 작업 필터링 이해
협동 여과에서 우리는 암벽 등반 노선의 평점이나 선호에 따라 뜻이 맞는 암벽 등반자를 찾는다.
야행과 용이 4성급 등급을 받은 등반자 타마라를 고려해 보자.만약 당신도 그들에게 매우 높은 평가를 주었다면, 우리는 두 암벽등반자가 매우 높은 유사성 점수를 가지고 있다고 말할 수 있다.이 예에서 만약 타마라가 다시 별이나 네 개를 등반한다면 너도 좋아할 것이다. 반대로도 마찬가지다.
이것이 바로 협동 여과 배후의 원리다!직관적이고 간단하죠?사실, 이 유사성 점수를 수동으로 계산하거나 파이썬 라이브러리를 통해 계산할 수 있습니다.이 숫자가 높을수록 두 등산객은 더욱 의기투합한다.
믿거나 말거나 위의 표는Python으로 2차원 그룹 (행렬) 을 표시할 수 있습니다.우리는 여현의 유사성을 사용할 것이다. 이것은 유사성을 계산하는 데 자주 사용되고 간단한 방법이다.
# Be sure to install sklearn library with pip or pipenv
import sklearn.metrics.pairwise as pw
tamara = [[4,4]]
you = [[3,4]]
pw.cosine_similarity(tamara, you)
# Result = [[0.98994949]]
우리는 또 두 개 이상의 노선의 여현 유사성을 계산할 수 있다.타마라가 모자를 쓴 고양이를 좋아하지 않는다고 가정해 별을 하나 주었다.import sklearn.metrics.pairwise as pw
tamara = [[4,4,1]]
you = [[3,4,3]]
pw.cosine_similarity(tamara, you)
# Result = [[0.94947403]]
여현의 유사성은 0.98994949499에서 0.94947403으로 떨어졌다.지금 보시다시피 우리는 상술한 논리를 확장하여 다른 수천 개의 상승과 사용자 평가를 고려할 수 있습니다.물론 행렬의 크기가 증가함에 따라 수학은 복잡해진다.심호흡, 마치 네가 마지막 볼트보다 1미터 높은 것 같아!Python 머신러닝 라이브러리 Surprise 를 사용하여 권장 엔진을 구축할 수 있습니다.
Cosine similarity is just one of many ways to find similar items. Surprise recommendation library supports:
- Cosine similarity
- Pearson’s correlation coefficients
- Mean Square Difference
섹션 2 - 권장 엔진 구축
1. 데이터 파일 로드
이 단계는 연속성을 유지하기 위해 이전 절을 반복합니다.
import pandas as pd, numpy as np
df = pd.read_csv("./openbeta-ratings-nevada.zip", compression="zip") df.sample(5)
출력:
2. 예측 모델 생성
이 예에서 우리는 K-최근 인접 알고리즘을 이용하여 우리의 예측 모델을 구축한다.본질적으로 말하자면, 이 코드는 우리가 이전에 한 것처럼 여현 유사성 계산을 할 수 있지만, 데이터 집합에서 매우 노력하고 유사성 점수를 통해 순위를 높일 수 있다.
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise import KNNBasic
from surprise.model_selection import train_test_split
from surprise.model_selection import KFold
reader = Reader(rating_scale=(0, 4))
data = Dataset.load_from_df(df[['users', 'route_id', 'ratings']], reader)
sim_options = {'name': 'cosine', 'user_based': True, 'min_support': 4}
algo = KNNBasic(sim_options=sim_options)
kf = KFold(n_splits=5)
for trainset, testset in kf.split(data):
# train and test algorithm
algo.fit(trainset)
predictions = algo.test(testset)
# compute and print Root Mean Squared Error
accuracy.rmse(predictions, verbose=True)
출력:
Computing the cosine similarity matrix...
Done computing similarity matrix. RMSE: 0.7172
Computing the cosine similarity matrix...
Done computing similarity matrix. RMSE: 0.7057
...
Understanding Train Set and Test Set
You may be wondering about RMSE values (root-mean-square-errors) and why there is a For loop and the need to split the dataset into train set and test set?
우리의 이전 등급 평가 예시를 고려하다.완벽한 세계에서 추천 엔진은 타마라가 다른 노선에 높은 등급을 주면 그 노선을 좋아할 것이라고 정밀하게 예측할 수 있다.
예측 정밀도를 측정하기 위해 이 알고리즘은 데이터 집합을 여러 개의 비교적 작은 집합으로 나누어 이 집합에서 기어오르는 사람이 주는 평점을 모르는 척하고 실제 평점과 예측치를 비교한다.RSME는 편차의 도량입니다.
Train set: a subset of the dataset used to calculate similarity and perform prediction or “train” the prediction model.
Test set: a subset of the dataset where you apply the prediction model from the train set and test prediction accuracy.
예:
테스트 집합 1 - 예측치와 3(실제)을 비교한다.
테스트 집합 2 - 4(실제)를 예측치와 비교한다.
3. 제안
이 위대한 질문에 대답할 때가 왔다. Epinephrine 좋아하는 등산객도 좋아하고...
climb_name = "Epinephrine"
# look up route_id from human-readable name
route_id = df[df.name==climb_name]['route_id'].iloc[1]
print("People who climbed '{}' also climbed".format(climb_name))
# get similar climbs
prediction = algo.get_neighbors( trainset.to_inner_iid(route_id), 50)
print(prediction)
출력:
People who climbed 'Epinephrine' also climbed [263, 506, 238, 75, 8, 511, 1024, 233, 173, 418, 550, 1050, 478, 2, 379, 596, 1491, 221, 730, 261, 30, 410, 109, 313, 264, 148, 659, 68, 223, 1131, 1283, 428, 272, 354, 496, 143, 737, 1152, 835, 17, 356, 368, 545, 89, 23, 74, 281, 480, 509, 278]
Domain Id vs Surprise Internal Id
For efficiency, the prediction algorithm converts our dataset into another data structure (most likely into some sort of matrix), and work with the data by their internal IDs.
경이로운 라이브러리는 두 개의 조수 함수를 제공하여 하나를 다른 것으로 전환시켰다.
import pandas as pd, numpy as np
df = pd.read_csv("./openbeta-ratings-nevada.zip", compression="zip") df.sample(5)
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise import KNNBasic
from surprise.model_selection import train_test_split
from surprise.model_selection import KFold
reader = Reader(rating_scale=(0, 4))
data = Dataset.load_from_df(df[['users', 'route_id', 'ratings']], reader)
sim_options = {'name': 'cosine', 'user_based': True, 'min_support': 4}
algo = KNNBasic(sim_options=sim_options)
kf = KFold(n_splits=5)
for trainset, testset in kf.split(data):
# train and test algorithm
algo.fit(trainset)
predictions = algo.test(testset)
# compute and print Root Mean Squared Error
accuracy.rmse(predictions, verbose=True)
Computing the cosine similarity matrix...
Done computing similarity matrix. RMSE: 0.7172
Computing the cosine similarity matrix...
Done computing similarity matrix. RMSE: 0.7057
...
Understanding Train Set and Test Set
You may be wondering about RMSE values (root-mean-square-errors) and why there is a For loop and the need to split the dataset into train set and test set?
Train set: a subset of the dataset used to calculate similarity and perform prediction or “train” the prediction model.
Test set: a subset of the dataset where you apply the prediction model from the train set and test prediction accuracy.
climb_name = "Epinephrine"
# look up route_id from human-readable name
route_id = df[df.name==climb_name]['route_id'].iloc[1]
print("People who climbed '{}' also climbed".format(climb_name))
# get similar climbs
prediction = algo.get_neighbors( trainset.to_inner_iid(route_id), 50)
print(prediction)
People who climbed 'Epinephrine' also climbed [263, 506, 238, 75, 8, 511, 1024, 233, 173, 418, 550, 1050, 478, 2, 379, 596, 1491, 221, 730, 261, 30, 410, 109, 313, 264, 148, 659, 68, 223, 1131, 1283, 428, 272, 354, 496, 143, 737, 1152, 835, 17, 356, 368, 545, 89, 23, 74, 281, 480, 509, 278]
Domain Id vs Surprise Internal Id
For efficiency, the prediction algorithm converts our dataset into another data structure (most likely into some sort of matrix), and work with the data by their internal IDs.
trainset.to_inner_iid(route_i)
- 도메인별 Id를 내부 Id로 변환합니다.trainset.to_raw_iid(id)
- 내부 Id를 도메인별 Id로 변환합니다.# convert Surprise internal Id to MP Id
recs = map( lambda id: trainset.to_raw_iid(id), np.asarray(pred))
results = df[df.route_id.isin(recs)]
r = results.pivot_table( index=['name', 'route_id', 'type', 'grade'], aggfunc=[np.mean, np.median, np.size], values='ratings')
print(r)
출력:보호 장치 끄기
그렇습니다.우리는 방금 파이썬 경이고의 도움으로 홍암 협곡에 간단한 등반 추천 엔진을 세웠다.너는 난이도와 유형(훈련과 운동)에 따라 등반하는 것을 건의함으로써 엔진을 더욱 미세하게 조정할 수 있다.이것은 미래 문장의 주제다.즐겁게 놀고 안전하게 지내세요!
이 강좌를 좋아하고 유사한 내용을 더 많이 보고 싶으시다면 상세한 설명을 해 주십시오♥ 감사합니다.
Jupyter notebook for this tutorial is available on Github.
작가와 친구 등용(5.11a)
Reference
이 문제에 관하여(암벽 등반 노선 추천 엔진 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/vnugent/building-a-rock-climbing-route-recommendation-engine-3mdj
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Jupyter notebook for this tutorial is available on Github.
Reference
이 문제에 관하여(암벽 등반 노선 추천 엔진 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vnugent/building-a-rock-climbing-route-recommendation-engine-3mdj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)