Рубрики
Без рубрики

Строительство Рекомендации по маршруту Rock Allining

«Я собираюсь в Вегас, чтобы провести больше времени в горах». Никто никогда не говоришь, если ты не поднимаешься по камню … Теги с обучением машины, наукой данных, Python, учебником.

«Я собираюсь в Вегас, чтобы провести больше времени в горах». Сказал никто никогда, если ты альпинист.

Руководство по альпинисту к модулю создания рекомендации в Python

Рекомендательные двигатели или Рекомендательные системы Повсюду повсюду, от музыки, фильма и рекомендаций по продуктам, к тому, какие текущие события и новости показаны нам.

Будет ли это круто, если бы скал альпинисты, сами могут построить двигатель рекомендации подъема, чтобы обнаружить подобные и интересные подъемы?

После прочтения этого учебника вы можете построить один из таких двигателей в Python.

Примечание: Jupyter Notebook для этого учебника – Доступно на Github Отказ

Прежде чем мы начнем, давайте рассмотрим четыре распространенных способа построить механизм рекомендации:

  • Рекомендатели на основе популярности : Самый простой из всех. Вы составляете список предметов на основе некоторых критериев, таких как количество просмотра видео или воспроизведение песни. Тренендные темы Twitter или Reddit Comments являются хорошими примерами этого подхода.
  • Рекомендатели на основе контента : Этот тип системы принимает один элемент в качестве ввода и предлагает аналогичные элементы на основе набора характеристик. Например, учитывая фильм, механизм рекомендации находит похожие фильмы на основе жанровых, директоров и актеров.
  • Рекомендатели по совместным фильтрациям : Вы, возможно, видели «Люди, которые делали X, также делали» предложения при просмотре Amazon. На основании прошедших поведений или предпочтений других пользователей двигатель может предсказать аналогичный выбор.
  • Гибридные рекомендации : Наконец, нет причин, по которым мы не можем комбинировать два или более из вышеупомянутых рекомендаций. Фактически, гибридные рекомендации обычно используются в реальных применениях, поскольку исследования показали, что могут создавать более точные предложения. Новые музыкальные рекомендации Spotify – это один хороший пример этого подхода. Например, сначала мы возьмем список популярных песен в этом месяце (рекомендую по популярности) и предложить только песни, которые похожи на жанрах и художниках (рекомендация на основе контента).

В этом руководстве мы собираемся построить механизм совместной фильтрации двигателя.

О наборе данных

DataSet содержит 84 786 рейтингов от 7 950 пользователей на 3161 подъема в Неваду, США, где расположен известной красной каньонской зоны каньона. Причина, по которой невада была выбрана, была просто потому, что я поднялся там в течение нескольких сезонов.

Рейтинги пользователей были извлечены с MountainProject.com с анонимными идентификаторами пользователя.

Давайте загрузим наши данные в DataFrame Pandas.

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)

Выход:

Там у нас есть! Список популярных взрослых в красных породах. Если вы посещали область ранее, вы определенно распознаете эти имена.

Понять совместную фильтрацию

В совместной фильтрации мы находим «единомышленники» альпинистов на основе рейтингов или предпочтений, которые они дали для восхождения на маршруты.

Давайте рассмотрим два мультизных подъема, NightCrowler и Дракон которые получили 4-звездочные оценки от альпиниста Тамары. Если вы также дали им высокие рейтинги, мы можем сказать, что два альпиниста имеют высокую оценку сходства. Ради этого примера, если Тамара дает еще один подъем 3 или 4 звезды, шансы, вам также понравится подъем и наоборот.

Это принципиальная идея для совместной фильтрации! Интуитивно понятное и простое, верно? На самом деле, вы можете рассчитать это оценку сходства вручную или с помощью библиотеки Python. Чем выше число, тем больше «единомышленников» двух альпинистов.

Поверьте, или нет, таблица выше может быть представлена в Python в качестве 2-D массива (матрица). Мы будем использовать Сходство косинуса , общий и простой способ расчета сходства.

# 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]]

Мы также можем рассчитать сходство косина на более чем двух маршрутов. Допустим, Тамара не любила кошку в шляпе и дала ему 1-звездочку.

