teke teke my life デジガジェ分室(移転済)

teke teke my lifeの分室。デジタル機器に関する記事です。

Kaggle系の分類問題コンペで初心者がスコアアップに向けてすべき対応のまとめ

この記事は別室に移転しました。3秒後に転送します。

前回の記事でベースとなるところまでの引っかかりどころを記載したのですが、今回の記事では、スコアアップに向けて何をするか、というポイントのメモをしておきます。

なお、今回も当然ながら責任はとれませんので、あくまでご参考です。コードはchatGPTくんにきいてみてください。

尚、トレーニングデータはラベルエンコーディングorワンホットエンコーディング済でそのまま学習させてもLightGBMでモデルが作成できる状態にある前提です。

全体感

概ね、検討すべき対応は以下の通りです。

  • 欠損値や異常値(外れ値)の処理(影響:小)
  • 新特徴量の作成(影響:大)
  • 特徴量の選択(影響:小)
  • モデルのハイパーパラメータ調整(影響:大)
  • クロスバリデーションの実施(影響:小)
  • アンサンブル学習の実施(影響:大)

なお、影響の大中小はスコアへの寄与度の感覚ですので、コンペにおける重要度とは少し異なります。

モデルのハイパーパラメータ調整以降はスコアに劇的に効くのですが、反面、みんなグリッドサーチやらなんやらである程度の解を持ってくるため、モデルのチューニングはあまり差が出るところではありません。
それ以前の特徴量エンジニアリングで差が出る印象ですね。

(なお、アンサンブル学習のアンサンブルの仕方は結構工夫の余地があります)

特徴量エンジニアリング

一番重要なのは特徴量エンジニアリングであることは明らかなので、注力すべきところになります。

とはいえ、実態としては初めてモデル作成するようなレベルだと、ハイパーパラメータを調整したりする方を先にやった方がスコアアップにつながりやすくて達成感はあります。

特徴量エンジニアリングに関しては、閃きも結構必要なので、「煮詰まったらまた後日考える」というぐらいのゆるさで取り組むのが良いと思います。

欠損値や異常値の処理(影響:小)

まず、欠損値や異常値の処理についてです。

欠損値の補完

特に、欠損値については、欠損値があると利用できないランダムフォレストなどのモデルがあり、モデルをアンサンブルしたりする場合は邪魔になります。
かといって、単純に列自体を削除すると特徴量が失われることになってしまうので、補完する対応を行った方が良いです。

欠損値の補完についてですが、データの性質や欠損の意味を勘案して、-9999・0・平均値・中央値・最頻値などを代入するコードを使いましょう。

目安ですが、以下で加工するのが良さそうです。

  • 欠損がすごく少ない場合は最頻値
  • 数値に意味がある場合は平均値や中央値
  • 欠損していること自体に意味がある場合は-9999

特に、欠損していることに意味があり、欠損値を「欠損」というカテゴリーで扱いたい場合は-9999などを設定するテクニックは効果的です。

LightGBMに悪影響を与えない範囲でランダムフォレストなどの欠損値を学習できないモデルを使えるようになるため、後の工程が楽です。

※LightGBMで欠損値に単純に0を入れたりすると、関係性を読み取られるようになってしまうことがあり、特徴量によっては結構精度が下がったりします。

異常値の修正

また、異常値の処理についてですが、各データを丹念に見ていると、明らかな誤入力が含まれる場合があります。
これも、欠損値と同様に、あるべき姿を想像して修正していくことが望ましいです。

尚、誤入力ではないものの、完全な外れ値がある場合、「一定以上の数値はXXにする」といったルーリングで単純化したほうが、適切に学習される場合があるようです。

新特徴量の作成(影響:大)

次に、新特徴量の作成です。創意工夫の余地が大きく、差が付く一番のポイントとなります。

データ次第ではありますが、数値変数と数値変数の四則演算、カテゴリカル変数とカテゴリカル変数の組み合わせなど、関係性を強調して学習させたい特徴量を組み合わせると、良い方向に作用しやすいです。

また、データの中の特定の範囲がキーになる場合、取り出して特徴量とするのもアリです。
ただし、色々試してみた範囲だと、LightGBMの性能が良すぎて、特定の数値範囲の特徴化はあんまり効果がある感じはないですね。
やはり、変数と変数の組み合わせを強調させるのが重要な感触です。

