>100 Views
November 22, 25
スライド概要
機械学習・音声認識・プログラミングに関する書籍を執筆しています。
4. 識別 ー統計的手法ー Rain 事前確率 条件付き確率 Wet grass 4.1 統計的識別とは 4.2 カテゴリ特徴に対するベイズ識別 4.3 ベイジアンネットワーク 荒木雅弘 : 『Pythonではじめる機械学 習』 (森北出版,2025年) スライドとコード
第3章(決定木)と第4章(統計的識別)の違い 決定木 正解を表現する概念を得る(説明性が高い) 統計的識別 識別結果の確率を得る(意思決定に役立つ)
weather.nominalデータ No outlook temperature humidity windy play 1 sunny hot high FALSE no 2 sunny hot high TRUE no 3 overcast hot high FALSE yes 4 rainy mild high FALSE yes 5 rainy cool normal FALSE yes 6 rainy cool normal TRUE no 7 vercast cool normal TRUE yes 8 sunny mild high FALSE no 9 sunny cool normal FALSE yes 10 rainy mild normal FALSE yes 11 sunny mild normal TRUE yes 12 overcast mild high TRUE yes 13 overcast hot normal FALSE yes 14 rainy mild high TRUE no outlook(天候) sunny, overcast, rainy temperature(気温) hot, mild, cool humidity(湿度) high, normal windy(風) TRUE, FALSE play(=クラス) yes, no
4.1 統計的識別とは (1/4) weather.nominalデータに対する統計的識別 2クラス分類問題(play: yes/no) 特徴ベクトル x が観測されていないとき 事前確率 P (yes), P (no) だけから判断するしかない 特徴ベクトル x 観測後 事後確率 P (yes ∣ x), P (no ∣ x) の大きい方に判定 多クラス (ωi : i = 1, … , c) に一般化 最大事後確率則による識別(ベイズ識別) CMAP = arg max P (ωi ∣ x) i
4.1 統計的識別とは (2/4) 事後確率の求め方 データの発生頻度に基づく方法 特徴ベクトルが完全に一致する事例を大量に集めて,その正解ラベルの割合を求める 例) x = (晴, 高, 中, TRUE) を100事例集めて,yes:70事例, no:30事例ならば P(yes ∣ (晴, 高, 中, TRUE)) = 0.7 とする しかし,上記の推定が行えるようなデータセットが得られることはほとんどない そのため,事後確率に対して式変形・近似を行って,現実の規模のデータセットから確 率を推定できるようにする
4.1 統計的識別とは (3/4) ベイズの定理 P (A ∣ B) = P (B ∣ A)P (A) P (B) 事後確率を尤度と事前確率の積に変形する手順 事後確率にベイズの定理を適用 最大値を求めるときに無関係な分母を払う CMAP = arg max P (ωi ∣ x) = arg max i i P (x ∣ ωi )P (ωi ) = arg max P (x ∣ ωi )P (ωi ) P (x) i 尤度:特定のクラスから,ある特徴ベクトルが出現する尤もらしさ
4.1 統計的識別とは (4/4) ベイズ統計とは 結果から原因を求める 通常の統計学は原因から結果を予測する ベイズ識別 通常,確率が与えられるのは 原因→結果(尤度) ベイズ識別では,事前分布 P (ωi ) が,観測結果 x によって事後分布 P (ωi ∣ x) に変化 したと考え、その結果をもたらした原因 ωi を求める
4.2 カテゴリ特徴に対するベイズ識別 事前確率:P (ωi ) 特徴ベクトルを観測する前の各クラスの起きやすさ 事前確率の最尤推定 学習データ中のクラスの割合から推定する N : 全データ数, ni : クラス ωi のデータ数 P (ωi ) = ni N
学習データの対数尤度 (1/3) 尤度の導出 特徴ベクトル x を生成するモデルを考え,そのモデルが(クラスごとの)パラメータ θ j に従ってデータを生成していると仮定 P (x ∣ ωj ; θ j ) これらはクラス毎のデータから推定することになるので,以後,1クラス分のデータを 全データD とみなして ωj を省略し,θ j を θ と表記 i.i.d. (independent and identically distributed, 独立同分布) を仮定 全データ D は,各データが同じ分布から独立に生成されていると仮定して尤度を計算 N P (D ∣ θ) = ∏ P (xi ∣ θ) i=1
学習データの対数尤度 (2/3) 対数尤度: L(D) 確率の積のアンダーフローを避けるため,尤度を対数で計算 N L(D) = log P (D ∣ θ) = ∑ log P (xi ∣ θ) i=1 尤度関数の仮定の例 特徴ベクトルが1次元,値0 or 1で,ベルヌーイ分布に従うと仮定 ベルヌーイ分布:確率 θ で値1,確率 1 − θ で値0をとる分布 N N N L(D) = ∑ log θxi (1 − θ)(1−xi ) = ∑ xi log θ + (N − ∑ xi ) log(1 − θ) i=1 i=1 i=1
学習データの対数尤度 (3/3) 対数尤度を最大にするパラメータ:θ^ ∂L(D) = 0 の解である θ^ を求める ∂θ N N ∂L(D) 1 1 = ∑ xi + (N − ∑ xi ) ∂θ θ 1−θ i=1 i=1 N N 1 {(1 − θ) ∑ xi − θ(N − ∑ xi )} = 0 = θ(1 − θ) i=1 i=1 N 1 ^ θ= ∑ xi N i=1 値1がでる確率の最尤推定値として,値1がでた回数を全データ数 N で割ったものが得 られた
ナイーブベイス識別 (1/5) 多次元ベクトルの尤度関数を求める 特徴値のすべての組合せがデータセット中に何度も出てくる必要があるが,これも非現 実的 ナイーブベイズの近似 すべての特徴が独立であると仮定すると,同時確率は各次元の確率の積で求められる 各次元で,クラスごとの特徴値の確率分布(尤度)を推定すればよい d P (x ∣ ωi ) = P (x1 , … , xd ∣ ωi ) ≈ ∏ P (xk ∣ ωi ) play k=1 d CNB = arg max P (ωi ) ∏ P (xk ∣ ωi ) i k=1 outlook temperature humidity windy
ナイーブベイス識別 (2/5) 尤度の最尤推定 nj : クラス ωj のデータ数 nk : クラス ωj のデータのうち,k 次元目の値が xk であるデータ数 P (xk ∣ ωj ) = nk nj ゼロ頻度問題: nk が 0 の場合,確率の推定値も 0 となってしまう 解決法 → スムージング k 次元目の m 種類の値が,事前に α 回ずつ生じていたと仮定する α = 1 のときをラプラス推定とよぶ P (xk ∣ ωj ) = nk + α nj + αm
ナイーブベイス識別 (3/5) scikit-learnのナイーブベイズ識別 カテゴリ特徴は OrdinalEncoder で整数値に置き換える enc = OrdinalEncoder() X_en = enc.fit_transform(X) enc.categories_ [array(['overcast', 'rainy', 'sunny'], dtype=object), array(['cool', 'hot', 'mild'], dtype=object), array(['high', 'normal'], dtype=object), array([False, True], dtype=object)] 変換例 ['sunny', 'hot', 'high', False] → [2, 1, 0, 0] 異なる値に異なる整数値を割り当てているだけであって,数値の近さが概念の近さを表 しているのではないことに注意
ナイーブベイス識別 (4/5) scikit-learnのナイーブベイズ識別 正解のラベルは LabelEncoder で整数値に置き換える le = LabelEncoder() y_en = le.fit_transform(y) le.classes_ array(['no', 'yes'], dtype=object) no → 0, yes → 1
ナイーブベイス識別 (5/5) scikit-learnのナイーブベイズ識別 カテゴリ特徴に対するナイーブベイズ識別は CategoricalNB を用いる 識別器のパラメータ arpha : 事前に仮定するサンプル数.教科書の mp に対応 fit_prior : 事前確率を学習の対象とするかどうか class_prior : 事前確率を別途与えるときに用いる 典型的なコード clf = CategoricalNB() clf.fit(X, y) clf.predict_proba(X_test[1])
4.3 ベイジアンネットワーク (1/7) ベイジアンネットワークの仮定: 変数の部分集合が,ある分類値のもとで独立 P arents(Xk ) は値 xk をとるノードの親ノード集合の値 d P (x1 , … , xd ) ≈ ∏ P (xk ∣ P arents(Xk )) k=1 条件付き確率のベイジアンネットワークによる表現 play windy humidity outlook temperature
4.3 ベイジアンネットワーク (2/7) 変数間の独立性を表す基本パターン Head-to-tail Tail-to-tail Head-to-head
4.3 ベイジアンネットワーク (3/7) Head-to-tail 真ん中のノードの値が与えられると,左右のノードは独立 Cloudy Rain Wet grass
4.3 ベイジアンネットワーク (4/7) Tail-to-tail 親ノードの値が与えられると,子ノードどうしは独立 Cloudy Sprinkler Rain
4.3 ベイジアンネットワーク (5/7) Head-to-head 子ノードの値が与えられると,親ノードどうしが独立でなくなる Sprinkler Rain Wet grass
4.3 ベイジアンネットワーク (6/7) 確率計算 正確な計算:周辺化によって,すべての値に対する確率を合計する 近似計算:乱数を用いてベイジアンネットワークの確率分布に従った事例を生成し,確 率を推定する P (y ∣ x1 , … , xd ) ≈ C(y, x1 , … , xd ) C(x1 , … , xd )
4.3 ベイジアンネットワーク (7/7) ベイジアンネットワークの学習 入力: ノードの集合 Node,各変数の観測データ 出力: 学習されたベイジアンネットワーク 1. ノードの順番を決める(通常はクラスを表す特徴を最初に) 2. 親ノードの追加を貪欲法で繰り返す repeat for n in Node: for n’ in n以降のノード: if n から n’ へのエッジを追加することにより対数尤度が増加 n から n’ へエッジを追加 until 対数尤度が変化しない 3. return 学習されたベイジアンネットワーク
まとめ カテゴリ特徴の識別問題に対する統計的識別 ベイズ識別 事後確率 P (ωi ∣x) を最大とするクラス ωi を求める 事後確率をデータから推定するのは難しいので,ベイズの定理を用いて尤度 P (x ∣ ωi ) と事前 確率 P (ωi ) の積に分解 ナイーブベイズ法 特徴のすべての次元が独立であると仮定して,尤度をそれぞれの次元の確率の積に分解 確率が0となることを避けるためにスムージングを行う ベイジアンネットワーク 変数の部分集合が,ある分類値のもとで独立であるとして構造を推定