Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

鈴木天音(すずき あまね) Twitter: @SakuEji Kaggle Master(Kaggle 歴 3 年) 仕事はエネルギー関係の案件をやってます 最近はイベントの運営や講師業も増えてきました

Slide 3

Slide 3 text

\今日のゴール/ それっぽい機械学習デモを ぱぱっと作れるようになる

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Scrapyで レビューを取得

Slide 7

Slide 7 text

Scrapyってなに? ● スクレイピングフレームワーク ● Python で書かれているスクレイピングツールの中では fat な部類 ● 学習コストちょっと重めだけど、こまごました面倒から解放される ○ ダウンロードはディレイはさむとか ○ UserAgent に連絡先書くとか ○ スクレイピングした item に後処理するとか ○ デバッグ中にリクエスト何回も送るの申し訳ないので cache するとか 7

Slide 8

Slide 8 text

みんなのシネマレビュー* を取得する ● 50万件以上のレビューが存在する ● 運営主体が企業ではなさそうなので、 スクレイピングの負荷はなるべくかけたくない ● レビューに網羅的にアクセスできるページを探す → 今回は「レビュワー名簿」があった 8 * https://www.jtnews.jp/index.html

Slide 9

Slide 9 text

Scrapyの使い方 ● Spider というクラスを作る ○ ウェブを巡回してくれる蜘蛛 ● Spider には2種類あるので、状況によって使い分ける 9 Spider 1. パース方法 2. リンクのたどり方 を記述する 自由度が高い CrawlSpider 1. 対象となる URL の正規表現 2. 対応するパース方法 を宣言的に記述する シンプルに書ける \便利!/

Slide 10

Slide 10 text

書いた CrawlSpider ● rules に取得する URL と コールバックとなる関数名を書く ● パースする関数の中では css 記法や xpath 記法で 要素を取得できる 10

Slide 11

Slide 11 text

item を定義する ● 取得したい情報のかたまりを item と呼ぶ ● フィールドを定義することで、 ○ 意図しない要素の混入を防ぐ ○ 出力時の変換を定義できる ● あまりキレイなデータ構造にしようと頑張らず、 出力したいフィールドを愚直に書くのがよい 11

Slide 12

Slide 12 text

Scrapy Shell で動作確認する ● 要素が取得できるかインタラクティブに確認可能 ● スクレイピングするスクリプトからシェルを起動することも可能 ○ デバッグに便利 12

Slide 13

Slide 13 text

Item Pipeline で後処理する ● item ごとに別ファイルに出力する場合や、 取得した item の後処理などに使う ● 右の例では以下を行っている ○ item の種類ごとに csv に出力 ○ 重複した item を削除 13

Slide 14

Slide 14 text

こんな感じの CSV ができました 14 movie.csv user.csv review.csv

Slide 15

Slide 15 text

お行儀よくスクレイピングするために ● スクレイピングを禁止する利用規約がないか確認する ● robots.txt に従う ● 1秒〜5秒、間隔をあけてリクエストを送る ● UserAgent に連絡先を入れておく ● 開発中はキャッシュを活用する 15 補足だよ!

Slide 16

Slide 16 text

scikit-learnで モデルを作成

Slide 17

Slide 17 text

本題ではないので、ざざっとやります 1. review.csv から、User × Movie の行列を作る 2. 行列を TruncatedSVD で行列分解 3. n_components を変えて複数モデルを訓練する 4. モデルはそれぞれ joblib.dump で保存する ○ あとで、モデルを選べるようにします 17

Slide 18

Slide 18 text

Streamlitで ガワをつける

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

こんな感じになりました 20 50行弱書くだけ

Slide 21

Slide 21 text

キャッシュの有効化 ● streamlit の基本は上から全実行 ○ ライブリロードのときも同様 ● 関数に @st.cache をつけると キャッシュが有効化される ● 重いデータを使う場合も開発 UX を 落とさない 21

Slide 22

Slide 22 text

進捗に応じて表示を変更 ● st.text を変数にもっておき、 あとから書き換えることが可能 22

Slide 23

Slide 23 text

情報を表示 ● st.write が万能 ○ str, list, dict ○ pandas DataFrame ○ matplot のプロット ○ Markdown ○ LaTeX の数式 など ● ほかにもソースコードや地図などを 表示可能 23

Slide 24

Slide 24 text

フォームから入力する ● 各種フォームを一発で作成 ○ ボタン(st.button) ○ チェックボックス(st.checkbox) ○ ラジオボタン(st.radio) ○ 選択(st.select) ○ 複数選択(st.multiselect) ○ スライダー(st.slider) ○ テキスト(st.text_input) など ● 入力されている値が返り値となるため、 直感的に使用可能 24

Slide 25

Slide 25 text

映画を選ぶところ 1. movie_id と title の対応辞書を作成 2. st.multiselect で movie_id を複数選択 ○ format_func には内部で持っている 情報と、選択肢の文字列の対応関数を 渡す 25 実装

Slide 26

Slide 26 text

モデルを選ぶところ 1. ./model ディレクトリに存在する svd_*.pkl というファイル一覧を取得 2. st.radio で択一で選ばせる 3. 選ばれたパスからモデルを読み出す 26 実装

Slide 27

Slide 27 text

予測結果を表示するところ 1. 好みを表す行列を作る 2. 選ばれた映画に 10 を代入 ○ 最高点が 10 のため 3. movie という DataFrame に予測結果を 代入 4. movie をスコア順にソート 5. 既に選ばれていない movie を表示 27 実装

Slide 28

Slide 28 text

こんな感じになりました(再掲) 28 50行弱書くだけ

Slide 29

Slide 29 text

まとめ ● Scrapy を覚えると ○ 見通しの良いスクレイピングスクリプトを手軽に書ける ○ デバッグも簡単 ● Streamlit を覚えると ○ ぐりぐり動かせる Web アプリケーションを手軽に作れる ○ プロトタイピングに便利 29