ビッグデータのための機械学習...• Apache Spark での機械学習 –ML...

42
Nara Institute of Science and Technology Augmented Human Communication Laboratory ビッグデータのための機械学習 2016/10/28 ビッグデータアナリティクス 第4回 1 奈良先端科学技術大学院大学 吉野 幸一郎

Transcript of ビッグデータのための機械学習...• Apache Spark での機械学習 –ML...

Page 1: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

Nara Institute of Science and TechnologyAugmented Human Communication Laboratory

ビッグデータのための機械学習

2016/10/28 ビッグデータアナリティクス 第4回 1

奈良先端科学技術大学院大学

吉野幸一郎

Page 2: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 機械学習の基礎

– 教師あり学習、教師なし学習

– 教師あり学習: 生成モデル、識別モデル

– 事前確率、事後確率

– 教師なし学習: k-means

• 機械学習における分散処理

– 分散処理の基本

– バッチ学習とオンライン学習

• Apache Spark での機械学習

– ML パイプライン

– DataFrame の活用

2016/10/28 ビッグデータアナリティクス 第4回 2

本日の内容

Page 3: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• ある入力ベクトル 𝒙に対して目標ベクトル 𝒕を得る関数𝒕 = 𝒚(𝒙)をデータから得る枠組み

• 数字画像認識の場合

– 目標ベクトル 𝒕は10次元でどの数字ぽいかに対応

– 入力ベクトル 𝒙はある正規化された画像から抽出された特徴

2016/10/28 ビッグデータアナリティクス 第4回 3

機械学習とは?

𝟎, 𝟎, 𝟎, 𝟏, 𝟎, 𝟎, 𝟎, 𝟎, 𝟎, 𝟎0, 1, 2, 3, 4, 5, 6, 7, 8, 9 の数字画像に相当

画像

目標ベクトル 𝒕

正解ラベル

• 座標(a, b)のピクセル値が0

• 座標(a, b)と(c,d)のピクセル値が共に0

入力ベクトル 𝒙特徴量抽出

この対応をどう学習するか!

Page 4: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 学習

– 訓練データ(教師ありの場合は 𝒙と 𝒕の対応、教師なしの場合は 𝒙のみ)から 𝒕 = 𝒚(𝒙)を得る過程

– 目的関数に応じて最適なモデルを得る

• 例えば二乗和誤差の最小化

• テスト

– 学習で得たモデルを別のデータ(テストデータ)で確認

• 訓練データのみを分類できるモデルが良いわけではない(過学習の問題)

• 汎化性能が高い(様々なデータを分類できる)のが良いモデル

2016/10/28 ビッグデータアナリティクス 第4回 4

学習とテスト

Page 5: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

○が訓練データ、赤線がモデル、緑線が真のモデル

• 一番よいモデルは?

2016/10/28 ビッグデータアナリティクス 第4回 5

過学習

パターン認識と機械学習第1章, 6p

Page 6: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 共通点

– いずれも学習データを与えて 𝒚(𝒙)を得る

• 教師あり学習 (例: classification, regression)

– 学習データの 𝒙と 𝒕が与えられる

– “ある入力ベクトル 𝒙に対して目標ベクトル 𝒕を得る関数𝒕 = 𝒚(𝒙)をデータから得る枠組み”の定義そのまま

• 教師なし学習 (例: clustering)

– 学習データの 𝒙のみが与えられる

– 目標ベクトル 𝒕はデータから推定する

2016/10/28 ビッグデータアナリティクス 第4回 6

教師あり学習と教師なし学習

Page 7: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 教師あり学習

– 利点

• 分類したいクラスが定まっている場合に有効

– 欠点

• 目標ベクトル(正解ラベル)を与える必要がある

• 教師なし学習

– 利点

• 目標ベクトル(正解ラベル)を与える必要がない

– 欠点

• 学習されたモデルの客観的な評価が難しい

2016/10/28 ビッグデータアナリティクス 第4回 7

教師あり学習と教師なし学習の利点・欠点

Page 8: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 教師あり学習

– 明らかな広告ツイートを除外する

○広告は人間が読んでわかる場合が多い

– ツイートした人の属性(年齢・性別など)を分類する

