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
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
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
120
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
440
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.8k
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
210
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
130
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.5k
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
130
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
180
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
3
1.2k
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
1
120
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Technical Leadership for Architectural Decision Making
baasie
3
560
A designer walks into a library…
pauljervisheath
211
25k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
[SF Ruby Conf 2025] Rails X
palkan
2
1.4k
Thoughts on Productivity
jonyablonski
76
5.4k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Facilitating Awesome Meetings
lara
57
7.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
980
Fireside Chat
paigeccino
42
4k
Mobile First: as difficult as doing things right
swwweet
225
10k
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