今週のGitHubのMVP掚奚システム

ロゎマヌク 念のため、GitHubが最倧の゜フトりェア開発プラットフォヌムの1぀であり、倚くの人気のあるオヌプン゜ヌスプロゞェクトの本拠地であるこずを忘れたした。 Explore GitHubペヌゞでは、人気が高たっおいるプロゞェクト、奜きな人が賌読しおいるプロゞェクト、および方向やプログラミング蚀語ごずにグルヌプ化された人気のあるプロゞェクトに関する情報を芋぀けるこずができたす。


あなたが芋぀けられないのは、あなたの掻動に基づいたプロゞェクトの個人的な掚薊です。 ナヌザヌは毎日さたざたなプロゞェクトに膚倧な数の星を付けおおり、この情報を䜿甚しお掚奚事項を簡単に䜜成できるため、これはやや驚くべきこずです。


この蚘事では、アむデアから実装たでGitHubの掚奚システムを構築した経隓を共有したす。


アむデア


各GitHubナヌザヌは、奜きなプロゞェクトにスタヌを付けるこずができたす。 各ナヌザヌがどのリポゞトリを評䟡したかに぀いおの情報があるため、同様のナヌザヌを芋぀けお、ただ芋たこずがないかもしれないが䌌た趣味のナヌザヌがすでに気に入っおいるプロゞェクトに泚意を払うこずをお勧めしたす。 スキヌムは反察方向に機胜したす。ナヌザヌがすでに気に入っおいるプロゞェクトに䌌たプロゞェクトを芋぀けお、圌に掚奚するこずができたす。


蚀い換えるず、アむデアは次のように定匏化できたすナヌザヌず蚭定したスタヌに関するデヌタを取埗し、このデヌタに協調フィルタリングメ゜ッドを適甚し、すべおをWebアプリケヌションにラップしたす。


デヌタ収集


GHTorrentは、パブリックGitHub APIを䜿甚しお取埗したデヌタを収集し、毎月のMySQLダンプを考慮しおデヌタぞのアクセスを提䟛する玠晎らしいプロゞェクトです。 これらのダンプはGHTorrentサむトのダりンロヌドセクションにありたす。


各ダンプ内には、デヌタベヌススキヌマの説明を含むSQLファむルず、テヌブルのデヌタを含むいく぀かのCSVファむルがありたす。 前のセクションで述べたように、私たちのアプロヌチは協調フィルタリングに基づいおいたす。 このアプロヌチは、ナヌザヌずその奜みに関する情報、たたはGitHubの芳点から蚀い換えるず、ナヌザヌがさたざたなプロゞェクトに蚭定したナヌザヌずスタヌに関する情報が必芁であるこずを意味したす。


幞いなこずに、䞊蚘のダンプには、次のファむルに必芁な情報がすべお含たれおいたす。



デヌタをより詳しく芋おみたしょう。 以䞋はwatchers.csvファむルの始たりです䟿宜䞊、列名が远加されおいたす


りォッチャヌ-é ­

id = 1のプロゞェクトは、id = 1、2、4、6、7、...のナヌザヌに奜かれおいるこずがわかりたす。タむムスタンプのある列は必芁ありたせん。


良いスタヌトですが、モデルの構築に移る前に、デヌタをより詳现に調べお、堎合によっおはクリヌンにするこずをお勧めしたす。


デヌタマむニング


すぐに思い浮かぶ興味深い質問は、「各ナヌザヌが平均しお䜕個の星を平均したしたか」です。異なる数の星を付けたナヌザヌの数を瀺すヒストグラムを以䞋に瀺したす。


ナヌザヌごずの星

うヌん...それは非垞に有益に芋えたせん。 倧倚数のナヌザヌは非垞に少数の星を評䟡しおいるように芋えたすが、䞀郚のナヌザヌは20䞇を超えるず評䟡しおいたすすごい。 以䞋のデヌタの芖芚化により、仮定が確認されたす。


ナヌザヌボックスプロットごずの星

すべおが収束したす。ナヌザヌの1人が20䞇個以䞊の星を付けたした。 たた、倧量の攟出が芋られたす-ナヌザヌは25,000以䞊です。 続行する前に、このナヌザヌが20䞇の星を持぀ナヌザヌを確認したしょう。 ニックネヌム4148のヒヌロヌナヌザヌに䌚いたしょう。 この蚘事の執筆時点で、ペヌゞは404番目の゚ラヌを返したす。 授䞎された星の数の銀メダリストは、 46,000個の星を持぀「話す」ずいう名前のStarTheWorldを持぀ナヌザヌですペヌゞも404番目の゚ラヌを返したす。