△本当にその属性なのか確認するのが難しく工夫が必要

• 教師なし学習

– ツイッターユーザを発言から何種類かに分類

○用いた手法に応じたユーザ群を出力できる

– 広告ツイートを除外する

△何が広告なのかが明らかでない

2016/10/28 ビッグデータアナリティクス 第4回 8

教師あり学習と教師なし学習の例

Page 9: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 予測モデルを確率モデルで表すと

𝑷(𝒕|𝒙)

– 与えられた 𝒙からクラス 𝒕を識別するので識別モデル

• 予測モデルをベイズの定理で変形して

𝑷 𝒕 𝒙 =𝑷 𝒙|𝒕 𝑷(𝒕)

𝑷(𝒙)∝ 𝑷 𝒙|𝒕 𝑷(𝒕)

– 𝑷 𝒙|𝒕 , 𝑷(𝒕)に対して分布を仮定

– 仮定した分布から 𝑷(𝒕)が決定され 𝑷 𝒙|𝒕 が生成されるので生成モデル

2016/10/28 ビッグデータアナリティクス 第3回 9

生成モデルと識別モデル

Page 10: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

𝑷 𝒕 𝒙 ∝ 𝑷 𝒙|𝒕 𝑷(𝒕)

• 事後確率はデータから求まる

• 事前確率はそもそもクラスが生成される確率

• どうやって 𝑷(𝒕)を求めるの?

– 一様分布に従うことにする 最尤推定

– 何らかの事前分布を置く MAP推定、ベイズ推定

2016/10/28 ビッグデータアナリティクス 第3回 10

事前確率と事後確率

事前確率事後確率

Page 11: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 最尤推定

– 一様分布を仮定すると 𝑷(𝒕)は定数項

• 単純ベイズによるスパムフィルタの場合

– 各単語がそれぞれベクトルの1つの次元だと仮定している

• 𝒙 =(0, 1, 0, …)

• (それぞれの次元が (I, we, you, …)のように各単語を表す)

• これは多項分布を仮定している

– ベクトル 𝒙 = (𝒙𝟏, … , 𝒙𝑲)で表す

• 𝑷(𝑿|𝝁) = 𝒌=𝟏𝑲 𝝁𝒌

𝒙𝒌 ただし 𝒌=𝟏𝑲 𝝁𝒌 = 𝟏 (𝝁𝒌 はパラメータ)

2016/10/28 ビッグデータアナリティクス 第3回 11

最尤推定

Page 12: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 二項分布の多値変数に対する拡張– 二値変数の次元数を2→𝐾次元へと拡張

– 言語処理などで一般に用いられる分布(単語 𝒘𝟏 の頻度が𝒎𝟏,..., 単語 𝒘𝑲 の頻度が𝒎𝑲)

• 二項分布– 𝒙 = 𝟏となる観測値𝑚の分布( 𝒙 = 𝟏が𝑚回)

• 𝑩𝒊𝒏 𝒙 𝑵, 𝝁 = 𝑵𝒎𝝁𝒎 𝟏 − 𝝁 𝑵−𝒎

2016/10/28 ビッグデータアナリティクス 第3回 12

多項分布とは

I We You He She

0 0 0 0 0

I

1

We

1

I

2

...

Page 13: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 観測値の系列 𝑫 = {𝒙𝟏, … , 𝒙𝑵}があるとき

– 𝑷 𝑫 𝝁 = 𝒏=𝟏𝑵 𝒌=𝟏

𝑲 𝝁𝒌𝒙𝒏𝒌 = 𝒌=𝟏

𝑲 𝝁𝒌𝒎𝒌 ただし𝒎𝒌 = 𝒏𝒙𝒏𝒌

• 対数尤度を取ると

– 𝒍𝒐𝒈𝑷 𝑫 𝝁 = 𝒌=𝟏𝑲 𝒎𝒌𝐥𝐨𝐠𝝁𝒌 + 𝝀 𝒌=𝟏

𝑲 𝝁𝒌 − 𝟏

• 最尤推定すると

– 𝝁𝒌𝑴𝑳 =

𝒎𝒌

𝒌=𝟏𝑲 𝒎𝒌

• 各単語の頻度を全体の頻度で割る=最尤推定

