Kaggle

機械学習を使って630万件のレビューに基づいたアニメのレコメンド機能を作ってみよう(機械学習 k近傍法 初心者向け)

  • このエントリーをはてなブックマークに追加

「この商品を購入したお客様はこちらも一緒にお買い上げいただいてます」「このビデオを見た方はこちらも見てます」。このようなオススメをされた経験はありませんか?これらは、「レコメンド機能(レコメンドエンジン)」と呼ばれるもので、近年ではインターネット上の様々なECやサービスで使われています。

レコメンド機能ですが、実にありとあらゆる業種で活用されています。

  • 商品(EC)
  • 映画
  • 音楽
  • ニュース
  • 動画
  • …その他多数

今回の機械学習初心者向けチュートリアルでは、k近傍法(K-nearest neighbor)というアルゴリズムを利用して、アニメのレコドメンド機能をPythonを使って一緒に構築してみましょう!

レコメンド機能(エンジン)とは?

まずは、このレコメンド機能とは何かについて一緒に紐解いていきましょう。レコメンド機能とは、データを活用して顧客やユーザーに「お勧め」を提供する情報フィルタリングシステムです。

冒頭でも触れましたが、顧客それぞれの興味や購入履歴に基づいている事から、それぞれの顧客の趣味嗜好に合わせたユーザー体験を提供することが可能な訳です。優秀なレコメンド機能は、ユーザー体験を改善することにより、多くの売上を生み出し、さらには顧客満足度を高めることに大いに役立ちます!

企業は、より優秀なレコメンド機能を構築するために、非常に多くのデータを集めています。集めたデータの量と質により、レコメンド機能の精度が上がることで、より大きな売上と高い顧客満足度へ直結するためです。

ちょっと想像して見てください。もしあなたに機械学習の師匠とも呼べる親しい先輩がいたとして、その先輩が機械学習入門書をお勧めしてくれたら、かなり高い確率でその書籍を購入することを検討しますよね?

なぜなら、あなたは、その先輩の機械学習の知識を信頼している訳ですし、さらには、先輩があなたの機械学習の知識量を知っていることを分かっているため、自分にはその入門書が適切だと考える訳です。

このような「お勧めのプロセス」と似たような体験を、企業は「レコメンド機能」として提供している訳です。ただし、大きな違いとしては、個人的なつながりのある「先輩」の代わりを、膨大かつ多種多様なデータで代用しているのです。

「レコメンド機能」または、その機能の中核となる「レコメンドエンジン」は、多種多様なビジネスに大きな利益をもたらす重要な機能となっており、機械学習の技術が大きく活用されている分野です!

レコメンドエンジンの2つの種類

レコメンド機能の中核となるのが、レコメンドエンジンな訳ですが、大きく分類すると2つの種類があります。ここでは、この2種類のレコメンド機能の概要と、それぞれのメリット/デメリットを簡単に見ていきましょう。

ソース:こちら

英語ではありますが、上記の図を見ながら考えてみましょう。レコメンドエンジンには「協調フィルタリング(Collaborative Filtering)」と「コンテンツに基づくフィルタリング(Content-Based Filtering)」の2種類があります。

協調フィルタリングとは?

協調フィルタリングとは、コミュニティー全体を基にしたレコメンドシステムで、あなたの趣味嗜好や興味が、反映される形のレコメンドエンジンとなります。協調フィルタリングは、あなたの趣味嗜好と類似しているユーザーを探し出して、そのユーザー達の嗜好に基づいて、オススメを行います

AmazonなどのECサイトの多数では、ユーザーの事細かな情報を持っていますよね。例えば年齢や、住所、商品の購入履歴からレビューなどなど。協調フィルタリングでは、このような各ユーザーの行動(データ)に基づいて、類似したデータを用いることでオススメが可能なわけです。

もっと簡単に言えば、例えばあなたが犬の首輪を購入して、次にトイレットペーパーを購入したとします。この2つの商品を購入したユーザーの情報を分析したところ、「USBメモリ」の購入の確率が高いことが判明したので、あなたにUSBメモリの購入をオススメする流れが「協調フィルタリング」です。(あくまで例です笑)

