Slide 1

Slide 1 text

Jupyterで触れながら学ぶ 機械学習速習会 2016-1-12 Makoto Tanji (@tan_z_tan) Wantedly速習会 1

Slide 2

Slide 2 text

はじめに: Wantedly People ● 2016/11/11リリース ● 複数枚同時スキャン & 人工知能で瞬時データ化 2

Slide 3

Slide 3 text

技術的なチャレンジ ● 2ヶ月半でアプリをリリースする ● マイクロサービスアーキテクチャ ● 機械学習 ● Wantedly Peopleでいう人工知能 ○ 名刺の認識 ○ 書かれている文字からプロフィール情報構築 ○ Wantedly登録ユーザとのマッチ ○ データが貯まるほど精度が向上する仕組み 3

Slide 4

Slide 4 text

機械学習(Machine Learning) ● 大量のデータを食わせると賢くなるプログラム ● 人工知能と違うの? ○ 今は同じような要素を含むので、人工知能∋機械学習、でいいかも。 ■ 人工知能:1956年生まれ。方法はどうあれ人間の 知能を実現させたい。 ■ 機械学習:1959年生まれ。知識を教えなくても自動で学習させて 問題を解きたい。 ○ 人が与える知識の限界。e.g. エキスパートシステム ● 実際どんな応用? ○ スパムフィルター、顔認識、将棋・碁、自動運転とか 4

Slide 5

Slide 5 text

5 https://www.oreilly.com/ideas/the-current-state-of-machine-intelligence-3-0

Slide 6

Slide 6 text

できること・できないこと ● 過度な期待は禁物 ● できる ○ 早く・同じ基準で処理できる ■ 大量の名刺をバッチ処理する。メールが来るたびに分類する。 ○ 人間よりも分野によっては高い精度 ■ 画像分類、ゲーム ● できない ○ どんなデータも精度99.99%にできる? ■ 株価を完全に当てられるか? 人間の感性(同じ文でも良い文章・悪い文章) ○ 50個しかないけどデータから分類して欲しい ■ それを人間ができるのは一般的な常識から推論できるから 6

Slide 7

Slide 7 text

色々あるけど何を使ったら良い? ● 一般的な答えは「データとやりたいことによる」 7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

おおまかな分類 ● 教師あり学習 ○ 分類:データとラベルから離散的なクラスを予測する ○ 回帰:データとラベルから値(実数ベクトル)を予測する ● 教師なし学習 ○ クラスタリング:データマイニング、前処理、分類予測 ○ 次元削減:特徴量の削減 ● その他(半教師あり学習、強化学習、進化計算(?)・・・) 9

Slide 10

Slide 10 text

今日速習すること ● Task 0: 環境を整える ● Task 1: 機械学習を試してみる。分類境界をみて理解する ● Task 2: 画像の分類。機械学習のコードを書く ● Task 3: 回帰 ● (時間がゆるすところまで)  なるべく高度なことをしないで原理とできそうな感触を掴むことが目的 10

Slide 11

Slide 11 text

Task 0: 環境を整える ● Clone github repository https://github.com/tan-z-tan/python-ml ● (If not installed) Install Docker https://docs.docker.com/docker-for-mac/ ● Pull Docker image ● Run Jupyter on Docker 11 git clone [email protected]:tan-z-tan/python-ml.git cd python-ml docker pull tanztan/python-ml docker run -v `pwd`:/home/jovyan/work -p 8888:8888 -it tanztan/python-ml

Slide 12

Slide 12 text

なぜDockerか ● Wantedlyのサーバは全てDockerで動いています。 ● ローカルを汚さず開発環境を共有 ● すぐに実験を再現できる ● (今回使わないけど)GPUを使う環境はそれなりにセットアップ が大変 12

Slide 13

Slide 13 text

Jupyter ● 様々なプログラムをインタラクティブに実行し、コードと結果を記録できる実験ノート のようなもの ● Python, R, Ruby (railsも動く)... ○ 各言語のカーネル(ipython, iruby)のリッチなインタフェース ● ちなみにgithubでもプレビューが動く 13 Open source, interactive data science and scientific computing across over 40 programming languages.

Slide 14

Slide 14 text

Scikit-Learn scikit-learn Machine Learning in Python ●Simple and efficient tools for data mining and data analysis ●Accessible to everybody, and reusable in various contexts ●Built on NumPy, SciPy, and matplotlib ●Open source, commercially usable - BSD license 14 ● Pythonで手軽に機械学習するならデファクト。 ● 沢山のアルゴリズム。C++レイヤーで計算するので演算が早い。 ● 共通のインタフェース ○ fit(x,y): 与えられた訓練データとハイパーパラメータを元に訓練する。 ○ predict(x): 新規の入力データを与えて予測を行う。 ○ score(x,y): データへの当てはめの良さを評価。

Slide 15

Slide 15 text

Task 1 ● シンプルなデータで分類を実感する ● データ: Iris ● 分類: k-近傍法, SVM, 決定木 ● TODO: ○ 実行してみる ○ どれが一番良かったか評価してみる ○ トレーニング精度とテスト精度を出してみる 15

Slide 16

Slide 16 text