2016/10/28 ビッグデータアナリティクス 第3回 13

最尤推定(続き)

Page 14: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 学習データに登場しない単語の確率が0になる(ゼロ頻度問題)

– 分類精度に対する問題

• 学習データと実際に分類するデータの差が大きい場合分類精度が著しく落ちる

– 計算上の問題

• 確率が0 = 対数確率を取れない

事前分布を仮定することでこれらの問題は解決する

2016/10/28 ビッグデータアナリティクス 第3回 14

最尤推定の問題

Page 15: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• クラスが与えられた場合の各単語の生成確率を

𝑷 𝒙𝒊 𝒕 =𝑪 𝒙𝒊, 𝒕 + 𝜶

𝒊 𝑪 𝒙𝒊, 𝒕 + 𝜶

で求めて足して正規化( 𝜶はスムージング係数)

• 共役事前分布にディリクレ分布を仮定した場合と等しい

– 詳しい証明は付録

2016/10/28 ビッグデータアナリティクス 第3回 15

Add-n スムージング

Page 16: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 生成モデル

𝑷 𝒕 𝒙 ∝ 𝑷 𝒙|𝒕 𝑷(𝒕)

• 𝑷 𝒙|𝒕 をベクトル 𝒙の各次元 𝒙𝒊 に対する生成確率 𝑷 𝒙𝒊|𝒕の相乗 𝒊𝑷(𝒙𝒊|𝒕)だと思う

• 𝑷(𝒙𝒊|𝒕)は学習データ中の頻度から

𝑷 𝒙𝒊 𝒕 =𝑪(𝒙𝒊, 𝒕)

𝒊𝑪(𝒙𝒊, 𝒕)

2016/10/28 ビッグデータアナリティクス 第3回 16

単純ベイズ (Naïve Bayes)

Page 17: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

𝑷 𝒙𝒊 𝒕 =𝑪(𝒙𝒊, 𝒕)

𝒊𝑪(𝒙𝒊, 𝒕)

– 𝒙𝒊: メール中の単語

– 𝒕𝟏: 普通のメール

– 𝒕𝟐: スパムメール

• それぞれのメールが40単語含んでいるとすると…?

– P(click|𝒕𝟐) = 2/40 = 0.05

– P(meeting|𝒕𝟏) = 2/40 = 0.05

2016/10/28 ビッグデータアナリティクス 第3回 17

単純ベイズによるスパムフィルタ

Hi Koichiro,

Can we change

the meeting on

tomorrow?

Other meeting

Click here to find

If you wish to

stop future

mailing, please

click here.

スパム普通のメール

Page 18: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• クラス1がメール、クラス2がスパム

– メールにはwe, meetingの2単語、スパムにはwe, clickの2単語

– [we, meeting, click] のベクトルを作るとそれぞれ [1, 1, 0] と [1, 0, 1] というベクトルになる

2016/10/28 ビッグデータアナリティクス 第4回 18

sklearnを用いた単純ベイズの学習

import numpy as np

from sklearn.naive_bayes import MultinomialNB

X = np.array([[1, 1, 0],[1, 0, 1]])

y = np.array([1, 2])

clf = MultinomialNB()clf.fit(X, y) 学習 sklearnはAnaconda等で

Pythonをインストールするとデフォルトで利用可能

Page 19: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• click here と書いてある新しいメールはスパムか

– 既知語はclick だけなのでベクトル[0, 0, 1]を作る

• 分散処理のフレームワークであるSparkでもこれと大差ない手軽さで機械学習が利用可能

2016/10/28 ビッグデータアナリティクス 第4回 19

sklearnを用いた単純ベイズのテスト

z = np.array([0, 0, 1])clf.predict(z) 識別(array([2])が出力されれば成功)clf.predict_proba(z) それぞれのクラス確率を出力

(array([[ 0.33333333, 0.66666667]]) )clf.set_params(alpha=10.0) パラメータαを10.0に変更

clf.fit(X, y)clf.predict_proba(z) さっきと値が変わっているはず

( array([[ 0.47619048, 0.52380952]]) )

Page 20: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• Dirichlet分布は多項分布の共役事前分布