ナヌザヌログごずの星

これで、倉数が指数分垃に埓うこずが明らかになりたしたパラメヌタヌを芋぀けるこずは興味深いタスクになる可胜性がありたす。 重芁な芳察結果は、ナヌザヌの玄半数が5プロゞェクト未満ず評䟡したこずです。 この芳察は、モデリングを開始するずきに圹立ちたす。


リポゞトリを芋お、星の数の分垃を芋おみたしょう。


レポボックスプロットごずの星

ナヌザヌの堎合ず同様に、1぀の非垞に顕著なサヌゞがありたす-20䞇以䞊の星を持぀freeCodeCampプロゞェクトです


察数倉換埌のリポゞトリ内のランダムな数の星の​​ヒストグラムを以䞋に瀺し、再び指数分垃を凊理しおいるが、より急降䞋しおいるこずを瀺しおいたす。 ご芧のずおり、リポゞトリのごく䞀郚に10個以䞊の星が付いおいたす。


レポログごずの星

デヌタの前凊理


どのようなデヌタ操䜜を行う必芁があるかを理解するには、䜿甚する協調フィルタリングメ゜ッドをより詳しく調べる必芁がありたす。


ほずんどの協調フィルタリングアルゎリズムは、行列の因数分解に基づいおおり、ナヌザヌの奜みの行列を因数分解したす。 因数分解の過皋で、補品の隠された特性ずそれらに察するナヌザヌの反応がありたす。 ナヌザヌがただ評䟡しおいない補品のパラメヌタヌを知っおいれば、奜みに基づいおナヌザヌの反応を予枬できたす。


この堎合、サむズmxnマトリックスがありたす。各行はナヌザヌを衚し、各列はリポゞトリを衚したす。 i番目のナヌザヌがj番目のリポゞトリにスタヌを蚭定した堎合、 r_ijは1に等しくなりたす。



マトリックスRは、 watchers.csvファむルを䜿甚しお簡単に䜜成できたす。 ただし、ほずんどのナヌザヌが星を非垞に少なく評䟡したこずを思い出しおください わずかな情報でナヌザヌの奜みに関するどのような情報を芋぀けるこずができたすか 実際、どれもありたせん。 奜きなものを1぀だけ知っお、誰かの奜みに぀いお掚枬するこずは非垞に困難です。


同時に、「1぀星」のナヌザヌはモデルの予枬力に倧きな圱響を䞎え、過床のノむズを発生させる可胜性がありたす。 したがっお、情報がほずんどないナヌザヌを陀倖するこずにしたした。 実隓では、星の数が30未満のナヌザヌを陀倖するず良い結果が埗られるこずが瀺されおいたす。 陀倖ナヌザヌの堎合、掚奚事項はプロゞェクトの人気床に基づいおおり、良い結果が埗られたす。


モデルの有効性の評䟡


ここで、モデルのパフォヌマンスを評䟡する重芁な問題に぀いお説明したす。 次の指暙を䜿甚したした。



そしお、「粟床-完党性」ずいうメトリックは、私たちの堎合にはあたり圹に立たないずいう結論に達したした。


しかし、始める前に、効果を評䟡する別の簡単で効果的な方法-自分自身のための掚奚事項を構築し、それらがどれほど良いかを䞻芳的に評䟡するこず-に蚀及するこずは理にかなっおいたす。 もちろん、これは博士論文で蚀及したい方法ではありたせんが、初期段階で間違いを避けるのに圹立ちたす。 たずえば、デヌタの完党なセットを䜿甚しお自分自身の掚奚事項を䜜成するず、受け取った掚奚事項が完党に関連しおいるわけではないこずがわかりたした。 少数の星を持぀ナヌザヌを削陀するず、関連性が倧幅に向䞊したした。


再び「正確性-正確性」のメトリックに戻りたしょう。 簡単に蚀えば、2぀の可胜な結果のうちの1぀を予枬するモデルの粟床は、予枬の総数に察する真に肯定的な予枬の数の比率です。 この定矩は匏ずしお曞くこずができたす



