Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Amane Suzuki

October 21, 2020
Tweet

More Decks by Amane Suzuki

Other Decks in Programming

Transcript

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

    ◦ ダウンロードはディレイはさむとか ◦ UserAgent に連絡先書くとか ◦ スクレイピングした item に後処理するとか ◦ デバッグ中にリクエスト何回も送るの申し訳ないので cache するとか 7
  2. Scrapyの使い方 • Spider というクラスを作る ◦ ウェブを巡回してくれる蜘蛛 • Spider には2種類あるので、状況によって使い分ける 9

    Spider 1. パース方法 2. リンクのたどり方 を記述する 自由度が高い CrawlSpider 1. 対象となる URL の正規表現 2. 対応するパース方法 を宣言的に記述する シンプルに書ける \便利!/
  3. item を定義する • 取得したい情報のかたまりを item と呼ぶ • フィールドを定義することで、 ◦ 意図しない要素の混入を防ぐ

    ◦ 出力時の変換を定義できる • あまりキレイなデータ構造にしようと頑張らず、 出力したいフィールドを愚直に書くのがよい 11
  4. Item Pipeline で後処理する • item ごとに別ファイルに出力する場合や、 取得した item の後処理などに使う •

    右の例では以下を行っている ◦ item の種類ごとに csv に出力 ◦ 重複した item を削除 13
  5. 本題ではないので、ざざっとやります 1. review.csv から、User × Movie の行列を作る 2. 行列を TruncatedSVD

    で行列分解 3. n_components を変えて複数モデルを訓練する 4. モデルはそれぞれ joblib.dump で保存する ◦ あとで、モデルを選べるようにします 17
  6. キャッシュの有効化 • streamlit の基本は上から全実行 ◦ ライブリロードのときも同様 • 関数に @st.cache をつけると

    キャッシュが有効化される • 重いデータを使う場合も開発 UX を 落とさない 21
  7. 情報を表示 • st.write が万能 ◦ str, list, dict ◦ pandas

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

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

    を複数選択 ◦ format_func には内部で持っている 情報と、選択肢の文字列の対応関数を 渡す 25 実装
  10. 予測結果を表示するところ 1. 好みを表す行列を作る 2. 選ばれた映画に 10 を代入 ◦ 最高点が 10

    のため 3. movie という DataFrame に予測結果を 代入 4. movie をスコア順にソート 5. 既に選ばれていない movie を表示 27 実装
  11. まとめ • Scrapy を覚えると ◦ 見通しの良いスクレイピングスクリプトを手軽に書ける ◦ デバッグも簡単 • Streamlit

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