• 𝑷(𝝁|𝜶) ∝ 𝒌=𝟏𝑲 𝝁𝒌

𝜶𝒌−𝟏 ( 𝑵𝒎𝟏…𝒎𝑲

𝒌=𝟏𝑲 𝝁𝒌

𝒎𝒌と共役)

– 𝒌𝝁𝒌 = 𝟏

– 𝐾 − 1次元の単体上

• 𝐃𝐢𝐫 𝝁 𝜶 =𝚪( 𝒌=𝟏𝑲 𝜶𝒌)

𝒌=𝟏𝑲 𝚪 𝜶𝒌

𝒌=𝟏𝑲 𝝁𝒌

𝜶𝒌−𝟏

• 𝑷 𝝁 𝒎𝟏, … ,𝒎𝑲, 𝜶 ∝ 𝑷 𝒎𝟏, … ,𝒎𝑲 𝝁 𝑷 𝝁 𝜶

=𝚪( 𝒌=𝟏𝑲 𝒎𝒌+𝟏)

𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏

𝒌=𝟏𝑲 𝝁𝒌

𝒎𝒌 𝚪( 𝒌=𝟏𝑲 𝜶𝒌)

𝒌=𝟏𝑲 𝚪 𝜶𝒌

𝒌=𝟏𝑲 𝝁𝒌

𝜶𝒌−𝟏

=𝚪( 𝒌=𝟏𝑲 𝒎𝒌+𝟏)

𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏

𝚪( 𝒌=𝟏𝑲 𝜶𝒌)

𝒌=𝟏𝑲 𝚪 𝜶𝒌

𝒌=𝟏𝑲 𝝁𝒌

𝒎𝒌+𝜶𝒌−𝟏

2016/10/28 ビッグデータアナリティクス 第3回 20

付録: Dirichlet分布

パターン認識と機械学習 第2章, p75

Page 21: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 対数尤度を取ってラグランジュの未定乗数法で解くと

– 𝝁𝒌𝑴𝑨𝑷 =

𝒎𝒌+𝜶𝒌−𝟏

𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌−𝟏)

• 𝝁𝒌𝑴𝑳 =

𝒎𝒌

𝑵(最尤推定の場合)

• つまり、各単語の頻度に何らかの値を足せばよい

– =Add-nスムージング

未知の単語も 𝜶𝒌 − 𝟏回は登場したことにする

2016/10/28 ビッグデータアナリティクス 第3回 21

付録: MAP推定

Page 22: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• Bayes推定の場合、𝝁を積分消去

– 𝐏 𝒎𝟏, … ,𝒎𝑲 𝜶 = 𝝁𝑷(𝒎𝟏, … ,𝒎𝑲|𝝁)𝑷 𝝁 𝜶 𝒅𝝁

= 𝝁𝚪( 𝒌=𝟏𝑲 𝒎𝒌+𝟏)

𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏

𝒌=𝟏𝑲 𝝁𝒌

𝒎𝒌 𝚪( 𝒌=𝟏𝑲 𝜶𝒌)

𝒌=𝟏𝑲 𝚪 𝜶𝒌

𝒌=𝟏𝑲 𝝁𝒌

𝜶𝒌−𝟏 𝒅𝝁

=𝚪( 𝒌=𝟏𝑲 𝒎+𝟏)

𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏

𝚪( 𝒌=𝟏𝑲 𝜶𝒌)

𝒌=𝟏𝑲 𝚪 𝜶𝒌

𝝁 𝒌=𝟏𝑲 𝝁𝒌

𝒎𝒌+𝜶𝒌−𝟏 𝒅𝝁

∝ 𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝜶𝒌

𝚪( 𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌))

– 𝐏 𝑫 𝜶 =𝚪( 𝒌=𝟏𝑲 𝜶𝒌)

𝒌=𝟏𝑲 𝚪 𝜶𝒌

𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝜶𝒌

𝜞( 𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌))

– 𝐏 𝒙𝒊 𝑫,𝜶 =𝑷(𝒙𝒊,𝑫|𝜶)

𝑷(𝑫|𝜶)

= 𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏+𝜶𝒌

𝜞( 𝒌=𝟏𝑲 𝒎𝒌+𝜶𝒌 +𝟏)

