コメント機械学習を行う際に大事なのがパラメーターの調整です。今まで適当にデフォルトの値でそのままやったりGridearchで探したりしていましたが、結構時間かかるので他の有効な方法を探して、手元で実際に動かして見ました。こちらの資料がわかりやすかったです。Optimizationはパラメーターをx、評価値(精度とか)をyとしてという関数を指定します(ブラックボックス関数)。中身は良くわかりませんが、この関数を最適化するパラメーターを見つけたいと思います。Optimizationはこの関数がガウス過程に従うと仮定します。下の図ではパラメーターの組み合わせをそれぞれ2,3個とって来て、その評価値を計算して結果をプロットしたグラフです。青い曲線はこの二点から導かれる関数の事後分布で、青い部分はこの分布の95%信頼区間です。このグラフを見ると、観測点から離れた部分は信頼区間の幅が広い(=σが大きい)ことがわかります。Function)獲得関数は、次にどこの点を観測するか決める関数です。Information[Contal+2014]がよく使われます。後者は特に直感的にわかりやすいと思うのですが、私たちも次にどの点を選ぶかというときに観測した点から推測して精度が良さそうな点を選びたい(μが大きい)まだ観測していない場所から選びたい(σが大きい)ということを考えて選びそうなものです。Optimizationを使いました。定番のXGBoostのパラメータを最適化します。BayesianOptimization調整したいパラメーターを引数にとる評価関数の指定、クロスバリデーション。bayesian-optimizationには評価関数の最大化のライブラリしかないので、小さい値ほどいいloglossは返り値に-1をかけます。n_iter=num_iter)結果ですだいたい15回くらいの試行でloglossが0.46136まで下がりました。やってから気づいたんですが、max_depthとかって整数の値しかとらないですね、、、ただし、ベイズ最適化には弱点もいくつかあって、カテゴリー変数の場合にうまくいかない。偶然性に左右されたり、再現性が取れないことがあるバラメーターが増えてきたら時間かかるみたいなことになるらしいです。Estimator(TPE)このような弱点を修正したのがTPEという最適化手法です。ベイズとコンセプトは似ていますが、手法は全く異なります。Searchを用いていくつか点をとってきます。プロットすると下の図のようになりました。次に精度が良かったもの(図では上位20%)とそうでなかったものに分けます。この2群の尤度関数を求めます。尤度と言っても馴染みのない人が多いと思いますが、サンプリングされたデータは様々な確率分布のうち、どの分布から得られたものとするのが一番尤もらしいかを決めようとするものです。これにより2群の確率分布が出来上がります。Improvement関数の下のように定義します。精度良かったものをl,そうではなかったものをgとして、これをそれぞれの観測点に対して適用し、最もEIの値が大きかった場所が次の観測点になります。こっちも実装してみます。Pythonではhyperoptというライブラリがあってpipで入ります。optimizationと同じやつにしてみました。1)結果logloss最小値は0.4749でした。optimizaationより悪い、、、bayesianではmax_depthを整数に限定しなかったからかも、、でも自分で手動でやった時は0.6とかだったんで、パラメーターチューニングの時にはこれからこれ使っていこうと思います。あとこのxgboost動かすのに8コアCPU使ってそれぞれ半日くらい回しました。GPU使ってたらもうちょい早かったと思うのですが、きちんとbuildとmakeしてもうまくいきませんでした。コメントをキャンセルコメントを入力してください。以下に詳細を記入するか、アイコンをクリックしてログインしてください。アカウントを使ってコメントしています。アカウントを使ってコメントしています。アカウントを使ってコメントしています。アカウントを使ってコメントしています。新しいコメントがついたらメールで通知。Blog.%d人のブロガーが「いいね」をつけました。