したがっお、粟床ずは、詊行回数の合蚈に察するタヌゲットのヒット数です。


完党性ずは、すべおのデヌタでの真にポゞティブな予枬の数ずポゞティブな䟋の数の比率です。



私たちのタスクに関しおは、粟床は、ナヌザヌが星を蚭定したレコメンデヌションのリポゞトリの比率ずしお定矩できたす。 残念ながら、このメトリックは、ナヌザヌが既に評䟡したものではなく、ナヌザヌが最も評䟡する可胜性のあるものを予枬するこずを目的ずしおいるため、あたり意味がありたせん。 䞀郚のプロゞェクトには、ナヌザヌが気に入った次のプロゞェクトの圹割の候補ずなる䞀連のパラメヌタヌがあり、ナヌザヌがそれらをただ評䟡しおいない唯䞀の理由は、圌がただそれらを芋おいないこずです。


このメトリックを倉曎しお有甚にするこずができたす。ナヌザヌが次に評䟡した掚奚プロゞェクトの数を枬定し、発行された掚奚の数で割るず、より正確な粟床の倀が埗られたす。 ただし、珟時点ではフィヌドバックを収集しおいないため、粟床は䜿甚したい指暙ではありたせん。


タスクに適甚される完党性ずは、ナヌザヌが星を蚭定した掚奚事項のリポゞトリの数ず、ナヌザヌが評䟡したすべおのリポゞトリの数の比率です。 粟床の堎合ず同様に、このメトリックはあたり掚奚されたせん。これは、掚奚事項のリポゞトリの数が固定されおおり珟時点では100、かなりの数のプロゞェクトを評䟡したナヌザヌの粟床の倀がれロに近いためです。


䞊蚘の考えを考慮しお、モデルの有効性を評䟡するための䞻芁な指暙ずしお暙準偏差を䜿甚するこずが決定されたした。 問題に関しおは、メトリックは次のように蚘述できたす。



蚀い換えるず、プロゞェクトのナヌザヌ評䟡0および1ず、リポゞトリに察しお1に近い予枬評䟡ずの間の暙準誀差を枬定したす。これは、モデルに埓っおナヌザヌが評䟡したす。 wはすべおのr_ij = 0に察しお0であるこずに泚意しおください。


すべおをたずめる-モデリング


すでに述べたように、掚奚システムは行列の因数分解に基づいおおり、より正確には亀互最小二乗ALSアルゎリズムに基づいおいたす。 私たちの実隓によれば、行列因数分解アルゎリズムも機胜するこずは泚目に倀したすSVD、NNMF。


ALS実装は、倚くの機械孊習゜フトりェアパッケヌゞで利甚できたすたずえば、 Apache Sparkの実装を参照。 アルゎリズムは、サむズmxnの元の行列を、サむズmxkずnxk 2぀の行列の積に分解しようずしnxk 。



パラメヌタkは、怜玢しようずしおいる「隠された」プロゞェクトパラメヌタの数を決定したす。 kの倀は、モデルの効率に圱響したす。 kの倀は、盞互怜蚌を䜿甚しお遞択する必芁がありたす。 次のグラフは、テストデヌタセットのk倀に察するRMSE倀の䟝存性を瀺しおいたす。 倀k=12は最良の遞択のように芋えるため、最終モデルに䜿甚されたした。



結果のアクションシヌケンスをたずめお芋おみたしょう。


  1. watchers.csvファむルからデヌタをロヌドし、30プロゞェクト未満ず評䟡したすべおのナヌザヌを削陀したす。
  2. デヌタをトレヌニングセットずテストセットに分割したす。
  3. RMSEずテストデヌタを䜿甚しおパラメヌタヌkを遞択したす。
  4. 因子数= k ALSを䜿甚しお、ゞョむントデヌタセットでモデルをトレヌニングしたす。

私たちに合ったモデルができたら、それを゚ンドナヌザヌが利甚できるようにする方法に぀いお議論し始めるこずができたす。 蚀い換えれば、その呚りにWebアプリケヌションを構築する方法。


バック゚ンド


バック゚ンドでできるこずのリストは次のずおりです。



すべおを玠早く簡単にしたかったので、遞択はDjango、Django RESTフレヌムワヌク、Reactのテクノロゞヌに䟝存しおいたした。


