kaggle本第4章
第4章 モデルの作成
4.1 モデルとは何か?
ハイパーパラメータをどう決めるか?
良さげなカーネルのハイパーパラメータの使いまわしをよくするのですが皆さんいかがでしょうかwakame.icon
ですよね。カーネルの良さげなやつ使い回すのがいいと思います。自分は最終日にoptunaを使うことが多いですcurrypurin.icon
最終段階でoptunaを回して精度が上がったことがありません・・・。最初に決めたパラメータに対して、自身が試行錯誤した特徴量などが過学習しているため、それ以上改善しないのでは?と個人的に考えています。実はコンペの最初にoptunaを回して、それなりに良いパラメータを得るのが有効なのでは、と思っているのですがどうなのでしょう。sinchir0.icon
コンペ序盤の特徴が少ない状況と終盤の特徴が多い状況だと、有効なパラメータは違っていると思っていますcurrypurin.icon
最初に決めたパラメータによって、特徴の取捨選択をしているから・・というのは可能性としてはありますが、経験的にはCVはoptunaを使うとこれまで間違いなく私は上がっています。
となると僕が正しくoptunaを回せていない可能性高いですね・・・!使い方を見直してみますsinchir0.icon
最近のoptunaのアップデートで追加されたLightGBMTunerでハイパーパラメータを決定するのは良さげでしたwakame.icon
はじめにハイパーパラメータを決定するときに使ってみるのも良さげ?
smlyさんのコードほぼ使いまわしですがタイタニックでサンプルカーネルを作りました
CPMP氏のパラメータチューニングの方法
4.1.2 モデル作成の流れ
スタッキングなどのアンサンブル(7章参照)を行うことを考えると、結局クロスバリデーションが必要になるためです。(4.1.2 P.224)
この一文の意味がよくわからなかったwakame.icon
アンサンブル時にも過学習を回避するためにクロスバリデーションをするから > 7.2.1 平均、加重平均 P.357
スタッキングがそもそも学習データをfoldに分けるという処理をするから > 7.3.1 スタッキングの概要 P.360
全トレーニングデータのoofが必要なので、結局クロスバリデーションが必要ということですね
一方、後者の学習データ全体に対して学習させる場合には・・・(4.1.2 p.225)
この手法、kernelでもあまり見かけないのですが、もしやったことある方いたら感想などお聴きしたいです。sinchir0.icon
clossvalidationしないということですよね、最近のコンペでそういう解法は見たことないですねwakame.icon
使える手法だと思います。性能的には、5fold vs 全データ5seed averageで比べるとほぼ変わらないという意見が多いと思います。Jackさんの神資料(データサイズ, アベレージング)があるので、これを参考に使うと良いです。currypurin.icon 場合によっては全データで学習しないと、性能が少し落ちる場合もあるかと思います。例えばshuffleして学習するのが不適切なデータで、shuffleしないでtrainとvalに分けた場合に、trainに含まれる値がvalに含まれない場合などcurrypurin.icon
4.1.3 モデルに関連する用語とポイント
Overfittingに対応する日本語が過学習より過適合のほうがあっている気がする (4.1.3 P.226)wakame.icon
LightGBMの正則化パラメータ、reg_alphaとreg_lambdaってまともにいじったとこがないwakame.icon
なお、バリデーションで適切な評価を行うためには、学習時にバリデーションデータの情報を使ってはないけない (4.1.3 アーリーストッピング p.227)
バリデーションデータの本来の目的が学習経緯の観察に使うためのデータであるから?wakame.icon
バギングやアンサンブルなどのワードの定義が曖昧で同じような意味で捉えてしまっているwakame.icon
4.2 分析コンペで使われるモデル
4.3 GBDT(勾配ブースティング木)
決定木の分岐を(c < 5,5 <= c)と(c <= 5, 5 < c)と重ねることで、cが5であるという特徴が抽出されるためです。(4.3.2 p234)
少し話が変わりますが、上記のような分岐の回数を減らせるため、LabelEncodingした順序変数の大小と目的変数に相関があるよう変数を作ってあげた方が決定木にとってより良い変数という認識です。合ってますかね?sinchir0.icon
ちょっとイメージが湧かなくて、もう少し説明もらえるとありがたいです
Learning APIとScikit-LearnAPIのどちらを使うか(4.3.5 P238)。
観測範囲だと、Scikit-LearnのAPIじゃない方を使う人が多いcurrypurin.icon
追記 Learning APIの例で使用例が多い、lightgbm.Dataset(Learning APIのこと)を使うとメモリ効率が良いとかwakame.icon
The Dataset object in LightGBM is very memory-efficient, it only needs to save discrete bins. However, Numpy/Array/Pandas object is memory expensive. If you are concerned about your memory consumption, you can save memory by:
Kernelでcategoryにしていたり、しませんかね。データによっては精度大きく変わります。でもデータによっては変わらないですよね。one hot encodingしないXGboostが強かったりするデータもありますし。
もしかしてastype("category")にしておけば、「Categorical Featureに指定した」という意味になるんですかね?そこを理解していなかったため、categoryかどうかを確認していませんでした・・・!sinchir0.icon
astype("category")にして効果があるかどうかはやってみないとわからないものがある
追記 LightGBMのcategorical featuresの取り扱いについてone hot encodingよりも効果があるという記述wakame.icon
LightGBM offers good accuracy with integer-encoded categorical features. LightGBM applies Fisher (1958) to find the optimal split over categories as described here. This often performs better than one-hot encoding.
ただしgotoさんの意見ではone hot encodingのほうがスコアが良かった場合もあるとのこと
つまり、ある分岐でカテゴリ変数が使われたとき、そのカテゴリ変数と他のカテゴリ変数との組み合わせに対してtarget encodingの計算が行われ、それより深い分岐においてその結果が使われます。(4.3.7 p241)
この文章の意味が理解できませんでしたsinchir0.icon
知らなかった。複数カテゴリでの(AかつBという複数の条件での抽出を行なっての)target encodingが行われるということみたいですね。currypurin.icon
追記 catboost側で自動でtarget encodingするのであれば手動でtarget encodingしないほうが良い?wakame.icon
Column xgboostのアルゴリズムの解説
4.4 ニューラルネット
ニューラルネットの特徴として挙げられているGPUでの高速化
最近だとxgboost / lightgbm / catboostもGPU対応されていて計算も高速化できるようになっている
4.4.6 参考になるソリューション
4.4.7 参考になるソリューション 最近のニューラルネットの発展
4.5 線形モデル
特徴量は基本的に標準化が必要
特徴量の大きさが揃っていない場合は、正則化の効き方が特徴量によって異なってしまうため、学習が上手くいかないことがあります。(4.5.2 p257)
とあるのですが、線形モデルで標準化しなかった場合、問題が発生するのは正則化の際だけなんですかね?個人的には、標準化が行われていないと、線形モデルの各変数に対する係数を決定する際に、各特徴量が平等に扱われないと思っていました。sinchir0.icon
L1正則化を行った場合、予測に寄与していない特徴量の係数が0になる性質がある この性質を利用して、線形モデルを特徴選択に利用することがあります。(4.5.2 p257)
下記記事に、実際にLasso回帰を用いた特徴選択例が載ってます。sinchir0.icon
また、Ridge回帰による変数選択がえじさんの下記記事の「特徴量」の部分で触れられてたりします。sinchir0.icon
4.6 その他のモデル
4.7 モデルのその他のポイントとテクニック
4.7.4 pseudo labeling (P.266)
回帰のタスクの場合は、どうやってデータを絞るんだろう。currypurin.icon
分類は、->「分類タスクでは予測確率が十分高いテストデータのみを加える」
Column 分析コンペ用のクラスやフォルダの構成
kaggle本での例
takapyさんの特徴量管理例
参考