新特徴量の作成で悩ましい点として、特徴量Aと特徴量Bの組み合わせである特徴量ABを作成した場合に、元の特徴量を残すかどうか、という観点があります。
ただ、他の特徴量との個別の関係性が案外精度強化に影響していたりはするので、基本的には削除しない方が精度が出ることが多いです。

特徴量の選択(影響:小)

特徴量を作成したら、その中から有望な特徴量を選んでいくことになります。
特徴量の数が多すぎると、変に局所的なデータで過学習されたり、訓練で無闇に時間がかかる恐れがあるためです。

と言いつつ、LightGBMを使う場合、モデルが優秀すぎて、正直、特徴量を削除してもあまりスコアアップにつながったりはしないですし、元々動作が非常に軽いです。
全部の特徴量を入れ込んだVerでも十分な精度が出るので、特徴量選択については、もう最後の最後に考えればいいと思います。

尚、色々試しましたが、削除して精度向上に如実に寄与するデータはあんまりないような印象です。
上記の通り、使う使わないはモデルが正しく判断できている場合は多いため、基本的には横ばいか精度低下しますね。

モデルの訓練

モデルのハイパーパラメータ調整(影響:大)

モデルのハイパーパラメータについては、基本的に深度を深くすると如実に精度向上につながる一方、過学習する点を超えると精度が下がっていく感じです。

グリッドサーチなど、ベストなハイパーパラメータを探索するコードを使用して、適切なハイパーパラメータを探索するのが正攻法です。

ただし、グリッドサーチなどでベストな設定を探索するのには結構時間がかかりますし、何がどう影響するのかがわかるようになるので、最初は手でいくつかのパターンを試してみるのも悪くはありません。

感覚的には、LightGBM・XGBoost・CatBoostはハイパーパラメータを調整しないと精度があまり出ません。

序盤で同レベルのスキルと思われる参加者のスコアとあまりにも乖離があるようであれば、ハイパーパラメータ要因な気がします。

(ランダムフォレストはチューンしなくてもそこそこの精度で予測してくれるような印象があります)

クロスバリデーションの実施(影響:小)

トレーニングデータの一部をバリデーションデータにするホールドアウト検証でモデルを訓練するのが一番楽です。

ただし、できるならトレーニングデータをすべて使った方が望ましいため、クロスバリデーションでもれなくトレーニングデータを使うようにするべきです。

クロスバリデーションのコードはホールドアウト検証と比較するとコードが長くなるのとChatGPTから適切なコードを吐き出してもらうのが難しいという作業上の問題はあるのですが、思ったよりも精度向上につながるため、他でやることがなくなったらホールドアウト検証から変更すると良さそうです。

アンサンブル学習の実施(影響:大)

基本的に、モデル単体よりも、複数モデルの予測値を合わせて予想させた方が精度としては高い精度が出ます。

単純なアンサンブルの方法としては、多数決方式があります。
単純に各モデルが予測した予測値をもとに、多数決で結論を決めるモデルですが、コードとやっている内容が理解しやすいので、まずやってみるのには良い手法です。

尚、アンサンブルする場合、同じような特徴量から予測するモデルを複数使っても仕方がない部分があるため、組み合わせても効力が低いケースがそこそこあります。
個人的な体感としては、LightGBMとランダムフォレストの組み合わせがかみ合わせが良い印象があったので、それらをベースにほかのモデルを組み合わせるのが良いのかもしれません。

尚、モデルの誤りの傾向によってですが、多数決の閾値や反映割合をいじることで、全体的な誤りの傾向を調整することが可能です。
邪道な気もしますが、思ったよりも変わるケースがあるので、他でやることがなくなったら、色々なパターンを試してみるのもアリですね。

その他

ターゲットエンコーディングとか、色々と精度向上の手段はまだまだありそうなのですが、一旦、複雑度が低いこの辺で。

より上位を目指す場合はともかく、記載したような対応を一通り行うことで、そこそこの精度までは行くんじゃないかなーという印象です。

Kaggle本を読んだら結構色々参考になったので、まあKaggle本を片手にいろいろ試してみて、取り組んでいる予測に合う手法を探すのがよいのではないでしょうか。

あと、Kaggleスタートブックも結構よかったですね。
意外と攻略本から発想が得られたりするので、スコアが行き詰まったら攻略本を読み直してみると新たな発想が生まれるかもしれません。