ロッククライミングルート勧告エンジンの構築


「ラスベガスでもっと時間を過ごすために、ラスベガスに行くんだ」あなたがロッククライマーでない限り、誰もこれまで言いませんでした.

Pythonの推奨エンジンをビルドするクライマーガイド


第1部紹介


推薦エンジンや推薦システムは、音楽、映画、製品の推奨事項から、現在のイベントやニュースの種類に我々が示すように、どこにでもあります.
ロッククライマー自身が登山勧告エンジンを構築することができます場合、それはクールかもしれませんが、似て面白い登山を発見するには?
このチュートリアルを読んだ後、Pythonでこのようなエンジンをビルドできます.

Note: Jupyter notebook for this tutorial is available on Github.


始める前に、推薦エンジンを構築する一般的な方法を4つレビューしましょう.

  • 人気ベースの推奨:すべての最も簡単です.あなたはビデオの表示数や曲のプレイ数などのいくつかの基準に基づいてアイテムのリストを作成します.Twitterのトレンドトピックやredditコメントは、このアプローチの良い例です.

  • コンテンツベースの推奨:このタイプのシステムは、入力として1つの項目を取り、特性のセットに基づいて同様の項目を提案します.たとえば、映画を与えられて、推薦エンジンはジャンル、ディレクターと俳優に基づく類似した映画を見つけます.

  • 共同のフィルタリング推薦:あなたは、アマゾンを閲覧するとき、「Xをした人々もY」提案を見たかもしれません.過去の行動や他のユーザーの好みに基づいて、エンジンは同様の選択肢を予測することができます.


  • ハイブリッド推薦者:最後に、我々が上記の推薦者の2つ以上を結合することができない理由が、ありません.実際、ハイブリッド研究者は、彼らがより正確な提案をすることができることを示すように、現実世界のアプリケーションで一般的に使用されます.Spotifyの新しい音楽の推奨事項は、このアプローチの1つの良い例です.たとえば、まず、今月の人気曲(人気ベースの推薦)のリストを取るし、ジャンルやアーティスト(コンテンツベースの推薦)に似ている曲だけをお勧めします.
  • このチュートリアルでは、協調フィルタリング推薦エンジンを構築します.

    データセットについて


    データセットには、有名なレッドロックキャニオンクライミングエリアがある米国ネバダ州の3161号登山の7950ユーザーから84786の評価が含まれています.ネバダが選ばれた理由は、私が数シーズン、そこに登ったからです.
    ユーザ評価は山岳プロジェクトから抽出した.ユーザーIDを匿名でCOM.
    データをパンダデータにロードしましょう.
    import pandas as pd 
    
    df = pd.read_csv("./openbeta-ratings-nevada.zip", compression="zip")
    df.sample(5)
    
    出力:

    人気の高い登山
    我々が見ることができる1つの基本的なメトリックはどのように登山は、彼らが受けた評価の数を数えることによって人気でランク付けされています.
    # 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つ星評価を受けたドラゴンを考慮しましょう.あなたが彼らに高い評価を与えたならば、我々は2つの登山者が高い類似点を持つと言うことができます.この例のために、タマラがもう3つまたは4つの星を与えるならば、可能性はあります、あなたは登山とその逆も好きです.

    これは、協調フィルタリングの背後にある原則のアイデアです!直感的でシンプルな、右?実際には、手でこの類似点スコアを計算することができますまたはPythonライブラリの助けを借りて.数が高くなればなるほど、2人の登山者は「似ている」.
    信じているかどうかは、上記のテーブルを2 D配列としてPythonで表現することができます.類似性を計算するために共通の簡単な方法であるcosine類似性を用いる.
    # 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]]
    
    また、2つ以上のルートについてコサイン類似度を計算することもできます.タマラが帽子で猫を嫌って、1つの星を与えたと言いましょう.

    import sklearn.metrics.pairwise as pw
    
    tamara = [[4,4,1]] 
    you = [[3,4,3]] 
    
    pw.cosine_similarity(tamara, you)
    # Result = [[0.94947403]]
    
    コサイン類似度は、0.9494749から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

    パートII -建物推薦エンジン


    1 .データファイルの読み込み


    このステップは、連続性のための前のセクションの繰り返しです.
    import pandas as pd, numpy as np 
    df = pd.read_csv("./openbeta-ratings-nevada.zip", compression="zip") df.sample(5)
    
    出力:

    予測モデルの作成


    この例では,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.


    驚きのライブラリは、1つを別のに変換する2つのヘルパー機能を提供します.
  • 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)
    
    出力:

    オフベレー


    それです.我々は、ちょうどパイレーツサリリブの助けを借りて、レッドロックキャニオンのための簡単な登山勧告エンジンを構築しました.さらに、難易度とタイプ(trad対スポーツ)で登山を示唆して、エンジンを微調整することができます.それは将来の記事のトピックです.楽しさと安全を!
    あなたがこのチュートリアルが好きで、これのようにより見たいならば♥ ありがとう

    Jupyter notebook for this tutorial is available on Github.



    竜と竜に登る