上記の例を見ても分かる通り、非常に強力なレコメンドエンジンだと思われますが、実は弱点もあります。協調フィルタリングの主な弱点としては、「新しいユーザー」に弱いことです。これは、上の具体例を考えてみると分かりやすいですが、ユーザーへオススメするためのデータが不足しているので、オススメが出来ない(または極端に精度が悪い)わけです。

今回の記事では、この「協調フィルタリング」の仕組みを利用したレコメンド機能を構築します。

コンテンツに基づくフィルタリングとは?

では、もう一方のレコメンド機能も軽く見てみましょう。先の協調フィルタリングでは、「コミュニティ全体の動きに基づいて」オススメを行いましたが、こちらは「あなたの履歴と類似性に基づいて」推薦をしてくれます。

具体的な例で考えてみましょう。例えば、本屋さんのアンケートで「SF」が好きだと答えたとしましょう。そうすると、当然ですが、この書店から届くオススメは「SF」または「SFに類似したカテゴリ」の書籍となる訳ですよね。

このコンテンツに基づくフィルタリングでは、ユーザーが「SF」が好きだと言っているのに、いきなり「料理のレシピ本」のオススメはしない訳です。

このように、このシステムでは以前に好きだった(または購入した)アイテムの特性をみて、それらに似たアイテムを推薦してくれます。例えばECで機械学習の本を購入して高い評価を残したら、そのあとに、そのサイトからオススメされる書籍が機械学習関連になりますよね。

まとめると、「協調フィルタリング=類似したユーザーに基づいて推薦」で、「コンテンツに基づくフィルタリング=あなたの履歴に基づいて類似性のある商品を推薦」となります。参考までにですが、この2つのレコメンドエンジンを合体させた「ハイブリッド」を利用しているケースもあります。

企業におけるレコメンド機能の実例

次は、実際に企業で使われているレコメンド機能の実例について紹介させていただきます。冒頭でも触れた通り、レコメンド機能は、売上や顧客満足に密接に関わることから、多くの企業で使われています。

ここで紹介するのはごく一部ですが、特に優れているレコメンドエンジンの実例として見ていきましょう。

【実例1】アマゾン

レコメンド機能の先駆者とも言われるアマゾンですが、サイト内の様々な箇所でレコメンド機能がフル活用されています。下の図ですが、アマゾンで「深層学習」の書籍の詳細ページに表示されているものです。

赤枠で囲っている部分がレコメンド機能で表示されている項目です。図を見れば一目で分かりますが、他のユーザーの購入履歴を基に、この「深層学習」の本と一緒に購入されている書籍をセットでオススメしてくれますし、さらには自身の購入履歴に基づいて、私が購入しそうな商品をオススメしてくれます。

このように、機械学習とユーザー購買履歴データを活用することで、非常にパワフルなツールとなります。一昔前までは、多くのサービスで、単純に「プログラミング」のカテゴリに該当する書籍を推薦していましたが、機械学習を活用することにより、より的確なオススメが可能になる訳です。

【実例2】ネットフリックス

Netflix(ネットフリックス)もレコメンド機能を活用している企業として、頻繁に引き合いに出されます。利用されている方も多いと思いますが、ネットフリックスとは、テレビ番組や映画などをインターネットで視聴できる動画サービスです。

ユーザーがNetflixへログインをすると、トップページで表示される動画は各ユーザーごとに異なります。これは、そのユーザーの視聴履歴、さらに、ユーザー全体のトレンドやあなたとの類似性などに基づいて「オススメの番組/動画」が随時表示される訳です。

