Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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