Python ではじめる機械学習 10. アンサンブル学習

>100 Views

November 22, 25

スライド概要

profile-image

機械学習・音声認識・プログラミングに関する書籍を執筆しています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

10. アンサンブル学習 結果 弱識別器1 結果 弱識別器2 … ⼊⼒ 弱識別器L 結果 多 数 決 / 重 み 付 き 投 票 識別結果 10.1 なぜ性能が向上するのか 10.2 バギング 10.3 ランダムフォレスト 10.4 ブースティング 10.5 勾配ブースティング 荒木雅弘 : 『Pythonではじめる機械学 習』 (森北出版,2025年) スライドとコード

2.

10.1 なぜ性能が向上するのか (1/2) アンサンブル学習の基本的なアイディア 複数の識別器の結果を多数決で統合することで,より強力な識別器を作成する 学習データから L 個の弱識別器(誤り率 ϵ, 誤りは独立)を作成できると仮定 m 個の弱識別器が誤る確率は二項分布 B(m; ϵ, L) = L Cm ϵm (1 − ϵ)L−m に従う ϵ < 0.5 のとき,m > L/2 となる確率は小さい値になる ​ ​ のときの⼆項分布 過半数 の 識別器が誤る確率

3.

10.1 なぜ性能が向上するのか (2/2) このアイディアの非現実的なところ 「それぞれの弱識別器の誤りが独立」→ 「データの誤りやすさに差はない」 現実には,弱識別器間で誤りの相関がある 識別しやすい 識別しにくい 多くの識別器 が誤る アンサンブル学習の目標 「弱識別器の誤りが独立」に近づけるために,なるべく異なる振る舞いをする弱識別器 を作成する

4.

10.2 バギング (1/3) アイディア 異なる学習データから作成された弱識別器は,異なる振る舞いをする可能性が高い Bagging (bootstrap aggregating) とは 元の学習データから復元抽出によって異なるデータ集合を複数作成 それぞれに対して弱識別器を作成 結果を多数決で統合

5.

10.2 バギング (2/3) バギングの構成 識別 学習 未知データ データ1 弱識別器1 復元抽出 データL 弱識別器2 … … 学習データ データ2 弱識別器L 多 数 決 識別結果

6.

10.2 バギング (3/3) 学習 学習データから復元抽出を行って,元データと同サイズのデータ集合を複数作成する N 回抽出を行って,特定のデータが抽出されない確率: (1 − N1 )N ​ N → ∞ で 1e ∼ 0.368 ​ 各々のデータ集合に対して同じアルゴリズムで弱識別器を作成する アルゴリズムは不安定(学習データの違いに敏感)なほうがよい 例) 枝刈りをしない決定木 識別 弱識別器に差を付ける根拠がないので,結果の統合は多数決 バギングの欠点 現実には,作成される弱識別器はそれほど大きく異ならない

7.

10.3 ランダムフォレスト (1/2) アイディア バギングにおける弱識別器作成アルゴリズムにランダム性を入れることで,弱識別器間 の異なりを大きくする ランダムフォレストとは ランダム:学習の際に用いる特徴を乱数によって制限する フォレスト:森 = 複数の決定木 利点 各抽出データ毎に比較的大きく異なった弱識別器ができる 森のサイズ(=決定木の数)を大きくしても,過学習が起きにくい

8.

10.3 ランダムフォレスト (2/2) ランダムフォレストの学習 学習データ A C D E class { A, B, C, D, E} 乱数で制限 B A,B,Eから選択 B >= b B<b A E … 1 2 3 B 決定⽊の学習 × L A,C,Dから選択 復元抽出 × L

9.

10.4 ブースティング (1/3) アイディア 逐次的に能力を向上させる(boost させる)弱識別器を追加してゆく ステップ t − 1 に作成した弱識別器が誤識別したデータの重みを大きくし,ステップ t では,そのデータを正しく識別しやすい弱識別器を作成 構成 学習アルゴリズムは重み付きデータに対応しているものが望ましい 重みに対応していない場合は,重みに比例してデータを復元抽出 過学習とならないように,弱識別器として浅い決定木を用いることが多い 結果は弱識別器の性能に基づく重み付き投票

10.

10.4 ブースティング (2/3) ブースティングの構成 未知データ 学習 正しく識別された データの重みを減らす 誤識別されたデータの 重みを増やす 弱識別器2 … 弱識別器L … … … 弱識別器1 重み付き投票 識別結果

11.