𝜞( 𝒌=𝟏𝑲 𝒎𝒌+𝜶𝒌 )

𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝜶𝒌

=𝒎𝒌+𝜶𝒌

𝒌=𝟏𝑲 𝒎𝒌+𝜶𝒌

(MAP推定は𝒎𝒌+𝜶𝒌−𝟏

𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌−𝟏)

2016/10/28 ビッグデータアナリティクス 第3回 22

付録: Bayes推定

Page 23: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 𝑷 𝒕 𝒙 を直接予測するモデル

例えばロジスティック回帰

𝑷 𝒕 𝒙 =𝐞𝐱𝐩(𝒘 ∙ 𝜱(𝒙, 𝒕))

𝒕 𝐞𝐱𝐩(𝒘 ∙ 𝜱(𝒙, 𝒕))

– 𝒘は素性に対する重み

• 学習時は生成モデルと異なり 𝑷 𝒕 𝒙 の対数尤度を最大化

𝑳 𝒘𝒊 =

(𝒙𝒊,𝒕𝒊)

𝒍𝒐𝒈𝑷 𝒕𝒊 𝒙𝒊 −𝑪

𝟐𝒘 𝟐

• 持つデータのみから素朴に予測モデルを構築

– 多数のデータがある場合生成モデルより高精度

– データの生成過程が明らかな場合は生成モデルが有利な場合も

2016/10/28 ビッグデータアナリティクス 第4回 23

識別モデル

Page 24: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 教師あり学習

• マージン最大化による分離平面の決定

• 識別面は各クラスの凸包を結ぶ最短の線分の中点を通り直交

• カーネル法

– 全てのベクトルをより高次元の空間(e.g. 各項の二乗など)へ射影

2016/10/28 ビッグデータアナリティクス 第3回 24

サポートベクターマシン (SVM)

Page 25: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 教師なし学習

• ベクトル空間上の点をK種類に分類する

1. K個のクラスタ中心を選択(初期値: ランダム)

2. クラスタ中心からの距離でクラスラベルを決定(ラベルが変わらなければ終了)

3. 決定されたクラスラベルの平均を求めてクラスタ中心とする(2. へ)

2016/10/28 ビッグデータアナリティクス 第3回 25

K-means クラスタリング

Page 26: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 機械学習による大規模データ処理は大量の計算リソースが必要

– 値段が倍になっても性能は倍にはならない(前回の授業)

– 多数の性能/価格比がよいサーバを使いたい

• 分散処理の特徴・問題

– 複数のサーバでメモリを共有できない

• DPなどの処理を分散させることが難しい

– 計算結果を共有するときのオーバヘッドが大きい

• 仮に分散させたとしてもReduceのオーバヘッドが大きく分散処理による速度向上の恩恵を受けにくい(場合によっては悪化する)

2016/10/28 ビッグデータアナリティクス 第4回 26

分散処理と機械学習

Page 27: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• アルゴリズムごとに考慮すべきもの

– どの計算部分を分散(map)すればよいか

– どの部分で計算結果を統合(reduce)する必要があるか

– 分散処理する上で効率的な計算方法はないか

• 単純ベイズの学習の例

– 単純ベイズでは各単語の 𝑷 𝒙𝒊 𝒕 =𝑪 𝒙𝒊,𝒕 +𝜶

𝒊 𝑪 𝒙𝒊,𝒕 +𝜶を求める

– 頻度カウントは後で足し算できるので処理を分割してよい

– 各ブロックで各単語の頻度と和を求めたら統合する

– 確率の計算は単語ごとに行ってよい

アルゴリズムごとに分散処理を考える必要

2016/10/28 ビッグデータアナリティクス 第3回 27

アルゴリズム中の分散処理

Page 28: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 生成モデルでは 𝑷 𝒙𝒊 𝒕 =𝑪 𝒙𝒊,𝒕 +𝜶

𝒊 𝑪 𝒙𝒊,𝒕 +𝜶

識別モデルでは 𝑳 𝒘𝒊 = (𝒙𝒊,𝒕𝒊) 𝒍𝒐𝒈𝑷 𝒕𝒊 𝒙𝒊 −𝑪

𝟐𝒘 𝟐 を推定

