データサイエンス講座 第4回回機械学習その機械学習その3€¦ · 第4回回機械学習その機械学習その3 重回帰分析 (aic) 階層ベイズとmcmc.
ビッグデータのための機械学習...• Apache Spark での機械学習 –ML...
Transcript of ビッグデータのための機械学習...• Apache Spark での機械学習 –ML...
Nara Institute of Science and TechnologyAugmented Human Communication Laboratory
ビッグデータのための機械学習
2016/10/28 ビッグデータアナリティクス 第4回 1
奈良先端科学技術大学院大学
吉野幸一郎
NAISTAHC Lab.
• 機械学習の基礎
– 教師あり学習、教師なし学習
– 教師あり学習: 生成モデル、識別モデル
– 事前確率、事後確率
– 教師なし学習: k-means
• 機械学習における分散処理
– 分散処理の基本
– バッチ学習とオンライン学習
• Apache Spark での機械学習
– ML パイプライン
– DataFrame の活用
2016/10/28 ビッグデータアナリティクス 第4回 2
本日の内容
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
…
入力ベクトル 𝒙特徴量抽出
この対応をどう学習するか!
NAISTAHC Lab.
• 学習
– 訓練データ(教師ありの場合は 𝒙と 𝒕の対応、教師なしの場合は 𝒙のみ)から 𝒕 = 𝒚(𝒙)を得る過程
– 目的関数に応じて最適なモデルを得る
• 例えば二乗和誤差の最小化
• テスト
– 学習で得たモデルを別のデータ(テストデータ)で確認
• 訓練データのみを分類できるモデルが良いわけではない(過学習の問題)
• 汎化性能が高い(様々なデータを分類できる)のが良いモデル
2016/10/28 ビッグデータアナリティクス 第4回 4
学習とテスト
NAISTAHC Lab.
○が訓練データ、赤線がモデル、緑線が真のモデル
• 一番よいモデルは?
2016/10/28 ビッグデータアナリティクス 第4回 5
過学習
パターン認識と機械学習第1章, 6p
NAISTAHC Lab.
• 共通点
– いずれも学習データを与えて 𝒚(𝒙)を得る
• 教師あり学習 (例: classification, regression)
– 学習データの 𝒙と 𝒕が与えられる
– “ある入力ベクトル 𝒙に対して目標ベクトル 𝒕を得る関数𝒕 = 𝒚(𝒙)をデータから得る枠組み”の定義そのまま
• 教師なし学習 (例: clustering)
– 学習データの 𝒙のみが与えられる
– 目標ベクトル 𝒕はデータから推定する
2016/10/28 ビッグデータアナリティクス 第4回 6
教師あり学習と教師なし学習
NAISTAHC Lab.
• 教師あり学習
– 利点
• 分類したいクラスが定まっている場合に有効
– 欠点
• 目標ベクトル(正解ラベル)を与える必要がある
• 教師なし学習
– 利点
• 目標ベクトル(正解ラベル)を与える必要がない
– 欠点
• 学習されたモデルの客観的な評価が難しい
2016/10/28 ビッグデータアナリティクス 第4回 7
教師あり学習と教師なし学習の利点・欠点
NAISTAHC Lab.
• 教師あり学習
– 明らかな広告ツイートを除外する
○広告は人間が読んでわかる場合が多い
– ツイートした人の属性(年齢・性別など)を分類する
△本当にその属性なのか確認するのが難しく工夫が必要
• 教師なし学習
– ツイッターユーザを発言から何種類かに分類
○用いた手法に応じたユーザ群を出力できる
– 広告ツイートを除外する
△何が広告なのかが明らかでない
2016/10/28 ビッグデータアナリティクス 第4回 8
教師あり学習と教師なし学習の例
NAISTAHC Lab.
• 予測モデルを確率モデルで表すと
𝑷(𝒕|𝒙)
– 与えられた 𝒙からクラス 𝒕を識別するので識別モデル
• 予測モデルをベイズの定理で変形して
𝑷 𝒕 𝒙 =𝑷 𝒙|𝒕 𝑷(𝒕)
𝑷(𝒙)∝ 𝑷 𝒙|𝒕 𝑷(𝒕)
– 𝑷 𝒙|𝒕 , 𝑷(𝒕)に対して分布を仮定
– 仮定した分布から 𝑷(𝒕)が決定され 𝑷 𝒙|𝒕 が生成されるので生成モデル
2016/10/28 ビッグデータアナリティクス 第3回 9
生成モデルと識別モデル
NAISTAHC Lab.
𝑷 𝒕 𝒙 ∝ 𝑷 𝒙|𝒕 𝑷(𝒕)
• 事後確率はデータから求まる
• 事前確率はそもそもクラスが生成される確率
• どうやって 𝑷(𝒕)を求めるの?
– 一様分布に従うことにする 最尤推定
– 何らかの事前分布を置く MAP推定、ベイズ推定
2016/10/28 ビッグデータアナリティクス 第3回 10
事前確率と事後確率
事前確率事後確率
NAISTAHC Lab.
• 最尤推定
– 一様分布を仮定すると 𝑷(𝒕)は定数項
• 単純ベイズによるスパムフィルタの場合
– 各単語がそれぞれベクトルの1つの次元だと仮定している
• 𝒙 =(0, 1, 0, …)
• (それぞれの次元が (I, we, you, …)のように各単語を表す)
• これは多項分布を仮定している
– ベクトル 𝒙 = (𝒙𝟏, … , 𝒙𝑲)で表す
• 𝑷(𝑿|𝝁) = 𝒌=𝟏𝑲 𝝁𝒌
𝒙𝒌 ただし 𝒌=𝟏𝑲 𝝁𝒌 = 𝟏 (𝝁𝒌 はパラメータ)
2016/10/28 ビッグデータアナリティクス 第3回 11
最尤推定
NAISTAHC Lab.
• 二項分布の多値変数に対する拡張– 二値変数の次元数を2→𝐾次元へと拡張
– 言語処理などで一般に用いられる分布(単語 𝒘𝟏 の頻度が𝒎𝟏,..., 単語 𝒘𝑲 の頻度が𝒎𝑲)
• 二項分布– 𝒙 = 𝟏となる観測値𝑚の分布( 𝒙 = 𝟏が𝑚回)
• 𝑩𝒊𝒏 𝒙 𝑵, 𝝁 = 𝑵𝒎𝝁𝒎 𝟏 − 𝝁 𝑵−𝒎
2016/10/28 ビッグデータアナリティクス 第3回 12
多項分布とは
I We You He She
0 0 0 0 0
I
1
We
1
I
2
...
NAISTAHC Lab.
• 観測値の系列 𝑫 = {𝒙𝟏, … , 𝒙𝑵}があるとき
– 𝑷 𝑫 𝝁 = 𝒏=𝟏𝑵 𝒌=𝟏
𝑲 𝝁𝒌𝒙𝒏𝒌 = 𝒌=𝟏
𝑲 𝝁𝒌𝒎𝒌 ただし𝒎𝒌 = 𝒏𝒙𝒏𝒌
• 対数尤度を取ると
– 𝒍𝒐𝒈𝑷 𝑫 𝝁 = 𝒌=𝟏𝑲 𝒎𝒌𝐥𝐨𝐠𝝁𝒌 + 𝝀 𝒌=𝟏
𝑲 𝝁𝒌 − 𝟏
• 最尤推定すると
– 𝝁𝒌𝑴𝑳 =
𝒎𝒌
𝒌=𝟏𝑲 𝒎𝒌
• 各単語の頻度を全体の頻度で割る=最尤推定
2016/10/28 ビッグデータアナリティクス 第3回 13
最尤推定(続き)
NAISTAHC Lab.
• 学習データに登場しない単語の確率が0になる(ゼロ頻度問題)
– 分類精度に対する問題
• 学習データと実際に分類するデータの差が大きい場合分類精度が著しく落ちる
– 計算上の問題
• 確率が0 = 対数確率を取れない
事前分布を仮定することでこれらの問題は解決する
2016/10/28 ビッグデータアナリティクス 第3回 14
最尤推定の問題
NAISTAHC Lab.
• クラスが与えられた場合の各単語の生成確率を
𝑷 𝒙𝒊 𝒕 =𝑪 𝒙𝒊, 𝒕 + 𝜶
𝒊 𝑪 𝒙𝒊, 𝒕 + 𝜶
で求めて足して正規化( 𝜶はスムージング係数)
• 共役事前分布にディリクレ分布を仮定した場合と等しい
– 詳しい証明は付録
2016/10/28 ビッグデータアナリティクス 第3回 15
Add-n スムージング
NAISTAHC Lab.
• 生成モデル
𝑷 𝒕 𝒙 ∝ 𝑷 𝒙|𝒕 𝑷(𝒕)
• 𝑷 𝒙|𝒕 をベクトル 𝒙の各次元 𝒙𝒊 に対する生成確率 𝑷 𝒙𝒊|𝒕の相乗 𝒊𝑷(𝒙𝒊|𝒕)だと思う
• 𝑷(𝒙𝒊|𝒕)は学習データ中の頻度から
𝑷 𝒙𝒊 𝒕 =𝑪(𝒙𝒊, 𝒕)
𝒊𝑪(𝒙𝒊, 𝒕)
2016/10/28 ビッグデータアナリティクス 第3回 16
単純ベイズ (Naïve Bayes)
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.
スパム普通のメール
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をインストールするとデフォルトで利用可能
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]]) )
NAISTAHC Lab.
• Dirichlet分布は多項分布の共役事前分布
• 𝑷(𝝁|𝜶) ∝ 𝒌=𝟏𝑲 𝝁𝒌
𝜶𝒌−𝟏 ( 𝑵𝒎𝟏…𝒎𝑲
𝒌=𝟏𝑲 𝝁𝒌
𝒎𝒌と共役)
– 𝒌𝝁𝒌 = 𝟏
– 𝐾 − 1次元の単体上
• 𝐃𝐢𝐫 𝝁 𝜶 =𝚪( 𝒌=𝟏𝑲 𝜶𝒌)
𝒌=𝟏𝑲 𝚪 𝜶𝒌
𝒌=𝟏𝑲 𝝁𝒌
𝜶𝒌−𝟏
• 𝑷 𝝁 𝒎𝟏, … ,𝒎𝑲, 𝜶 ∝ 𝑷 𝒎𝟏, … ,𝒎𝑲 𝝁 𝑷 𝝁 𝜶
=𝚪( 𝒌=𝟏𝑲 𝒎𝒌+𝟏)
𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏
𝒌=𝟏𝑲 𝝁𝒌
𝒎𝒌 𝚪( 𝒌=𝟏𝑲 𝜶𝒌)
𝒌=𝟏𝑲 𝚪 𝜶𝒌
𝒌=𝟏𝑲 𝝁𝒌
𝜶𝒌−𝟏
=𝚪( 𝒌=𝟏𝑲 𝒎𝒌+𝟏)
𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏
𝚪( 𝒌=𝟏𝑲 𝜶𝒌)
𝒌=𝟏𝑲 𝚪 𝜶𝒌
𝒌=𝟏𝑲 𝝁𝒌
𝒎𝒌+𝜶𝒌−𝟏
2016/10/28 ビッグデータアナリティクス 第3回 20
付録: Dirichlet分布
パターン認識と機械学習 第2章, p75
NAISTAHC Lab.
• 対数尤度を取ってラグランジュの未定乗数法で解くと
– 𝝁𝒌𝑴𝑨𝑷 =
𝒎𝒌+𝜶𝒌−𝟏
𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌−𝟏)
• 𝝁𝒌𝑴𝑳 =
𝒎𝒌
𝑵(最尤推定の場合)
• つまり、各単語の頻度に何らかの値を足せばよい
– =Add-nスムージング
未知の単語も 𝜶𝒌 − 𝟏回は登場したことにする
2016/10/28 ビッグデータアナリティクス 第3回 21
付録: MAP推定
NAISTAHC Lab.
• Bayes推定の場合、𝝁を積分消去
– 𝐏 𝒎𝟏, … ,𝒎𝑲 𝜶 = 𝝁𝑷(𝒎𝟏, … ,𝒎𝑲|𝝁)𝑷 𝝁 𝜶 𝒅𝝁
= 𝝁𝚪( 𝒌=𝟏𝑲 𝒎𝒌+𝟏)
𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏
𝒌=𝟏𝑲 𝝁𝒌
𝒎𝒌 𝚪( 𝒌=𝟏𝑲 𝜶𝒌)
𝒌=𝟏𝑲 𝚪 𝜶𝒌
𝒌=𝟏𝑲 𝝁𝒌
𝜶𝒌−𝟏 𝒅𝝁
=𝚪( 𝒌=𝟏𝑲 𝒎+𝟏)
𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏
𝚪( 𝒌=𝟏𝑲 𝜶𝒌)
𝒌=𝟏𝑲 𝚪 𝜶𝒌
𝝁 𝒌=𝟏𝑲 𝝁𝒌
𝒎𝒌+𝜶𝒌−𝟏 𝒅𝝁
∝ 𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝜶𝒌
𝚪( 𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌))
– 𝐏 𝑫 𝜶 =𝚪( 𝒌=𝟏𝑲 𝜶𝒌)
𝒌=𝟏𝑲 𝚪 𝜶𝒌
𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝜶𝒌
𝜞( 𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌))
– 𝐏 𝒙𝒊 𝑫,𝜶 =𝑷(𝒙𝒊,𝑫|𝜶)
𝑷(𝑫|𝜶)
= 𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝟏+𝜶𝒌
𝜞( 𝒌=𝟏𝑲 𝒎𝒌+𝜶𝒌 +𝟏)
𝜞( 𝒌=𝟏𝑲 𝒎𝒌+𝜶𝒌 )
𝒌=𝟏𝑲 𝚪 𝒎𝒌+𝜶𝒌
=𝒎𝒌+𝜶𝒌
𝒌=𝟏𝑲 𝒎𝒌+𝜶𝒌
(MAP推定は𝒎𝒌+𝜶𝒌−𝟏
𝒌=𝟏𝑲 (𝒎𝒌+𝜶𝒌−𝟏)
)
2016/10/28 ビッグデータアナリティクス 第3回 22
付録: Bayes推定
NAISTAHC Lab.
• 𝑷 𝒕 𝒙 を直接予測するモデル
例えばロジスティック回帰
𝑷 𝒕 𝒙 =𝐞𝐱𝐩(𝒘 ∙ 𝜱(𝒙, 𝒕))
𝒕 𝐞𝐱𝐩(𝒘 ∙ 𝜱(𝒙, 𝒕))
– 𝒘は素性に対する重み
• 学習時は生成モデルと異なり 𝑷 𝒕 𝒙 の対数尤度を最大化
𝑳 𝒘𝒊 =
(𝒙𝒊,𝒕𝒊)
𝒍𝒐𝒈𝑷 𝒕𝒊 𝒙𝒊 −𝑪
𝟐𝒘 𝟐
• 持つデータのみから素朴に予測モデルを構築
– 多数のデータがある場合生成モデルより高精度
– データの生成過程が明らかな場合は生成モデルが有利な場合も
2016/10/28 ビッグデータアナリティクス 第4回 23
識別モデル
NAISTAHC Lab.
• 教師あり学習
• マージン最大化による分離平面の決定
• 識別面は各クラスの凸包を結ぶ最短の線分の中点を通り直交
• カーネル法
– 全てのベクトルをより高次元の空間(e.g. 各項の二乗など)へ射影
2016/10/28 ビッグデータアナリティクス 第3回 24
サポートベクターマシン (SVM)
NAISTAHC Lab.
• 教師なし学習
• ベクトル空間上の点をK種類に分類する
1. K個のクラスタ中心を選択(初期値: ランダム)
2. クラスタ中心からの距離でクラスラベルを決定(ラベルが変わらなければ終了)
3. 決定されたクラスラベルの平均を求めてクラスタ中心とする(2. へ)
2016/10/28 ビッグデータアナリティクス 第3回 25
K-means クラスタリング
NAISTAHC Lab.
• 機械学習による大規模データ処理は大量の計算リソースが必要
– 値段が倍になっても性能は倍にはならない(前回の授業)
– 多数の性能/価格比がよいサーバを使いたい
• 分散処理の特徴・問題
– 複数のサーバでメモリを共有できない
• DPなどの処理を分散させることが難しい
– 計算結果を共有するときのオーバヘッドが大きい
• 仮に分散させたとしてもReduceのオーバヘッドが大きく分散処理による速度向上の恩恵を受けにくい(場合によっては悪化する)
2016/10/28 ビッグデータアナリティクス 第4回 26
分散処理と機械学習
NAISTAHC Lab.
• アルゴリズムごとに考慮すべきもの
– どの計算部分を分散(map)すればよいか
– どの部分で計算結果を統合(reduce)する必要があるか
– 分散処理する上で効率的な計算方法はないか
• 単純ベイズの学習の例
– 単純ベイズでは各単語の 𝑷 𝒙𝒊 𝒕 =𝑪 𝒙𝒊,𝒕 +𝜶
𝒊 𝑪 𝒙𝒊,𝒕 +𝜶を求める
– 頻度カウントは後で足し算できるので処理を分割してよい
– 各ブロックで各単語の頻度と和を求めたら統合する
– 確率の計算は単語ごとに行ってよい
アルゴリズムごとに分散処理を考える必要
2016/10/28 ビッグデータアナリティクス 第3回 27
アルゴリズム中の分散処理
NAISTAHC Lab.
• 生成モデルでは 𝑷 𝒙𝒊 𝒕 =𝑪 𝒙𝒊,𝒕 +𝜶
𝒊 𝑪 𝒙𝒊,𝒕 +𝜶
識別モデルでは 𝑳 𝒘𝒊 = (𝒙𝒊,𝒕𝒊) 𝒍𝒐𝒈𝑷 𝒕𝒊 𝒙𝒊 −𝑪
𝟐𝒘 𝟐 を推定
• 学習データから上記のパラメータを推定する
– いずれもSUMが入る=学習データを全て見ないとパラメータを更新できない
• 学習データを全て見る=学習データをメモリに載せる
– メモリ100GB超のマシンを気軽に使えるか?
2016/10/28 ビッグデータアナリティクス 第4回 28
再訪: 機械学習はパラメータを推定する問題
NAISTAHC Lab.
• バッチ学習: 観測を全て行ってから重みを更新
• オンライン学習: 観測した事例ごとに重みを更新
• オンライン学習を使えば最低限度のパラメータのみの保持で学習が可能!
– ただし基本的にはバッチの方が性能が良い
• オンライン学習は直近に学習した事例に影響を受けやすい
– オンライン学習が有効な状況
• データを増やすことによるメリットが大きい場合
• 直近の値にモデルをどんどん適応させたい場合
2016/10/28 ビッグデータアナリティクス 第4回 29
バッチ学習とオンライン学習
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
オンライン学習 バッチ学習
• オンライン学習– エラー値が 𝐸 を上回った場合、サンプルごとに更新率 𝛼 をかけて重みを更新
• 上記の例では正則化項は無視
• バッチ学習– エラー値を蓄積していき最後に重みを更新
– 全体のエラー率で最適化される
NAISTAHC Lab.
2016/10/28 ビッグデータアナリティクス 第4回 31
興味がある人は
NAISTAHC Lab.
2016/10/28 ビッグデータアナリティクス 第4回 32
率直な感想
え、そんなん考えるのめんどくさすぎる…
NAISTAHC Lab.
2016/10/28 ビッグデータアナリティクス 第4回 33
でも大丈夫!
NAISTAHC Lab.
• Apache Spark上の機械学習ライブラリ(ml)では分散処理に最適化された機械学習アルゴリズムが使える
– spark1.xx までは mllib が主流だったがspark2.xx から MLパイプラインへ移行
毎回機械学習のアルゴリズムと分散処理を考えなくてよい
• ただし使うサーバの台数などはきちんと考える必要
map-reduce のオーバーヘッドが大きい割に処理が少ないようなプロセスを投げない
2016/10/28 ビッグデータアナリティクス 第4回 34
Apache Spark での機械学習
NAISTAHC Lab.
• Pythonの機械学習ライブラリであるsklearn的な記述が可能
– 変換器でラベルと特徴ベクトの組へ変換
• DataFrameからのデータ取り出しに相当
– 予測器で fit() することでモデルを構築
• Spark SQLを利用したデータの呼び出しが可能
– データの表記形式はDataFrameで記述
– 別にただのVectorなどで記述してもよい
2016/10/28 ビッグデータアナリティクス 第4回 35
MLパイプラインの特徴
データ モデル変換器 予測器
各予測器が想定するデータ形式
• 素性• 素性+ラベル
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)
変換器
予測器
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]))])
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)
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]
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
その他の予測器
NAISTAHC Lab.
1. 必ず教師あり学習を用いてTweetについている属性を推定する識別器を学習し別のデータでテストして結果を考察
• 例えば単語を素性にして言語を正解ラベルにする
2. できたら教師なし学習を用いてTweetを1同じクラス数に分類し1と結果を比較
• 締め切り: 11/30 23:59 JST
– 鈴木先生分とまとめて1レポートとして提出
• 提出先: TAへe-mailで送信
• 件名を「BDA2017-3課題-[名前]-[学生番号]」とする– 守っていないものは提出したと扱わない
2016/10/28 ビッグデータアナリティクス 第4回 41
必須課題
NAISTAHC Lab.
• 自由にテーマを考え,Apache Spark を用いて処理を行った結果を提示してください.
• データは何を使うか自由ですが,元のデータは少なくとも100GB 以上となるようにしてください.
• グループワークです.
• 発表日: 11/24
• 11/30 23:59 JST までに発表スライドと合わせて班で1つレポートを提出
– BDA2016-3課題-[班名] とする
– それぞれの担当箇所を章ごとに明記すること
2016/10/28 ビッグデータアナリティクス 第4回 42
発表課題