PyCon JP 2018 勉強会メモ

# 実施概要

詳細は[こちら](https://pycon.jp/2018/)


# 各発表

各発表は、[動画アーカイブ](https://www.youtube.com/user/PyConJP/videos)が残っているので、参考にされたし。
また、[有志の方による発表資料のまとめ](https://qiita.com/hondadadada1234/items/8654b19cd54de2bf692f)も。

なお、以下メモは、自分用に必要な情報をまとめたメモであるため、
このメモが表す内容は必ずしも発表の意図に沿っているものではなく、ズレが生じる可能性がある。


## 東大松尾研流 AI人材育成法
松尾研究室 リサーチディレクター 中山 浩太郎 さん

### 松尾研究室の人材育成活動について

松尾研究室では、基礎研究だけでなく、社会実装や人材育成を加えた３本柱のミッションを掲げている。
人材育成の活動一端として、

 - Web工学 
 - データサイエンス
 - DeepLearning

のそれぞれに関する講義を行なっている。

講義は、プログラミング演習を中心したもので、これは自身の手を動かさないと習得できないと考えの元、学んだ知識をアウトプットすることを大事にしているためである。

### Numpy Test Systemについて

教育コンテンツは、受講者のレベルを揃えることが重要であるため、Numpy Test Systemによる受講前テストを行なっている。

システムは以下の機能を備えている。

1.自動問題精製
2.自動スコアリング
3.回答用プログラミングインターフェース

### 松尾研流AI人材育成法

1. プログラミング中心
 - 前述の通り、自分で手を動かす事で身につけることが出来る
2. コンペティション
 - モデル精度のコンペを行うため、受講者の自習時間が長くなる
 - 精度を上げるために受講生は様々な工夫をし、講義外の内容や時には講師が知らない手法を取り入れることもある
3. コミュニティの形成
 - 決まった時間で講義、また互いに教え合う時間を設定する
 - 講師側の負担を減らす効果もある
 - ここで形成されたコミュニティによるベンチャーなども




## 実践・競馬データサイエンス
貫井 駿 さん

[発表資料](https://alphaimpact.jp/downloads/pyconjp2018.pdf)
[アーカイブ](https://www.youtube.com/watch?v=I1eSN6mPANs)

### 目的変数の設計

**「何を解くか」は、特徴量作成やモデル選択よりも重要。**
良い目的変数を作るため、ドメイン知識を取り入れ、問題を設計する。

競馬の場合は、レースに出走する馬それぞれに対してパフォーマンスのスコア(着順やタイムなど)を予測する。
(そこから馬券の購入まではまた別の問題がある。。。)

更に、競馬の場合は、データの特性を考慮して、以下の処理を行う。

- レース内標準化
 - 走破タイムは、距離や馬場の状態に依存する為、環境バイアスを消す
-  馬券外の馬のスコアは同じにする
 - 馬券に絡まない部分の着順を当てても価値がないため

### 特徴量作成のTips

#### 馬柱

元々競馬では、馬柱という構造で様々なデータがまとめられており、これを多数のテーブルに分解すると、保守性が低くなる。
→ 馬柱として、データをまとめることで簡潔に記述、保守性を高める。

#### 出生履歴データの取り扱いについて

- 過去X走の情報をそのまま特徴量に加える
 - 実装は簡単だが、Xが増えるとスパースになりやすい
- 過去X走の成績を集計する / 過去Xヶ月の成績を集計する
 - これらは、次元数はXに依存しないが、元々の情報が欠落してしまう

カテゴリデータとしても、数値データとしても扱えるもの(馬番、レース番号、距離など)は、迷ったらカテゴリと数値両方入れてみる。
カテゴリの取り扱いは以下の通り。

- one-hot encoding
 - 次元数が多くなるので、出現回数による足切りなどの工夫が必要
- target encoding
 - 過去データにおける該当カテゴリの目的変数の集計値 i.e. 同父馬の平均馬着
 - 「誰が(subject)」「どのレースで(race condition)」「どのくらいの成績だったか(statics)」の組み合わせで変数を作成する(実モデルで1000以上)
 - Smoothingを施す(該当カテゴリが少ない場合、集計値を全体平均に近づける操作)


### その他
季節・時間など、周期性のあるものを、三角関数で表現する


**とりあえず、思いついた変数でも取り入れる事で、精度は上がっていく事が多い。**

### 予測モデルの学習

#### 手法
- 手法はLightGBMを利用する
 - 勾配ブースティングの高速・軽量・高精度な実装
- カテゴリ変数をカテゴリ変数として扱うことができる
 - 一方で、カテゴリ変数はダミー化した方が精度は上がるらしい 
- 欠損値を欠損値として扱うことができる
 - 欠損データが多い競馬では重要

#### 手順

1. レースごとにデータを分割して、cross-validation
 - 馬ごとだと異なるfoldに同じレースが入ってしまい、これを避ける
1. cross-validation時にEarly stoppingを行う
1. [Hyperopt](https://github.com/hyperopt/hyperopt)によるパラメータ最適化
 - Tree-structured Parzen Estimator(TPE)は、GridSearchやRandomSearchより効率よく探索できる

なお、LightGBMは高速とはいえ、ハイパーパラメータが多く探索に時間がかかるため、GCEのプリエンティブインスタンスを利用する。

#### Tips
- カテゴリ変数はダミー化した方が精度が出ることが多い
- Early stoppingしないと過学習してしまう
- random_stateによって、精度が結構変わるので色々試す

#### 特徴量分析

モデル学習には直接関係ないが、LightGBMは特徴量の重要度を見る事ができる

- 特徴量の重要度

- 入力データにおける予測の特徴量の寄与
 - [SHAP](https://github.com/slundberg/shap)による可視化

### 予測モデルの評価

- 定量評価
 - nDCG(ランキング問題に使用される)
 - 高い関連度が上位に予測できていれば高スコアになる指標(最大1)
 - ここで扱う関連度はなんでも良いので、様々な観点で見るべき

- 定性評価
 - 代表的なレースをピックアップして、目で見て見る
 - マクロな評価ではわからない部分を理解する


## Jupyterで広がるPythonの可能性
driller さん

[発表資料](https://nbviewer.jupyter.org/github/drillan/pyconjp2018/blob/master/slides.ipynb)

内容が膨大なので、資料見てということで、割愛。

_(アンダースコア)記法でデータ処理を試行錯誤した後に、
_i記法で入力結果をjoinして最終的に作りたいコードを取り出せるのは便利だと思った(以下の引用参考)。

>```python:データ
data = pd.Series(['1000', '2,000', np.nan, '4,000'])
data
```
>> 0     1000
1    2,000
2      NaN
3    4,000
dtype: object

>```python:試行錯誤1
_.str.replace(",", "")
```
>> 0    1000
1    2000
2     NaN
3    4000
dtype: object

>```python:試行錯誤2
_.astype(float)
```
>>0    1000.0
1    2000.0
2       NaN
3    4000.0
dtype: float64

>```python:試行錯誤3
_.interpolate()
```
>>0    1000.0
1    2000.0
2    3000.0
3    4000.0
dtype: float64

>```python:加工コードの生成
"".join((_iii, _ii, _i)).replace("_", "")
```
>>'.str.replace(",", "").astype(float).interpolate()'


##「Pythonでやってみた」：広がるプログラミングの愉しみ
磯 蘭水さん

[発表資料](https://www.slideshare.net/RansuiIso/python-115121978)


### 経験的なプログラミング2大動機

1. 面倒臭いことを簡単に
 - 手間をかけずに最大の成果を目指す
 - プログラミングは目的を達成する手段
1. 一体どうなっているんだ？面白そう
 - 手間暇かけて小さな成果が得られる
 - 手段(プログラミング)そのものが目的

どちらが正しいというわけではない。
**いずれにしても仕組みの理解が非常に重要。**

- 対象は何か
- 実現したい事は何か
- いかにして実現するか


## 車輪の再実装 

**車輪の再実装** = 出来上がっているものの模倣

エンジニアにとって重要な以下の目当識を身につけることができる。

- なぜそのようになっているか、どのようにして実現するのか
- どこが簡単/難しい、どこがコア/応用

Pythonの場合、大抵のものはほとんど揃っており、OSSを通して中身を知ることができる。

学習する能力は知識・経験量に比例する。
→ どちらかを身につければ、学習するサイクルができる。


## niconicoにおけるコンテンツレコメンドの取り組み
大元 司さん

[発表資料](https://niconare.nicovideo.jp/watch/kn3440)


### 類似生主レコメンド

- 最近視聴した生放送の配信者と似た配信者の放送はおすすめ出来るのでは？

- 生主に対する視聴者情報を使用したトピックモデルを使って、トピック分布を推定し、その類似度でレコメンド

- gensimより精度が高いscikit-learnを採用(原因は不明)


### タグレコメンド

- ユーザの好みの動画を、動画に付与されたタグからレコメンド

- タグ関係ツリーを構築して、ユーザ好みの詳細なタグを探索

- タグの親子関係を動画へのタグ付けの共起をシンプソン係数から推測
- シンプソン係数で一定以上の閾値で関係を定義
- タグ自体の動画へのタグ付け数の大小数で親子関係決める

### 検索履歴ベースレコメンド

- ユーザが明確な意思を反映して行う検索履歴を用いてコンテンツをレコメンド

- ユーザの直近の検索を利用

- 確率的に選択した検索履歴内容で再検索した結果をレコメンドする
 - 直近の検索に重みを重くする
 

### リアルタイムレコメンド

- ユーザの視聴行動をリアルライム(数分)に反映するレコメンド

- Jubatusを利用
 - 一般的な協調フィルタリングを採用している（はず）

- アイテムベースは標準のメソッドを使用
- ユーザベースはメソッドが用意されておらず、類似ユーザの直近閲覧を参考にする


### レコメンダーコーディネーター


- ニコニコサービス内の複数のレコメンドエンジンをまとめる、コーディネーターの導入
- 色々なメリット
 - レコメンダーの利用方法が統一され、見通しが良くなる
 - 効果測定が容易になる
 - 新規レコメンダーや改修へのコストが少なくなる
- 複数のレコメンドを組み合わせをYAMLによって記述可能
- フロントから表示ログと反応ログを取得し、クリック率等をリアルタイムに測定


## Python研修の作り方-Teaching Is Learning-
ブレインパッド 西尾友佑さん

[発表資料](https://speakerdeck.com/nissy0409240/pythonyan-xiu-falsezuo-rifang-teaching-is-learning)

### 前提

- 新卒入社、3ヶ月の中で行われる研修について
- データサイエンティスト、エンジニア、ビジネスの職種関係なくカリキュラムは同じ

研修全体の構成は以下の通り。

1. ビジネス基礎
1. データサイエンスとエンジニアリング
1. 社内改善プロジェクト

エンジニアリング研修の中では、Python研修とチーム開発研修(gitやアジャイル開発について)を行う。

### python研修内容

スケジュール

- １日目
 - システム開発について
 - 文法について
 - 演習
- ２日目
 - 演習、ライブラリについて
- ３日目
 - 総合演習

説明した内容

- 基本的な文法事項
- 標準ライブラリ、外部ライブラリの使い方
- 上記内容を元にした演習

データサイエンス系の講義で扱わないけど必要な内容を盛り込むため、numpyなどのライブラリをフォロー。
DB接続やチーム開発、ユニットテストなどは、扱う範囲が広くなるためやらない。

### 進め方の方針

- 文法の紹介は外せない
 - ググっていくのにも、ある程度分かってからじゃないと答えにたどり着けない
- 動かすこと、コードを書くことに注力する
 - 講義に終始するのは受講側は辛い
 - Python以外の要素で悩まないようにする(ターミナルとか)
 - 綺麗なコードは意識しない
- 一歩先の内容を扱えるようにする（経験者にも退屈しない内容）
 - 発展的な課題を用意する



## その他

- ポスター
 - NLP（自然言語処理）初心者のための単語分割/品詞タグ付けツールの紹介 [git](https://github.com/taishi-i/nagisa)
- LT
 - [【poke2vec】ポケモンの役割ベクトルの 学習とその分析・可視化](https://speakerdeck.com/odanado/pyconjp-poke2vec)