Kaggle【11/25】

今日やったこと

  • Categorical Feature Encoding Challenge
  • カテゴリ変数の取り扱い
  • 特徴量スケーリング
Categorical Feature EncodingChallenge

以前まで取り組んでいた「HousePrice」コンペのモデル精度を今よりあげるには、特徴量の取捨選択・アンサンブル学習(スタッキング)などに手を出さないといけない。「お前にはまだ早い!」と聞こえた気がしたので、とりあえず今日は別のコンペに参加することにしました。

このコンペは0,1の確率予測で、データの中身は、動物の名前・kaggleにおけるランク名・国名・図形などなど...。データの種類はバラバラで詳しいデータの説明もないので、HousePriceのようにカラム名から傾向を推測するのは難しいように感じました。Discussionの場でもデータについての話題がいくつか挙がっていました。データの説明に書かれているように、データの取り扱いを学ぶためコンペのようです。

カテゴリ変数の取り扱い

 とりあえずデータには必要最低限の修正を加えるだけにして、学習モデルに突っ込もうと考えました。どちらにも欠損値はないので、カテゴリ変数(文字型の変数)を数値に変形させる。そこで浮かびあがる「One-Hot-EncoderとLabelEncoderのどちらを使用すべきか問題」まさに、このコンペの目的であるデータのエンコードが確率予測に寄与する重要な作業だと感じました。調べてみると、エンコード手法の違いによって、いくつかの問題があるようです。

まず1つ目は、確率予測に使うモデルによって予測結果に影響することがあるようです。時系列のようなそれぞれ独立したカテゴリ変数にLabelEncoderを用いて、割り振ってしまうと、先頭の変数が最も低く後ろにいくにつれ値が大きくなってしまうため、独立したカテゴリ変数なのに値に意味が与えられてしまうようです。ランダムフォレストのような決定木モデルであれば、分岐していくだけなので値の大小の影響は小さいですが、ニューラルネットのような勾配効果法など最適化アルゴリズムを用いるようなモデルだと値の大小の影響を受けてしまいます。

2つ目は、カテゴリ変数の種類が多すぎるカテゴリ変数にOne-Hot-Encodingを用いると、メモリが足りなくなってしまいます。数百数千、また数万もあるような変数に対して、むやみにこの処理をすればメモリが足りなくなるのは自明の理だと思います。

このようにカテゴリ変数をモデルに食べさせるときに、何も考えずにエンコードすればいいという訳ではないようです。

特徴量スケーリング

どのエンコード方法を用いるかを調べ、とりあえず種類の多すぎる特徴量にはLabelEncodingを、それ以外にはOne-Hot-Encodingを適用しました。しかし、LabelEncodingした変数に5桁を超えるようなものがあったため、等価値であろう特徴量が、0と10000のままなのは我慢できませんでした。

そこで見つけた手法が正規化と標準化です。G検定で勉強した用語でした(汗)

正規化とは、どんなに大きな数値であっても0〜1の範囲に納めることができます。つまりLabelEncoderで大きくなりすぎた特徴量も、情報を保ったまま尺度を0〜1にすることができる!正規化の欠点としてこのコンペではあまり関係ありませんが、特徴量に外れ値があると外れ値も含めて処理してしまいます。

標準化は特徴量を平均を0分散を1にします。特徴量などに外れ値がある場合でも影響を受けないので、元々が数値変数である特徴量にスケーリングを行うときは標準化の方が良さそうです。

 

感想

今回参加したコンペの目的通り、カテゴリ変数に対するエンコード手法を学ぶにはうってつけのコンペでした。特徴量スケーリングもモデルや特徴量の性質にに合わせて適切に行えばモデル精度に寄与する重要な手法だと知ることができました。知らないことばかりです...笑 でも、今日はかなり成長できたと思います!

明日は、Jetson nanoで骨格検出でいろいろやってみようと思います!(コンペの続きもしたいけど!)