米Netflixでは機械学習エンジニアお馴染みの「Kaggle(カグル)」で100万ドル(約1億円)の賞金をかけて、この協調フィルタリング(レコメンド機能)の精度を競うコンペを開催したこともあります。Netflixは、480,189ユーザーの17,770個の映画における、1億個のレビューをデータセットとして公開して、彼らが利用しているレコメンドエンジンの精度を10%向上することを目的としてコンペを実施していました。(参考:Kaggleとは

Netflixにとって、レコメンド機能が10%向上することは、賞金の約1億円よりも価値が高いと考えている訳です。レコメンド機能がビジネスに対して大きな成果をもたらしている証拠かと思います。

【実例 3】YouTube

レコメンド機能の実例の3つ目はYouTubeの活用事例を紹介します。YouTubeを見ていると、「関連する動画」として、様々な動画を紹介してくれますよね?これも機械学習をフル活用した、最先端のレコメンド機能の良い事例です。

おそらくYouTubeを利用されているほとんどの方が、この「関連動画」の機能を使ったことがあるかと思います。今見ている動画に関連した動画はもちろん、例えば何かしらのシリーズであれば、その続編であったり、テイストが似たような動画だったりと、非常に便利な機能ですよね。

また、ユーザー個別にカスタマイズされているのも非常に実感できます。例えば、友達や知り合いのPCでYouTubeをブラジングすると気づくのですが、普段は自分用にカスタマイズされた「関連動画」ですが、他のPCだといつもと使い勝手が違うと感じるはずです。

ここで紹介したレコメンド機能はごく一部ですが、レコメンド機能と機械学習がビジネスにとってどれほど重要な役割を果たしてるかが、お判り頂けたかと思います。

では、実際にこのレコメンド機能をKaggleのデータセットを利用して構築して見ましょう!

データセットのについて(アニメお勧めデータベース)

まずは、本チュートリアルで利用するデータセットについて説明します。今回ですが、「Anime Recommendations Database(アニメお勧めデータベース)」という、myanimelist.netの76,000ユーザーのアニメのレビューデータを利用します。参考までにですが、このデータ元の「myanimelist.net」は、海外で有名なアニメのサイトで最新から古いタイトルまで非常に幅広いアニメのデータベースを取り揃えています。

このデータセットですが「anime.csv」と「ratings.csv」の2つのCSVファイルにより構成されています。2つのCSVファイルの概要は下記の通りです。

anime.csv 概要

  •  anime_id  各アニメのユニークID
  •  name  アニメタイトル
  •  genre  アニメの属するカテゴリ
  •  type  メディアタイプ(例:映画、テレビetc)
  •  episodes  アニメのエピソード数
  •  rating  最大10の平均レーティング
  •  members  当該アニメのグループに参加するユーザー数

ratings.csv 概要

  •  user_id  ユニークユーザーID
  •  anime_id  当該ユーザーがレートしたアニメID
  •  rating  当該ユーザーのレーティング

この2つのCSVファイルを利用してレコメンド機能を構築しましょう。このデータセットですが、おそらくアニメ関連で公開されているデータセットで一番規模が大きいものかと思います。

データの入手方法ですが、下記のKaggleページより会員登録後にダウロードが可能です。下記のリンクから、「rating.csv」と「anime.csv」のダウロードを行いましょう。

アニメデータのダウンロード(Kaggle – 英語)

Pythonでレコメンド機能を構築してみよう

ここからは実際にPythonを使って、k近傍方(k-nearest neighbor)のアルゴリズムを使用して、基本的な「協調フィルタリング」のレコメンドエンジンを構築しましょう!

本チュートリアルですがPython3.6と複数のオープンソースライブラリを使用しています。ライブラリに関しては、よほど古いバージョンでなければ、特に問題ないと思いますが、Pythonは2.xをお使いの方はPython 3.xを使用してください。

必要なライブラリのインポート

まずはお決まりですが、使うライブラリののインポートから行いましょう。ご自身の環境にこれらのライブラリがインストールされていない場合は、インストールが必要です。

環境の構築が面倒い方は、Amazon SageMaker(アマゾン・セージメーカー)もオススメです。SageMakerですが、アマゾンのクラウドで機械学習に必要なライブラリのほぼ全てがインストールされており、簡単に機械学習を始めることが可能です。(詳しくはSageMakerのこちらの記事をご参照ください)

次に、早速、CSVファイルをPandasのデータフレーム形式で読み込んであげましょう。CSVファイルですがKaggleのこちらのページからダウロードが可能です。また、ファイルを保存した先が異なる場合は、下記のコードでファイルパスも指定してあげましょう。

本チュートリアルで使用するNumpyなどのライブラリですが、機械学習では頻繁に使用されるツールです。今回、初めて使用される方は、下記の無料入門コースがオススメです!

データを確認して見ましょう

データの読み込みが完了したので、次はデータの探索をしてみましょう。機械学習では、初めて触るデータはざっくりといじってみて、どのようなデータなのかを把握する作業が一般的です。(詳しくは「探索的データ解析(EDA)」の記事をご覧ください)

まずは、おきまりの head() でデータの最初の5行を表示してみましょう。

次に、このanimeのデータフレームの members の値で並び替えをしてみましょう。この members の値ですが、各アニメの購読メンバー数となていますので、並び替えをすることにより、このデータセット内にあるアニメの中の人気順が把握できるかと思います。

タイトルが英語名なので少し見辛いですが、どうやらこのデータセットで最も購読メンバー数が高いのは「デス・ノート」のようです。2位に「進撃の巨人」、「ソードアート・オンライン」や「鋼の錬金術師」なども上位ですね。

次に describe() の関数を使って、基本統計量を確認してみましょう。

上の図の基本統計量のテーブルを見てみると、このデータの特性が見えてくるかと思います。例えば、 members の列を見て頂きたいのですが、こちらはmin(最小値)が5.0、max(最大値)が1013917となっています。最小値と最大値のレンジとしては、かなり大きく離れていますね。

また、このデータセット内のアニメの25%が225名以下の購読者数に対して、上位25%は9000名以上の購読者数がいます。人気のアニメとそうでないアニメの差が激しいのも確認できます。

次は同様にratingsのデータフレームの基本統計量も確認してみましょう。

上記の基本統計量のテーブルをみて、一つ特異なデータがあるのがわかります。 rating のカラムのmin(最小値)が-1とあります。レーティングですが、これはユーザーが各アニメにつけた評価ですよね?最小値の値が「-1」というのはデータとして特異なのが解るかと思います。

データセットの説明文を読んでみると、この「-1」ですが、「アニメを観たことがあるが、レーティング(評価)を付与しなかった」という意味とのことです。このように、データには様々な癖のようなものがあり、それらを最初の段階で把握するのは機械学習において非常に重要な作業です。

次は、このユーザーレーティング(アニメの評価値)のデータ分散を可視化して確認してみましょう。下記コードで、ratingのヒストグラムの生成を行います。(ヒストグラムなどの統計の基本知識が不安な方は、統計入門コースをご参考ください)

レーティングのヒストグラムを確認してみると、「-1」(見たけどレーティングなし)と「7以上」の値がデータのほとんどを占めているのが分かりますね。このように可視化をすることで、データの特性がより素早く確認することが可能です。

データの前処理をしよう

さて、データの一通りの確認ができたら、次はデータの前処理を行います。データの前処理とは、機械学習で利用する前にデータの処理を行うことで、機械が学習をスムーズに行えるようにする為の作業です。

まずはじめに、これから構築するレコメンドエンジンの質を向上する為、 members (当該のアニメのグループに所属しているユーザー数)が10,000以下のデータを足切りをしましょう。足切りすることにより、これから構築するレコメンド機能が、メンバー数が少ないアニメ(つまり比較的人気の低いアニメ)をオススメしないようになります。

*参考までにですが、今回は10,000という値を閾値(いきち)として選びましたが、この値は適当に決めた値であり、本来であれば、より詳細を確認しながら設定するものです。

次は、こちらも機械学習で定番の作業ですが、欠損値の処理を行いましょう。実際のプロジェクトなどで使うデータセットですが、殆どの場合でデータが「欠損(つまり欠けている)」います。完璧に全てのデータが揃っている方が珍しいくらいです。実際に機械学習のアルゴリズムを使ってモデルを構築する前に、この欠損したデータは何かしらの処理をしなくてはいけません。

今回のアニメのデータセットでも、非常に少ない割合ではありますが欠損が確認できます。欠損データの扱いですが、こちらも様々な処理方法がありますが、今回は一番単純な方法・・・削除をしましょう。

必要最低限ではありますが、これでanimeのデータのクリーニングが出来ましたので、次はratingのデータにも簡単な前処理を加えてあげましょう。

先のデータ確認の項目でやりましたが、ratingsのデータには「-1(見たけど評価しなかった)」が含まれています。まずは、この「-1」のデータを取り除きましょう。

念のため、改めてratingsの基本統計量を確認しておきましょう。

ご覧の通り先ほどはレーティングの最小値(min)が-1とありましたが、データの前処理を行いましたので「1」へと変わっているのが確認できます。不要なデータを取り除きましたが、まだ6,337,241件のレーティングと非常に膨大なデータが残っていますね!

次にanimeratingsのデータを「 anime_id 」を軸にして、「user_id」毎に切り分けてマージさせましょう。

これで、2つの異なるデータフレームが、ユーザーIDごとに切り分けられた一つのデータフレームとしてマージ(合体)しました。(参照:pandasの merge() は非常に重要な処理です。詳しくはPandas入門コースをご参照ください

参考までに、このマージさせたデータフレームの基本統計量も確認しておきましょう。

 count (データの個数)も揃ってますし、特に問題なさそうですね!

さて、ここまでいじってきたデータセットですが、今回のレコメンド機能に使うデータは「 user_id 」「 name 」「 rating_user 」の3項目のみです。データの前処理の最後の項目として、使わないデータ項目の削除と重複データのカットを行いましょう。

さて、次の処理ですが、 name (アニメのタイトル名)がデータフレームのインデックスに、 user_id をカラムとして、ピボットさせましょう。文字で見ると、いまいち分かりにくいかも知れませんが、実際にデータフレームを処理して見てみると分かるかと思います。

またピボットの処理と併せて、ユーザーが評価していないアニメに関しては  fillna(0) で「0」の値を入れてあげましょう。

こちらのピボットの処理ですが、アニメのタイトル名(name)をデータフレームのインデックスとして、各カラムがユーザーを表しています。当該のユーザーがレーティングをして入れば、数字が入っており、レーティングがないアニメに関しては「0」と値が入っています。簡単なイラストで表すと下記のような図です。

参考までにですが、このようにほとんどのデータの値が「0」となるような行列を「疎行列(そぎょうれつ – Sparse martrix)」と呼びます。

では、実際にピボット処理を行ったこの疎行列の最初の10行を表示させて見ましょう。

先ほど説明した通り、データフレームのindex(上記表でいう一番左の部分)がアニメのタイトルになっており、各列がユーザーのIDを表しているのが分かります。

k近傍法(k-nearest neighbors)でレコメンド機能を構築

さて、いよいよ本題のレコメンド機能の構築です!今回構築するレコメンド機能ですが、k近傍法(ケイ・きんぼうほう)というアルゴリズムを利用してモデルを構築します。k近傍法ですが英語の「k-nearest neighbor(ケイ・ニアレスト・ネイバー)」またはその頭文字を取って「KNN」と呼ばれることも多いので、覚えておくと便利かと思います。

では、このk近傍法とは一体どのようなアルゴリズムなんでしょうか?

k近傍法ですが最も単純なアルゴリズムと呼ばれており、クラスタリングのアルゴリズムの一種で、一般的に分類問題などで利用されます。今回のチュートリアルの例で考えると、とあるアニメのタイトルを入力した際に、そのアニメのneighbors(ご近所さん)を探して、距離が近い(類似性が高い)アニメのタイトルをオススメとして返してくれます。

かなりざっくりとした説明ですが、より詳しくk近傍法について調べて見たい方は、こちらのページをご参照ください。

では、実際にこのk近傍法のアルゴリズムと事前に処理したデータセットを使ってモデルを構築してみましょう!今回ですが、初心者向けのチュートリアルですので、Pythonの機械学習ライブラリ「Scikit-learn(またはSklearnとも呼ばれる)」を利用しましょう。

これで、モデルの構築と前処理したデータセットでの訓練が完了です!ライブラリを使うと、想像以上に簡単ですよね?では、いよいよ、この構築したアニメのレコメンド機能の実力を試してみましょう!

構築したレコメンド機能を試してみる

まず最初に、今回のデータセットですが全てアニメタイトルが英名で記載されており、探すのに一苦労しますので、簡単な検索機能を作ってあげましょう。試しに「hajime」で検索してみます。

タイトルに「hajime」を含むアニメの一覧が戻ってきましたね。 searchanime(”) にキーワードを入力すると、そのワードを含むアニメタイトルが戻ってきます。ご自身で色々なアニメで確認される際は、是非こちらの機能を使ってみてください。(文字ですが大文字小文字のケースセンシティブなのでご注意を)

では、いよいよ構築したレコメンド機能の実力を試してみましょう!アニメタイトルを入力すると、モデルは10個のオススメのアニメタイトルを返してくれるはずです。

まずは…私が個人的に好きな「はじめの一歩(Hajime no Ippo)」からみてみましょう!

う〜ん…ある意味正しいといえば正しいのですが、「はじめの一歩」と入力したら上位5位は全て「はじめの一歩」のシリーズがオススメとして返ってきています。結果としては少し面白みにかけましたが、「はじめの一歩」が好きな人にオススメするタイトルとしては、ある意味一番正しい答えのようにも感じます。

ちなみに、 distance とありますが、こちらの数値が低ければ低いほど、類似性が高い、つまりオススメ度が高いことを表しています。

では次は…個人的に大絶賛のアニメ「君の名は」で調べてみましょう!

おおお!レコメド機能が推薦してくれたのは・・

1位「僕だけがいない街」
2位「Re:ゼロから始める異世界生活」
3位「四月は君の嘘」
4位「ReLife」
5位「ワンパンマン」

「ワンパンマン」がランクインしていることで、色々と考えさせられる結果ではありますが(笑)、他のタイトルを見ても、個人的には「四月は君の嘘」以外は全て見たことがあり、かつ私の中では高評価なアニメです!「四月は君の嘘」に関しても、少し調べて見ましたが・・これは観てみたい!と思わされました。

と、いうことで・・今回のアニメレコメンドシステムですが、(個人的には) 合格点 かと思います!

まとめ

今回は機械学習ライブラリを使って、非常に単純なレコメンドシステムを構築してみました。いかがでしたでしょうか?決して、精度の高いレコメンド機能とは言えませんでしたが、これを土台として機械学習を活用したレコメンド機能の構築の最初の一歩になれば幸いです。

別種類の「コンテンツに基づくフィルタリング」のレコメンド機能に関しても、また後日、チュートリアルを予定しています。ご興味がある方は、 Twitterのフォローを頂けると幸いです。

また、他にも「ゲームの売上予測」や「タイタニック号の生存予測」など、初心者でも気軽に行える機械学習チュートリアルを公開していますので、是非、別のチュートリアルにも挑戦してみてください。

以上、「機械学習を使って630万件のレビューに基づいたアニメのレコメンド機能を作ってみよう」となります。チュートリアルに最後までお付き合い頂きまして、ありがとうございます!

  • このエントリーをはてなブックマークに追加

年収に大幅に差がつく前に

AIエンジニアへスキルアップをしませんか?コデクサでは、機械学習の初心者を対象に0から学べるコースを配信しています。

機械学習に必要な線形代数や統計基礎、さらに初歩的なアルゴリズムなどの無料コースを豊富に取り揃えています!

機械学習エンジニアへキャリアアップをしましょう!

0から始める機械学習

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)