• 学習データから上記のパラメータを推定する

– いずれもSUMが入る=学習データを全て見ないとパラメータを更新できない

• 学習データを全て見る=学習データをメモリに載せる

– メモリ100GB超のマシンを気軽に使えるか?

2016/10/28 ビッグデータアナリティクス 第4回 28

再訪: 機械学習はパラメータを推定する問題

Page 29: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• バッチ学習: 観測を全て行ってから重みを更新

• オンライン学習: 観測した事例ごとに重みを更新

• オンライン学習を使えば最低限度のパラメータのみの保持で学習が可能!

– ただし基本的にはバッチの方が性能が良い

• オンライン学習は直近に学習した事例に影響を受けやすい

– オンライン学習が有効な状況

• データを増やすことによるメリットが大きい場合

• 直近の値にモデルをどんどん適応させたい場合

2016/10/28 ビッグデータアナリティクス 第4回 29

バッチ学習とオンライン学習

Page 30: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

2016/10/28 ビッグデータアナリティクス 第4回 30

アルゴリズム上の比較

for 𝑗 in [1, 2, …, n]:

if 𝑦𝑗 − 𝑃(𝑡𝑗|𝑥𝑗 , 𝑤𝑗) > 𝐸:𝑤𝑗+1 = 𝑤𝑗 + 𝛼(𝑦𝑗 − 𝑃(𝑡𝑗|𝑥𝑗 , 𝑤𝑗))

else

𝑤𝑗+1 = 𝑤𝑗

err = 0

for 𝑗 in [1, 2, …, n]:

err += 𝑦𝑗 − 𝑃(𝑡𝑗|𝑥𝑗 , 𝑤𝑗)update 𝑤 with err

オンライン学習 バッチ学習

• オンライン学習– エラー値が 𝐸 を上回った場合、サンプルごとに更新率 𝛼 をかけて重みを更新

• 上記の例では正則化項は無視

• バッチ学習– エラー値を蓄積していき最後に重みを更新

– 全体のエラー率で最適化される

Page 31: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

2016/10/28 ビッグデータアナリティクス 第4回 31

興味がある人は

Page 32: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

2016/10/28 ビッグデータアナリティクス 第4回 32

率直な感想

え、そんなん考えるのめんどくさすぎる…

Page 33: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

2016/10/28 ビッグデータアナリティクス 第4回 33

でも大丈夫!

Page 34: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• Apache Spark上の機械学習ライブラリ(ml)では分散処理に最適化された機械学習アルゴリズムが使える

– spark1.xx までは mllib が主流だったがspark2.xx から MLパイプラインへ移行

毎回機械学習のアルゴリズムと分散処理を考えなくてよい

• ただし使うサーバの台数などはきちんと考える必要

map-reduce のオーバーヘッドが大きい割に処理が少ないようなプロセスを投げない

2016/10/28 ビッグデータアナリティクス 第4回 34

Apache Spark での機械学習

Page 35: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• Pythonの機械学習ライブラリであるsklearn的な記述が可能

– 変換器でラベルと特徴ベクトの組へ変換

• DataFrameからのデータ取り出しに相当

– 予測器で fit() することでモデルを構築

• Spark SQLを利用したデータの呼び出しが可能

– データの表記形式はDataFrameで記述

– 別にただのVectorなどで記述してもよい

2016/10/28 ビッグデータアナリティクス 第4回 35

MLパイプラインの特徴

データ モデル変換器 予測器

各予測器が想定するデータ形式

• 素性• 素性+ラベル

Page 36: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 予測器の入力フォーマットとしてDataFrameを利用

2016/10/28 ビッグデータアナリティクス 第4回 36

sklearnで言うと…

データ 結果変換器 予測器

各予測器が想定するデータ形式

• 素性• 素性+ラベル

data = {“mail”:[“we”, “meeting”],”spam”:[“we”, ”click”]}

X = np.array([[1, 1, 0],[1, 0, 1]])

y = np.array([1, 2])

clf = MultinomialNB()

clf.fit(X, y)

clf.predict(z)

変換器

予測器

Page 37: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• データフレームは各列を1つの項目としそれぞれの値を持つ

– SQL などはこの形式で記述

