Scrapyとscikit-learn、Streamlitで作るかんたん機械学習アプリケーション / Making ML App with Scrapy, scikit-learn, and Streamlit

Scrapyとscikit-learn、Streamlitで作るかんたん機械学習アプリケーション / Making ML App with Scrapy, scikit-learn, and Streamlit

DeNAのデータサイエンス輪講(DS輪講)での発表内容です。
Scrapyとscikit-learn、Streamlitを使うことで、機械学習を使ったデモアプリをクイックに作ることができます。
ソースコードはGitHubに公開しています。
https://github.com/amaotone/movie-recommendation-demo

70ae2d149767d4198aac83453481b8dd?s=128

Amane Suzuki

October 21, 2020
Tweet

Transcript

  1. Scrapy と scikit-learn、Streamlit で作る かんたん機械学習アプリケーション 鈴木 天音 @SakuEji DeNA AIシステム部

    データサイエンス1G
  2. 鈴木天音(すずき あまね) Twitter: @SakuEji Kaggle Master(Kaggle 歴 3 年) 仕事はエネルギー関係の案件をやってます

    最近はイベントの運営や講師業も増えてきました
  3. \今日のゴール/ それっぽい機械学習デモを ぱぱっと作れるようになる

  4. 今回の題材 • 映画レコメンドアプリを作る • ざっくり要件 ◦ 自分が好みの映画をいくつか選ぶ ◦ 好みの映画がランキング形式で表示される 4

  5. つくるものの全体構成 Scrapyでひっぱってきてモデル作ってStreamlitで可視化! 5 Scrapy レビューを取得する scikit-learn 推薦モデルを作る Streamlit ガワをつける

  6. Scrapyで レビューを取得

  7. Scrapyってなに? • スクレイピングフレームワーク • Python で書かれているスクレイピングツールの中では fat な部類 • 学習コストちょっと重めだけど、こまごました面倒から解放される

    ◦ ダウンロードはディレイはさむとか ◦ UserAgent に連絡先書くとか ◦ スクレイピングした item に後処理するとか ◦ デバッグ中にリクエスト何回も送るの申し訳ないので cache するとか 7
  8. みんなのシネマレビュー* を取得する • 50万件以上のレビューが存在する • 運営主体が企業ではなさそうなので、 スクレイピングの負荷はなるべくかけたくない • レビューに網羅的にアクセスできるページを探す →

    今回は「レビュワー名簿」があった 8 * https://www.jtnews.jp/index.html
  9. Scrapyの使い方 • Spider というクラスを作る ◦ ウェブを巡回してくれる蜘蛛 • Spider には2種類あるので、状況によって使い分ける 9

    Spider 1. パース方法 2. リンクのたどり方 を記述する 自由度が高い CrawlSpider 1. 対象となる URL の正規表現 2. 対応するパース方法 を宣言的に記述する シンプルに書ける \便利!/
  10. 書いた CrawlSpider • rules に取得する URL と コールバックとなる関数名を書く • パースする関数の中では

    css 記法や xpath 記法で 要素を取得できる 10
  11. item を定義する • 取得したい情報のかたまりを item と呼ぶ • フィールドを定義することで、 ◦ 意図しない要素の混入を防ぐ

    ◦ 出力時の変換を定義できる • あまりキレイなデータ構造にしようと頑張らず、 出力したいフィールドを愚直に書くのがよい 11
  12. Scrapy Shell で動作確認する • 要素が取得できるかインタラクティブに確認可能 • スクレイピングするスクリプトからシェルを起動することも可能 ◦ デバッグに便利 12

  13. Item Pipeline で後処理する • item ごとに別ファイルに出力する場合や、 取得した item の後処理などに使う •

    右の例では以下を行っている ◦ item の種類ごとに csv に出力 ◦ 重複した item を削除 13
  14. こんな感じの CSV ができました 14 movie.csv user.csv review.csv

  15. お行儀よくスクレイピングするために • スクレイピングを禁止する利用規約がないか確認する • robots.txt に従う • 1秒〜5秒、間隔をあけてリクエストを送る • UserAgent

    に連絡先を入れておく • 開発中はキャッシュを活用する 15 補足だよ!
  16. scikit-learnで モデルを作成

  17. 本題ではないので、ざざっとやります 1. review.csv から、User × Movie の行列を作る 2. 行列を TruncatedSVD

    で行列分解 3. n_components を変えて複数モデルを訓練する 4. モデルはそれぞれ joblib.dump で保存する ◦ あとで、モデルを選べるようにします 17
  18. Streamlitで ガワをつける

  19. Streamlit*ってなに? • 機械学習アプリのデモをいい感じにつくれるライブラリ • フロントエンドの知識なしで Web アプリを作れる • 使ったときのお手軽感は Jupyter

    Notebook とかなり似ている 19 *https://www.streamlit.io/
  20. こんな感じになりました 20 50行弱書くだけ

  21. キャッシュの有効化 • streamlit の基本は上から全実行 ◦ ライブリロードのときも同様 • 関数に @st.cache をつけると

    キャッシュが有効化される • 重いデータを使う場合も開発 UX を 落とさない 21
  22. 進捗に応じて表示を変更 • st.text を変数にもっておき、 あとから書き換えることが可能 22

  23. 情報を表示 • st.write が万能 ◦ str, list, dict ◦ pandas

    DataFrame ◦ matplot のプロット ◦ Markdown ◦ LaTeX の数式 など • ほかにもソースコードや地図などを 表示可能 23
  24. フォームから入力する • 各種フォームを一発で作成 ◦ ボタン(st.button) ◦ チェックボックス(st.checkbox) ◦ ラジオボタン(st.radio) ◦

    選択(st.select) ◦ 複数選択(st.multiselect) ◦ スライダー(st.slider) ◦ テキスト(st.text_input) など • 入力されている値が返り値となるため、 直感的に使用可能 24
  25. 映画を選ぶところ 1. movie_id と title の対応辞書を作成 2. st.multiselect で movie_id

    を複数選択 ◦ format_func には内部で持っている 情報と、選択肢の文字列の対応関数を 渡す 25 実装
  26. モデルを選ぶところ 1. ./model ディレクトリに存在する svd_*.pkl というファイル一覧を取得 2. st.radio で択一で選ばせる 3.

    選ばれたパスからモデルを読み出す 26 実装
  27. 予測結果を表示するところ 1. 好みを表す行列を作る 2. 選ばれた映画に 10 を代入 ◦ 最高点が 10

    のため 3. movie という DataFrame に予測結果を 代入 4. movie をスコア順にソート 5. 既に選ばれていない movie を表示 27 実装
  28. こんな感じになりました(再掲) 28 50行弱書くだけ

  29. まとめ • Scrapy を覚えると ◦ 見通しの良いスクレイピングスクリプトを手軽に書ける ◦ デバッグも簡単 • Streamlit

    を覚えると ◦ ぐりぐり動かせる Web アプリケーションを手軽に作れる ◦ プロトタイピングに便利 29