どんなデータ? ● Iris: あやめの分類 ○ レコード数 150 ○ 特徴量(4) ■ sepal length (cm) がく片の長さ ■ sepal width (cm) がく片の幅 ■ petal length (cm) 花弁の長さ ■ petal width (cm) 花弁の幅 ○ 分類 ■ Versicolor ■ Virginica ■ Setosa ● 花の形状から3種類に分類する 16

Slide 17

Slide 17 text

識別器 Classifier ● f(x)→c, c in {0,1,2,3...} ● SVM: 学習データ中の境界のデータだけをみる ● Decision Tree: 人間が分かる IF-THENルール ● k-NN: 一番近いものをみる ● 機械学習はこの線の引き方を          競ってい る ○ 汎化能力、過学習、速度 17

Slide 18

Slide 18 text

(ちなみに完成版) git fetch origin tanji/completed git checkout tanji/completed 18

Slide 19

Slide 19 text

典型的な流れ 1. 特徴量抽出→入力ベクトル 2. 入力次元でデータをプロット 3. 識別器を決める 4. 学習 5. 評価 19

Slide 20

Slide 20 text

特徴量抽出とプロット ● これが決まらないと入力データの空間が決まらない ○ とりあえず可能なデータ全部突っ込めば良いんでしょ? ○ →次元の呪い ○ ● プロットしてみる ○ やらないで識別器にかける人がいるけど。これは重要。 ○ そもそも解ける問題なのか? ○ 次元数が多くなるとプロットするのも難しいけど 20

Slide 21

Slide 21 text

識別器を決める&学習 ● どうやって決めれば良いのか ○ それぞれ特色がある。e.g. ■ Random Forestは特徴量が多くても動く ■ SVMは正規化したほうが精度がでる、とか ○ 「machine-learning algorithm cheat sheet」(最初俯瞰するにはいいかも) ○ 誰かやっているはず ■ google(“$やりたいこと machine-learning paper”) ■ e.g. character recognition machine-learning ● 学習はscikit-learnの場合は clf.fit(X, y) 21

Slide 22

Slide 22 text

評価 ● 訓練精度 ○ 学習に使ったデータがどれだけ良く分類できたか ○ これだけでは知見はない。そもそも学習できるの? ● テスト精度 ○ 学習に使わなかったデータがどれだけよく分類できたか ○ 一般的な精度 ● クロスバリデーション ○ なるべく多くのデータをトレーニングに使いたい ○ データをK個に分割して、K-1個を訓練、残り1個をテストする。K回の平均をと る。 22

Slide 23

Slide 23 text

色々な精度 ● 精度:正解/全て、二乗誤差 ● precision, recall ○ True Positive, True Negative, False Positive, False Negative ○ 地雷を見つけるロボットは、間違ってもいいから全ての地雷をみつけてほしい ● F値: (2 * p * r) / (p + r) ● Confusion Matrix 23

Slide 24

Slide 24 text

Task 2 ● 1行でも予測のコードを書いてみる ● 画像分類(0から9の画像を当てる) ● TODO ○ k-NN法(k-Nearest Neighbor)を実装 ■ 予測(x) = xに近い学習データ上位k個の多数決 ○ アルゴリズムの精度をはかる 24

Slide 25

Slide 25 text

Task 3 ● 回帰問題(未知の値を推定する) ○ 目的変数Yを、説明変数Xで予測する。Y = f(X) ○ e.g. Y=ユーザの1ヶ月の課金量。X=[ログイン回数、勝利回数、敗北回数] ● 線形回帰(最も基本だけどイメージがつかみやすい) ○ Y = f(X) =w1 * x1 ○ XもYも1次元 ○ Xの多項式 ● 次元数用語がちょっと混乱しやすい ○ 入力の次元数 ○ 出力の次元数 ○ 多項式回帰の場合は、xの次元(xの3乗とか) 25

Slide 26

Slide 26 text

次元の呪い ● データが高次元になると汎化性能が低下 ○ 特にデータより次元数が多いと、トレーニングでは100%当たるけどテストでは 精度がでない。 ● 精度を出すのに必要な学習データ量が増加 ● 使えるデータ全て突っ込んどけ、は危険 26

Slide 27

Slide 27 text

実用するのに本当に難しいこと (学会とかでもRealWorldApplicationのトラックがあったりする) ● 使えるデータを集めること ○ そもそも正解のデータがない→よくある ○ ゴミが多い ■ 値が入っていない ■ 判断の指針が途中で変わっている/人によって違う ● リアルタイムに動かしているサービスで更新 ○ 今まで動いていた精度が落ちないことを保証したい ● メンテナンス ○ 担当者がいなくなったらメンテできるのか 27

Slide 28

Slide 28 text

速習会まとめ ● 今日、目指したこと ○ 試すことができる環境を得る ○ 分類問題の「機械学習を試した」と言える ○ 原理を分かった気持ちになる(重要) ● 企業で機械学習を導入すること ○ リスク>リターンを見極める ○ これから技術で攻めていくために必要だと思っている 28

Slide 29

Slide 29 text

Any questions? 29 Jupyterで触れながら学ぶ機械学習速習会 2016-1-12, Makoto Tanji (@tan_z_tan), Wantedly速習会