Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
プログラミングコンテスト攻略のためのデータ分析入門 / Lambda + Athena + G...
Search
Hiroyuki S@no
July 09, 2018
Programming
2.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
プログラミングコンテスト攻略のためのデータ分析入門 / Lambda + Athena + Glue + Firehose でサーバーレスな分析基盤をつくってみた / dive-into-mixi-night-2018
Hiroyuki S@no
July 09, 2018
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
210
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
310
Building an Out-of-Order CPU
latte72
1
790
一人だけ、Kiroが静止する日
hideg
0
120
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
350
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
320
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
120
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
150
The Rails Doctrine Decade
koic
2
150
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.3k
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
360
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Agile that works and the tools we love
rasmusluckow
331
22k
A designer walks into a library…
pauljervisheath
211
25k
Mobile First: as difficult as doing things right
swwweet
225
10k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
760
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Transcript
--- Codeforces の提出ログで機械学習してみた 2018.07.06 - Dive into mixi night! #2
Hiroyuki Sano # mixi, Inc. 1
何を話すか 2 コンテストの分析を通して業務で使っている技術について紹介してみる • サーバーレスな分析基盤の構築 • Doc2Vec を使ったコンテストの問題分類
$ whoami 3
自己紹介 :-) • 名前: さの ひろゆき ◦ 2017年度新卒入社 4
仕事 • モバイルゲームに関するデータの分析と集計 • そのためのインフラおよび社内分析ツールの開発と運用 5
入社前の経歴 • 2009: パソコン甲子園プログラミング部門予選通過(会津大学) • 2010: 福岡にある工業高校を卒業後、高専編入に失敗し浪人 • 2011: 会津大学に入学
◦ IPA / 経産省: セキュリティ&プログラミングキャンプ2011 • 2012〜2013: 休学 • 2014: 復学 ◦ Aizu Online Judge 研究室 ▪ http://web-ext.u-aizu.ac.jp/~yutaka/ ◦ 第4期サイボウズ・ラボユース • 2015: 在学 ◦ Google Summer of Code 2015 ▪ https://github.com/rails/web-console • 2016: 在学 ◦ Google Summer of Code 2016 ◦ IPA / 経産省: 2016年度未踏事業クリエータ • 2017: 会津大学を中退してミクシィに新卒入社 6
0. はじめに 7
8
※ 注: Kaggleの話ではないです :-| 9
プログラミングコンテストを分析します :-) 10
プログラミングコンテストについて 競技プログラミング(Competitive Programming)と呼ばれるアルゴリズムの実装スキルを 競うコンテストがオンライン上で定期的に開催されている • Codeforces # https://codeforces.com • HackerRank
# https://www.hackerrank.com • AtCoder # https://atcoder.jp これらのコンテストでは難易度別に複数の問題が与えられて時間内に解答となるプログ ラムをなるべく早く多く実装していく 11
Codeforces • ロシアのプログラミングコンテスト。ユーザー数が多くコンテスト1回あたり8000ユー ザーくらいが参加登録している • 不安定でよくサーバーが落ちる https://codeforces.com/blog/entry/56831 12
コンテストどんな感じなのか 2. 解答となるプログラムを書いて提出 1. 問題文を読んで実装を考える 3. 自動的に採点が走って正誤判定 13
Codeforces: 直近のコンテスト 14 昨年末にリリースされた量子コンピューティング用のプログラミング言語 Q# を使った Microsoft 主催のコンテストがある URL: http://codeforces.com/msqs2018
※ 7月7日(土)の午前1時から
1. データを集める 15
Codeforces API • コンテストの提出ログなどが取れる ◦ いつ・誰が・どの問題を正解・不正解だったのか ◦ ほかにも問題で使用するアルゴリズム名のタグが取れたりする • ほとんどの
Web API は認証不要で実行可能 URL: https://codeforces.com/api/help 16
Codeforces API: contest.status コンテスト別の全ユーザーの提出ログ(コンテスト終了後の提出も含む) 以下は Web API の実行例: 17
Codeforces API: contest.status の詳細 verdict という項目で正解したかどうかがわかる このデータを AWS を使って SQL
でクエリできる状態にしてみる ← verdict = OKだと正解 ← 使用したプログラミング言語の名前も取れる 18
効率的な分析のためには 必要なデータを必要なときに素早く取得できるようにしておく必要がある 19
目指すところ 問題別の正解者数などを SQL で集計したりできるようにする 20
設計 21
※ ETL; Extract => Transform => Load 分析基盤のアーキテクチャ サーバーレスな ETL
をやる。主要な役割を担っているのは Amazon Athena と Amazon Kinesis Data Firehose 22
Presto ベースのサーバーレスに使えるクエリサービス • Amazon S3 上に格納されているデータに対して SQL でクエリを実行可能 • 従量課金なので事故ると破産する可能性
◦ 巷で話題のクラウド破産を体験できるポテンシャルを持っている ◦ S3 から読んだデータ 1 TB あたり 5 USD ▪ 数十 GB 程度のデータ量であれば気兼ねなく使えるコスト感 ◦ クエリやテーブル定義、ファイルフォーマットを工夫すれば節約できる ※ Presto; Facebook 発の分析用途に適した分散クエリエンジン Athena; https://aws.amazon.com/jp/athena/ AWS: Amazon Athena # 1/3 23
AWS: AWS Glue # 2/3 Data Catalog を使って Athena で読めるテーブルを定義する
• Glue Data Catalog ◦ Glue や Athena 以外にもデータを扱うためのサービスが色々とある ◦ それらでテーブル定義やスキーマを共有できる機能 • Glue Job ◦ フルマネージドな Apache Spark の実行環境 • Glue Crawler ◦ テーブル定義情報を探索して Data Catalog に追加 AWS Glue; https://aws.amazon.com/jp/glue/ 24
AWS: Amazon Kinesis Data Firehose # 3/3 S3 へのデータ投入に Kinesis
Firehose を利用する • ストリーミングデータの処理に使える Kinesis Data 3兄弟の一角 ◦ Stream(PubSub) / Firehose(バッチ変換) / Analytics(集計) • データを投入するとバッチ単位でデータ変換して別のところに出力できる ◦ e.g., CloudWatch Events => Firehose => Elasticsearch • Parquet 形式での出力にも対応 ◦ Athena に適した列指向のファイルフォーマット Amazon Kinesis Data Firehose: https://aws.amazon.com/jp/kinesis/data-firehose/ 25
実装 26
実装: Glue Data Catalog にテーブルを定義する CloudFormation で 構成管理できる 27 ↓S3のパスや入出力形式を指定して
←テーブルのカラムを定義する
実装: Firehose の Delivery Stream を作成 28 Firehose も Glue
Data Catalog を 利用してデータ変換の形式を指定できる Parquet 変換の設定が CloudFormationから出来なかったので手 動設定。構成管理せずに Lambda から動的に立ち上げてデータ投 入がおわったら削除したりする方が良いかもしれない(だが実装が 重くなるかもしれない)
実装: Lambda 関数 # Extract Web API を実行してその結果を テーブル定義に合わせた形に変形する 29
実装: Lambda 関数 # ぶん投げる 変形したら JSON にして Firehose にぶん投げる
データが指定のファイルフォーマットに変換された状態で そのまま S3 に入っていくイメージ 30
動かしてみる DynamoDB にコンテストの ID を入れたら実行が終わるのを寝ながら待つ。9時間くらい で取り込みが終わった。下は当日の Lambda 関数の実行回数の推移 31
Athena: select count(1) 一部のコンテストはミスで取得できなかったが トータルで約 2500 万件と分析するには十分 と思われる量のデータを集めることができた Parquet にしておくと無料で
`select count(1) from somewhere` を 実行できるのでお得感がある 32
Firehose: 気になるお値段 使用料金は 129.4 GB で $6.08 くらいとお酒を1杯程度我慢すれば大丈夫な感じだった。 破産しないように最悪ケースをよく見積もってから使う必要がある 33
←圧縮するだけならデータ変換 の料金は掛からない
2. データを分析する 34
Codeforces: 年別のアクティブユーザー数 35 Codeforces の公式ブログに貼ってあった年別のア クティブユーザー数の推移グラフ 各年で7月から12月までのコンテストに参加した人 数とのこと。2017年は 35,000人 くらいだったらしい
https://codeforces.com/blog/entry/56831
35,000人 36
嘘かもしれない 37
嘘じゃないか確かめる 38 Athena を使って自分でアクティブ ユーザー数を求めてみる ここではコンテスト中に何らかの提 出を行ったことがあるユーザーをア クティブユーザーとして定義 データスキャン量は 200MB
程
年間のアクティブユーザー数 同じような形になっているので公表されている値は正しいようだ 39 https://codeforces.com/blog/entry/56831
Doc2Vec 40
コンテストの成績が上がらない問題 41 RedCoder への道のりは険しい 休学 新卒 休学 ラボユース GSoC 未踏
GSoC セプキャン
問題 = 理想 - 現実 理想 = RedCoder / 現実
= 万年 GreenCoder なぜか • 練習しない • 解けなかった問題をそのままにしている 42
なぜ練習しないのか • 難しい問題 => 眠くなる • 簡単な問題 => 解く気がしない •
問題を探すのだるい いまの実力でストレスなく解ける手頃な難易度の問題を機械学習で良い感じに推薦して ほしい 43
44 Doc2Vec Document Embedding with Paragraph Vectors https://arxiv.org/abs/1507.07998 文章と単語をベクトルに落とし込んで 「レディー・ガガ」
- 「アメリカ人」 + 「日本人」 = 「浜崎あゆみ」 みたいな計算をできるようにする ※ 上記結果については賛否ありそう
Doc2Vec => Problem2Vec 例えば • 文書 = 問題 • 単語
= 正解したユーザー として Doc2Vec を適用すれば、その問題を誰が正解しているかという情報を元にして似 ている問題を良い感じに分類できないだろうか 45
gensim 46 gensim で Doc2Vec してみる • Python で書かれたライブラリ •
トピックモデルなどの機能を持つ(知らんけど) • Word2Vec や Doc2Vec の機能もある "gensim: Topic modelling for humans" https://radimrehurek.com/gensim/
gensim のインストール pip でインストールできる。csv を読むために pandas も入れておく ※ pandas; データを扱うためのライブラリ
47
Athena: 問題ごとに正解者の一覧をとる 48 ↑array_agg 関数を使うとカラムの値を group by で配列化できる 出力例
gensim: トレーニング実行 問題ごとに正解した ユーザーリストを単語 とみなして訓練しモデ ルを保存する 49 正解したユーザーリストがスペース区切りになっているので分割して gensim の
LabeledSentence というモデルに変換している
gensim: 似ている問題を探してみる 問題ID = 356D の問題について最も似ていると思われる問題一覧を出力した。アルファ ベット順に難易度が高くなるので近いアルファベットを持つ問題ID出力ができているのは 良さそう 50 ←似ている文書ベクトルを探す
gensim: 世界ランクトップと似ているユーザー 単語ベクトル(ユーザー)について も類似のベクトルを取得できる Problem2Vec による世界ランク トップの tourist に類似すると 思われるユーザーリスト
日本人を入れると日本人が出て来やすい傾向があ るようだった(コンテストに参加できる時間帯が似て いるからだろうか) 51 ↑ 7月2日時点の世界ランキング
3. まとめ # YWT 52
Y: やった 53 • サーバーレスな分析基盤をつくってみた • 集めたデータを分析可能な状態にした • gensim を使って
Doc2Vec してみた
W: わかった • Athena: タイムスタンプは文字列じゃなくて数値にしておく ◦ データスキャン量が全然違う • Doc2Vec ◦
難しめの問題だと解いてる人によって特徴が出るようだった ◦ 簡単な問題は解いてる人が多いので類似度が高くなりがちだった 54
T: 次やること • Firehose の動的生成 • Doc2Vec を使った練習システムの構築 55
Thank you ;-) 56