損失関数で、たとえば二乗誤差になります。ハイパーパラメータであり、交差検証などで最適な値を探索する必要があります。ツリーのノードの数に応じてペナルティが課されるようになっています。大きくするとよりノード数少ないツリーが好まれるようになります。ツリーの大きさに制限をかけることで過適合を回避することが目的です。各ノードが返す値の大きさに対してペナルティがかかることを意味しています。好まれるようになります。部分で足し合わされる値が小さくなるので、過適合を避けることに繋がります。個目までに構築したツリーを所与として、目的関数を最小化するようなツリーを作ることにしましょう。個目までのツリーではうまく予測できていない部分に対してフィットするように新しいツリーを構築すると解釈できます。このように残差に対してフィットするツリーを逐次的に作成していく手法をブースティングと呼びます。最適化するのではなく、その2階近似を最適化することにしましょう。後にわかるように、2次近似によって解析的に解を求めることができます。それぞれ損失関数の1階と2階の勾配情報になります。勾配情報を使ったブースティングなので勾配ブースティングと呼ばれています。関係ない第一項は無視できます。中身を書き下しました。ついて足し合わせるように分解しています。返すというツリーの性質を利用しています。共通部分をくくっています。関しての2次式なので、解析的に解くことができます。解析的に求まりました。(絶対値で見て)小さくなることが見て取れます。T\end{align}を得ます。言い換えれば特徴量の分割ルールを決める必要があります。分割)を比較しましょう。\gamma\end{align}であり、これがプラスなら分割を行い、マイナスなら分割を行わないということになります。大きくするとより分割が行われなくなることが見て取れます。ところで、そもそもどの特徴量のどの値で分割するべきかなのでしょうか?一番ナイーブな考え方は、全ての変数に対して全ての分割点を考慮して、一番目的関数の値を減少させるような分割を選ぶというものがあります。この方法は膨大な計算量が必要になるため、XGBoostでは近似手法が提供されており、3章に記述されています。4章移行では並列計算や比較実験などが記されています。まとめXGboostの論文を読んだので、自身の理解を深めるために2章GBDT部分のまとめ記事を書きました。今までなんとなく使っていたハイパーパラメータが具体的にどの部分に効いているのか学ぶことができて、とても有意義だったと感じています。ともにゃん的データ分析ブログ*1:なお、元論文のノーテーションがおかしい/統一的でないように感じたので、一部表記を変更しています。返す関数なので、タイポかと思われます。まま進めることにしました。*5:たぶん*6:論文にはこれがimpuityみたいなものと書かれているのですが、不勉強で理解できませんでした。Validationとハイパーパラメータのチューニングについて紹介したいと思います。tidymodelsの基本的な操作方法については以下の記事をご覧下さい。dropout009.hatenablog.com前処理まずは前回の記事と同様、訓練/テストデータの分割と前処理を行います。例によってデータはdiamondsを用います。Validationさて、ここからが新しい内容になります。Validationを行うための関数vfold_cv()があるので、これを使います。df_cv$splits[[1]]<38837/4316/43153>splitsを確認します。全43153サンプルを38837の訓練データと4316の検証データに分割していることを示しています。rows訓練データにはanalysis()で、検証データにはassesment()でアクセスできます。CVデータが準備できたので、学習と予測を行いましょう。Forestモデルを用意します。42)CVデータに前処理レシピを適用するにはmap()とprepper()を使います。recipe>prepper()はprep()前のレシピを渡すことで、CV訓練データを用いてprep()したレシピを返してくれます。次に前処理済みのCVデータでモデルを学習します。<fit[+]>学習モデルを用いて検証用データに対して予測を行います。2]>pmap()は入力列が複数の場合のmap()の拡張です。予測結果を用いて検証用データで精度を計算して完了です。Validationで精度を計算する方法がわかったので、これを用いてハイパーパラメータのサーチを行います。今回はmin_nのみグリッドサーチすることにします。5の精度が最も良さそうです。このパラメータを用いて訓練データ全体でモデルを再学習し、予測精度を確認します。parsnipで作ったモデルはupdate()でパラメータを更新できます。0.0665予測結果と実際の値もプロットして確認します。=12))大きく外したり系統的なバイアスも見られないので、うまく予測できていると言えるのではないかと思います。Validationを行うことができました。Plotまとめ参考はじめにRF/GBDT/NNなどの機械学習モデルは古典的な線形回帰モデルよりも高い予測精度が得られる一方で、インプットとアウトプットの関係がよくわからないという解釈性の問題を抱えています。この予測精度と解釈性のトレードオフでどちらに重点を置くかは解くべきタスクによって変わってくると思いますが、私が仕事で行うデータ分析はクライアントの意思決定に繋げる必要があり、解釈性に重きを置いていることが多いです。いえ機械学習モデルの高い予測精度は惜しく、悩ましかったのですが、学習アルゴリズムによらずモデルに解釈性を与えられる手法が注目され始めました。Expectation)を用いて所謂ブラックボックスモデルを解釈する方法を紹介します。モデルの学習まずはパッケージを読み込みます。Forestでダイヤの価格を予測するモデルを作ります。tidymodelsの使い方は以前の記事をご覧下さい。変数重要度モデルの解釈において最も重要なのは、どの変数がアウトプットに強く影響し、どの変数は影響しないのかを特定すること、つまり変数重要度を見ることだと思います。重要な変数を見定めて施策を打つことでアウトプットをより効率よく改善できる可能性が高まりますし*1、ありえない変数の重要度が高く出ていればデータやモデルが間違っていることに気づけるかもしれません。tree系のアルゴリズムだとSplit(分割の回数)やGain(分割したときの誤差の減少量)などで変数重要度を定義することもできますが、ここではアルゴリズムに依存しない変数重要度であるPermutationベースのものを紹介します。Permutationベースの変数重要度のコンセプトは極めて直感的で、「ある変数の情報を壊した時にモデルの予測精度がすごく落ちるならそれは大事な変数だ」というものです。今回のモデルでcaratの変数重要度を見たいとします。訓練データを使って学習済みモデルを用意し、テストデータに対する予測精度を出します。テストデータのcarat列の値をシャッフルしますし、シャッフル済みテストデータを使って同様に予測を行います。2つの予測精度を比較し、予測精度の減少度合いを変数重要度とします。carat列のシャッフルによって、もしcaratが重要な変数ならモデルは的はずれな予測をするようになりますし、逆に重要でないなら特に影響は出ないはずで、これはある意味においての変数の重要度を捉えらていると思います。この手法はあくまで予測の際に用いるデータをシャッフルしていて、学習をやり直しているわけではないため、計算が軽いことも利点です。実際にPermutationベースの変数重要度を計算してみましょう。パッケージはvipを使います。手っ取り早い方法はvip()関数を使った可視化です(グラフを自分で細かくいじりたい場合はvi()での計算結果を自分で可視化します)。caratの変数重要度がその他の変数と比べてダントツであることが見て取れます。Plot各変数の重要度がわかったら、次に行うべきは重要な変数とアウトカムの関係を見ることだと思います。一般にブラックボックスモデルにおいてインプットとアウトカムの関係は非常に複雑で、可視化することは困難です。Plot(PDP)があります。PDPは興味のある変数以外の影響を周辺化して消してしまうことで、インプットとアウトカムの関係を単純化しようというものです。\end{align}で推定します。具体的には以下のようなことをやっています。変数間の交互作用がある場合にPDPでは見失ってしまう関係を確認することができます。それでは、特に重要だった変数caratについて実際にPDPを作成してみましょう。パッケージはpdpを使います。Plotの元となるデータを計算できます。細部にこだわらなければautoplot()で可視化するのが一番手っ取り早いです。赤い線がPDP、黒い線がICEになります。caratがlog(price)に与える影響が徐々に逓減していく様子が見て取れます。事前に関数形の仮定を置かずにインプットとアウトカムの非線形な関係を柔軟に捉えることができるのがRF+PDPの強力な点かと思います。value、LIMEなどがあり、次回以降に紹介できればと思っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。