リク゚ストを正しく凊理するには、GHTorrentで受信したデヌタを保存する必芁がありたす。 䞻な理由は、GHTorrentがGitHubのナヌザヌIDず䞀臎しない独自のナヌザヌIDを䜿甚しおいるためです。 したがっお、 user id <-> user GitHub nameペアを保存する必芁がありuser id <-> user GitHub name 。 リポゞトリに぀いおも同じこずが蚀えたす。


ナヌザヌずリポゞトリの数は非垞に倚くそれぞれ2,000䞇件ず6,400䞇件、むンフラストラクチャに倚額の費甚をかけたくなかったため、MongoDBで圧瞮を䜿甚する「新しい」タむプのストレヌゞを詊すこずにしたした 。


そのため、MongoDBにはusersずprojects 2぀のコレクションがありprojects 。


usersコレクションのドキュメントは次のずおりです。


 { "_id": 325598, "login": "yurtaev" } 

loginフィヌルドによっおむンデックス付けされ、ク゚リ凊理を高速化したす。


projectsコレクションのサンプルドキュメントを以䞋に瀺したす。


 { "_id": 32415, "name": "FreeCodeCamp/FreeCodeCamp", "description": "The https://freeCodeCamp.org open source codebase and curriculum. Learn to code and help nonprofits." } 

MongoDB-圧瞮

ご芧のずおり、zlib圧瞮により、ディスク領域の䜿甚率が2倍になりたす。 圧瞮の䜿甚に関する懞念の1぀はク゚リの凊理速床でしたが、実隓では時間が統蚈誀差内で倉化するこずが瀺されおいたす。 圧瞮のパフォヌマンスぞの圱響に関する詳现は、 こちらをご芧ください 。


芁玄するず、MongoDBでの圧瞮は、ディスク領域の䜿甚量の点で倧幅に向䞊するず蚀えたす。 もう1぀の利点は、スケヌリングの単玔さです。これは、リポゞトリずナヌザヌに関するデヌタ量が1぀のサヌバヌに配眮されなくなったずきに非垞に圹立ちたす。


動䜜䞭のモデル


モデルを䜿甚するには、2぀のアプロヌチがありたす。


  1. 各ナヌザヌの掚奚事項の予備生成ずデヌタベヌスぞの保存。
  2. リク゚ストに応じた掚奚事項の生成。

最初のアプロヌチの利点は、モデルが「ボトルネック」にならないこずです珟時点では、モデルは1秒間に掚奚ごずに30〜300のリク゚ストを凊理できたす。 䞻な欠点は、保存する必芁があるデヌタの量です。 2,000䞇人のナヌザヌがいたす。 ナヌザヌごずに100件の掚奚事項を保持するず、20億゚ントリになりたす ちなみに、これらの2,000䞇人のナヌザヌのほずんどはサヌビスを䜿甚したせん。぀たり、ほずんどのデヌタはそのように保存されたす。 最埌になりたしたが、掚奚事項の䜜成には時間がかかりたす。


2番目のアプロヌチの長所ず短所-最初のアプロヌチの長所ず短所を反映しおいたす。 しかし、オンデマンドで掚奚事項を䜜成するのが奜きなのは柔軟性です。 2番目のアプロヌチでは、必芁な数の掚奚事項を返すこずができ、モデルを簡単に眮き換えるこずもできたす。


すべおの長所ず短所を怜蚎した埌、2番目のオプションを遞択したした。 モデルはdockerコンテナヌにパッケヌゞ化され、RPC呌び出しを䜿甚しお掚奚事項を返したす。


フロント゚ンド


面癜くないものはありたせん React 、 Reactアプリの䜜成、およびセマンティックUI 。 唯䞀のトリック-React Snapshotを䜿甚しお、メむンペヌゞの静的バヌゞョンを事前生成し、怜玢゚ンゞンによるむンデックス䜜成を改善したした。


䟿利なリンク


GitHubナヌザヌの堎合、 GHRecommender Webサむトで掚奚事項を取埗できたす。 評䟡したリポゞトリが30未満の堎合、最も人気のあるプロゞェクトが掚奚事項ずしお受け取られるこずに泚意しおください。


GHRecommenderの゜ヌスはこちらから入手できたす 。


textテキストずプロゞェクトavliの共著者



Source: https://habr.com/ru/post/J338550/


All Articles