10.4 ブースティング (3/3) AdaBoostアルゴリズム(2値分類の場合) (i) 1. 開始時は全学習データに同じ重み w0 ​ = N1 を付与 ​ 2. t = 1 から L まで以下を繰り返し 1. t 番目の弱識別器を作成.それを用いて誤り率 rt (< 0.5) を算出 ​ (i) N rt = ∑i=1 wt [yi =  ht (xi )] ​ ​ ​ ​ (i) ∑N w t i=1 ​ ​ ​ ​ ​ t 2. 弱識別器の重み αt = η ln 1−r を計算(η は学習率) r ​ ​ t ​ (i) (i) 3. 誤識別されたデータの重みを wt+1 = wt ​ ​ exp(αt ) に修正 ​ 4. 全体の重みを正規化 (i) wt+1 = ​ (i) wt+1 ​ (j) ∑N j=1 wt+1 ​ ​ ​

12.

10.5 勾配ブースティング (1/8) 勾配ブースティングとは ブースティングにおける各ステップで,これまでで作成したアンサンブル識別器に追加 したときの損失関数の値が最小となる弱識別器を加える ブースティングの一般化 全体の識別器の出力は,F (x) は,M 個の識別器 h(x; γm ) の重み付き和で得られる ​ γm は識別器のパラメータ ​ M F (x) = ∑ αm h(x; γm ) ​ m=1 ​ ​

13.

10.5 勾配ブースティング (2/8) 学習の手順 識別器の学習を逐次加法的な学習プロセスに分解 Fm (x) = Fm−1 (x) + αm h(x; γm ) ​ ​ ​ ​ 第 m ステップで加える弱識別器 hm (x) を選択するための損失関数の導入 ​ ステップ m の時点でのアンサンブル識別器の損失を Lm とする ​ 損失関数 Lm の例 ​ 回帰: 2乗誤差,Huber損失 識別: log損失,指数損失 N (αm , γm ) = arg min ∑ L(yi , Fm−1 (xi ) + αh(xi ; γ)) ​ ​ ​ α,γ ​ i=1 ​ ​ ​

14.

10.5 勾配ブースティング (3/8) 勾配ブースティングのアイディア 損失関数の値が最小になるものを求め,新しい識別器を構成する n Fm (x) = Fm−1 (x) + αm ∑ ∇F L(yi , Fm−1 (xi )) ​ ​ ​ ​ ​ ​ ​ ​ i=1 損失関数を差分とみなし,これを最小化する弱識別器を追加していると解釈できる

15.

10.5 勾配ブースティング (4/8) 弱回帰器の例 回帰対象のデータを作成 np.random.seed(2) X = np.linspace(-1, 1, 100) y = X**2 + np.random.normal(0, 0.1, 100) plt.scatter(X, y) plt.xlabel(r"$x$") plt.ylabel(r"$y$") plt.show()

16.

10.5 勾配ブースティング (5/8) 最初の弱回帰器 深さ3の回帰木を用いて回帰を行う 関数 reg_plot() の定義は,サポートページのコード chap10.ipynb を参照 tree_reg1 = DecisionTreeRegressor(max_depth=3, random_state=2) tree_reg1.fit(X.reshape(-1, 1), y) reg_plot(X, y, tree_reg1)

17.

10.5 勾配ブースティング (6/8) 差分をターゲットとして,次の弱回帰器を作成 y2 = y - tree_reg1.predict(X.reshape(-1, 1)) tree_reg2 = DecisionTreeRegressor(max_depth=3, random_state=2) tree_reg2.fit(X.reshape(-1, 1), y2) reg_plot(X, y2, tree_reg2)

18.

10.5 勾配ブースティング (7/8) 同様の手順で次の回帰木を作成 y3 = y2 - tree_reg2.predict(X.reshape(-1, 1)) tree_reg3 = DecisionTreeRegressor(max_depth=3, random_state=2) tree_reg3.fit(X.reshape(-1, 1), y3) reg_plot(X, y3, tree_reg3)

19.

10.5 勾配ブースティング (8/8) 勾配ブースティングで作成したアンサンブル回帰木 class FinalRegressor: def predict(x): return tree_reg1.predict(x) + tree_reg2.predict(x) + tree_reg3.predict(x) reg_plot(X, y, FinalRegressor)

20.

まとめ アンサンブル学習とは 弱識別器を複数組み合わせ,それらの結果を統合 異なる振る舞いをする弱識別器を作る バギング 復元抽出で異なる学習データを作成 ランダムフォレストは,バギング+決定木学習において乱数で特徴を制限 ブースティング 以前の識別器の誤りを補完する識別器を順次作成 勾配ブースティングは,損失関数の勾配に基づいて弱識別器を追加