– Python で有名なのは Pandas

– Spark には pyspark.sql が存在

2016/10/28 ビッグデータアナリティクス 第4回 37

DataFrameからのデータの取り出し

label we meeting click

spam 1 0 1

mail 1 1 0

mail 1 0 0

変換器(DataFrameからの変換)

df = spark.createDataFrame([

... Row(label=1.0, features=Vectors.dense([1.0, 0.0, 1.0])),

... Row(label=0.0, features=Vectors.dense([1.0, 0.0, 0.0])),

... Row(label=0.0, features=Vectors.dense([1.0, 1.0, 0.0]))])

Page 38: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

2016/10/28 ビッグデータアナリティクス 第4回 38

単純ベイズを利用した教師あり学習の例

pyspark2

from pyspark.ml.clustering import NaiveBayes

from pyspark.ml.linalg import Vectors

from pyspark.sql import Row

df = spark.createDataFrame([

Row(label=1.0, features=Vectors.dense([1.0, 0.0, 1.0])),

Row(label=0.0, features=Vectors.dense([1.0, 0.0, 0.0])),

Row(label=0.0, features=Vectors.dense([1.0, 1.0, 0.0]))])

nb = NaiveBayes(smoothing=1.0, modelType="multinomial")model = nb.fit(df) この例だと少数なのに重い

数が大きくなると恩恵を受けられる

test = spark.createDataFrame([Row(features=Vectors.dense([0.0, 0.0, 1.0]))])

result = model.transform(test)

Page 39: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

2016/10/28 ビッグデータアナリティクス 第4回 39

K-meansを利用した教師なし学習

pyspark2

from pyspark.ml.classification import KMeans

from pyspark.ml.linalg import Vectors

from pyspark.sql import Row

df = spark.createDataFrame([

Row(features=Vectors.dense([1.0, 0.0, 1.0])),

Row(features=Vectors.dense([1.0, 0.0, 0.0])),

Row(features=Vectors.dense([1.0, 1.0, 0.0]))])

kmeans = KMeans(k=2)

model = kmeans.fit(df)

model.clusterCenters() K-meansのクラスタ中心を見る

transformed = model.transform(df).select(“features”, “prediction”) ラベル付与

rows = transformed.collect()

[rows[0].prediction,rows[1].prediction,rows[2].prediction]

Page 40: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• http://spark.apache.org/docs/2.0.0/api/python/pyspark.ml.html

• 今回紹介したアルゴリズム

– 単純ベイズ: NaiveBayes

– ロジスティック回帰: LogisticRegression

– SVM: OneVsRest

– K-means: KMeans

• その他

– classification(教師あり)、clustering(教師なし)regression(回帰)、feature(特徴量抽出)

• featureにはPCA, word2vecなどもある

2016/10/28 ビッグデータアナリティクス 第4回 40

その他の予測器

Page 41: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

1. 必ず教師あり学習を用いてTweetについている属性を推定する識別器を学習し別のデータでテストして結果を考察

• 例えば単語を素性にして言語を正解ラベルにする

2. できたら教師なし学習を用いてTweetを1同じクラス数に分類し1と結果を比較

• 締め切り: 11/30 23:59 JST

– 鈴木先生分とまとめて1レポートとして提出

• 提出先: TAへe-mailで送信

• 件名を「BDA2017-3課題-[名前]-[学生番号]」とする– 守っていないものは提出したと扱わない

2016/10/28 ビッグデータアナリティクス 第4回 41

必須課題

Page 42: ビッグデータのための機械学習...• Apache Spark での機械学習 –ML パイプライン –DataFrame の活用 2016/10/28 ビッグデータアナリティクス

NAISTAHC Lab.

• 自由にテーマを考え,Apache Spark を用いて処理を行った結果を提示してください.

• データは何を使うか自由ですが,元のデータは少なくとも100GB 以上となるようにしてください.

• グループワークです.

• 発表日: 11/24

• 11/30 23:59 JST までに発表スライドと合わせて班で1つレポートを提出

– BDA2016-3課題-[班名] とする

– それぞれの担当箇所を章ごとに明記すること

2016/10/28 ビッグデータアナリティクス 第4回 42

発表課題