import sklearn.metrics.pairwise as pw

tamara = [[4,4,1]] 
you = [[3,4,3]] 

pw.cosine_similarity(tamara, you)
# Result = [[0.94947403]]

Сходство косинуса падает от 0,989949449 до 0,94947403.

Теперь вы видите, мы можем расширить вышеупомянутую логику, чтобы принять во внимание другие тысячи подъемов и рейтингов пользователей. Математика, конечно, усложняется, поскольку размер матрицы увеличивается. Возьмите глубокий вдох, как будто вы 1 метр выше последнего болта! Мы собираемся использовать Сюрприз Библиотека обучения машины Python, чтобы помочь нам построить нашу рекомендательный двигатель.

Сходство косинуса это только один из многих способов найти похожие предметы. Сюрпризная рекомендация Библиотека поддерживает:

  • Косинальное сходство
  • Коэффициенты корреляции Пирсона
  • Средняя квадратная разница

1. Загрузите файл данных

Этот шаг является повторением предыдущего раздела для непрерывности.

import pandas as pd, numpy as np 
df = pd.read_csv("./openbeta-ratings-nevada.zip", compression="zip") df.sample(5)

Выход:

2. Создать модель прогнозирования

В этом примере мы используем К-ближайшие соседи алгоритм для создания нашего прогнозирования модели. По сути, код COSINALITY SCOLATIONS COSINALITYS, как то, что мы только что сделали ранее, но он усердно работает на наборе данных, а также рейтинг подъема на счет сходства.

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 
...

Понимание набора поездов и набор тестов Вам может быть задается вопросом о значениях RMSE (ошибки корневых средних квадратных ошибок) и почему есть для цикла и необходимость разделить набор набора на набор и тестовый набор?

Рассмотрим наш предыдущий рейтинг примера. В идеальном мире рекомендательный двигатель может предсказать с высокой точностью, если Tamara дает другой маршрут высокий рейтинг, вам также понравится этот маршрут.

Чтобы измерить точность прогнозирования, алгоритм разбивает набор данных на несколько небольших наборов, в которых он «притворяется на том, что он не знает, что некоторые из рейтингов альпинистов дали и сравниваем фактические рейтинги против прогнозируемых ценностей. RSME – это мера отклонения.

Набор поездов : Подмножество набора данных, используемого для расчета сходства и прогнозирования или «поезда» модели прогнозирования. Тестовый набор : Подмножество набора данных, где вы применяете модель прогнозирования из набора поездов и точности прогнозирования прогнозирования.

Примеры: Тестовый набор 1 – Сравните 3 (фактическое) с прогнозируемой стоимостью.

Тестовый набор 2 – Сравните 4 (фактическое) с прогнозируемой стоимостью.

3. Давать рекомендации

Пришло время ответить на отличный вопрос, альпинисты, которые понравились Эпинефрин Также понравилось …

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]

Домен ID против неожиданного ID Для эффективности алгоритм прогнозирования преобразует наш набор данных в другую структуру данных (скорее всего, в какую-то матрицу) и работать с данными по их внутренним идентификаторам.

Сюрприз библиотека предоставляет два функция помощника для преобразования одного к другому.

  • TRAINESET.TO_INNER_IID (MARTE_I) – Преобразовать определенный доменный идентификатор на внутренний идентификатор.
  • TRAINESET.TO_RAW_IID (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)

Выход:

Вот и все. Мы только что построили простой двигатель рекомендации подъема для красного каньона с помощью Python Surprise Lib. Вы можете дополнительно точно настроить двигатель, предлагая подъемами трудностями и типами (Trade vs Sport). Это тема для будущей статьи. Веселиться и быть в безопасности!

Если вам понравится этот учебник и хочу увидеть больше, подобное, убедитесь, что дайте ему ♥ Спасибо!

Jupyter Notebook для этого учебника есть Доступно на Github Отказ

Автор и друзья, восхождение на дракона (5.11a)

Оригинал: “https://dev.to/vnugent/building-a-rock-climbing-route-recommendation-engine-3mdj”