KaggleのEDA・データ準備のチュートリアル

KaggleのEDA・データ準備のチュートリアル

 機械学習エンジニアとしての力をつけるため、Kaggleを始めようと決意しました。
といっても、初心者がいきなりコンペへ参加するのもハードルが高いので、Kernelを読む勉強からスタートです。

Kernelはwebブラウザ上でコーディングやMarkdownで文章を書くことのできる環境です。

最初に、チュートリアルとして非常に有名な Titanic: Machine Learning from Disaster
「タイタニックの生存を予測するコンペ」を一通りやって雰囲気をつかみました。

ここでは、House Prices: Advanced Regression Techniques 「不動産の価格を予測する」コンペの人気のあるKernel COMPREHENSIVE DATA EXPLORATION WITH PYTHONについて学習して、簡単にまとめた内容を記録しました。

なお、すでに以下記事で上記Kernelについてわかりやすく解説してますね。「データ前処理」- Kaggle人気チュートリアル

House Prices: Advanced Regression Techniquesの概要

アメリカのアイオワ州エイムズの不動産価格について予測するコンペです。 各家について、全部で79の説明変数があります。

例を挙げると

  • TotalBsmtSF: Total square feet of basement area(敷地全体の広さ)
  • Kitchen: Number of kitchens(キッチンの数)(特徴量名はKitchenAbvGrであることに注意)
  • YearRemodAdd: Remodel date(リモデルした年)
  • HeatingQC: Heating quality and condition(暖房の質、状態)

これらデータに対して、特徴エンジニアリングを行い、回帰モデルをつくって高い精度で不動産価格を予測することを 目指します。

EDA・データ準備

COMPREHENSIVE DATA EXPLORATION WITH PYTHON について、流れを以下にざっくりまとめました。

  1. 問題を理解する:
    それぞれの変数をみて、問題における意味や重要性を理解する。
    変数が数値なのか、カテゴリーなのか、建物・空間・ロケーションなど何を表しているか、それらが本問題のターゲットである「SalePrice」にどう関係するかを調査・検討する。

  2. 単変数を調査する:
    「SalePrice」について詳しく調査する。
    「SalePrice」の平均値や最大値や、ヒストグラムの歪度・尖度を確認する。散布図などを使って他の変数と線形・指数関数など、どのような関係性があるかを調べる。
    本Kernelでは、「GrLivArea」, 「TotalBsmtSF」が「SalePrice」と正の線形な関係があることを確認。
    また、カテゴリ変数の「OverallQual」の値が大きいほど「SalePrice」も大きくなることをBox Plotで確認。

  3. 多変量の調査をする:
    各変数が独立なのか、他の変数と関係を持つのか調査する。
    相関行列(ヒートマップ)を使って、「SalePrice」と関係性の強い変数を調査する。
    本Kernelでは、Top10の変数を選出して、散布図を使ってさらに詳しく「SalePrice」との関係を調査している。
    また、「SalePrice」以外の変数間での相関性を調べる。例えば、「GarageCars」と「GarageArea」は相関が高い。
    このように相関の高い変数を「SalePrice」の説明変数に含めると、multicollinearity(多重共線性)により予測の信頼性が落ちる。

  4. 欠損値を処理する:
    欠損データの処理をする。データに15%以上の欠損がある場合は、変数を除外する。
    「PoolQC」,「MiscFeature」,「Alley」など。欠損値の少ないデータ「Electrical」などは、変数は除外せず、欠損のある不動産のデータを除去する。

  5. 外れ値を処理する:
    データを正規化して閾値値を決めて外れ値を除去する。「SalePrice」単体を平均0、分散1と正規化してみると、高い不動産の価格が平均から大きく外れていることが確認できる。
    「SalePrice」と他変数「GrLivArea」,「TotalBsmtSF」の散布図を確認する。
    「GrLivArea」と「SalePrice」は正比例の関係にあるが、明らかに外れている2点(不動産)を除去。「TotalBsmtSF」については大きく相関から外れている点はないためそのまま残しておく。

  6. 正規性の確認:
    統計手法は正規分布を仮定する場合も多いため事前に確認する。正規確率プロットを用いて直線に乗れば正規分布といえる。分布が正の歪度を持つ場合は変数の対数を取ることで正規分布に従うことが多い。
    「SalePrice」,「GrLivArea」は対数を取ることで、ほぼ正規分布となった。
    「TotalBsmtSF」も正の歪度を持つが、0の値を含んでいるため対数が取れない。
    そこで、新しくカテゴリ変数をつくり、0に対しては0を0以上のエリアであれば1を持たせる(2値)。
    そして、「TotalBsmtSF」の0以外の値に対して対数をとる。
    本Kernelの著者は、この手法について「high risk engineering」と記載しており、正しいやり方かどうかは確信はできないがアプローチとしては正しく思えると言っている。

  7. 等分散性の確認:
    予測変数の「SalePrice」の分散に対して、他の変数も同様の分散であれば等分散性があるといえる。
    等分散性があれば、各独立変数の誤差成分が同様とみなせるため、予測モデルの精度がよくなる?確認は散布図で「SalvePrice」と「GrLivArea」、「SalvePrice」と「TotalBsmtSF」をみる。結果、対数変換前は散布図が円錐状だったのが、同様の分散をもつプロットになっていることを確認。

  8. 線形性の確認:
    通常、散布図などをみれば確認できる。線形でなければ何らかの変換をすればよい。

  9. 相関誤差の確認:
    例えば、ある変数が正の誤差を持つ場合、他の変数がこれに相関して負の誤差を持つような場合がある。
    要するに、独立変数ではなく互いに依存する変数となっている。時間依存性のある時系列データに対してよく現れる現象らしい。
    一般的な対策としては、これらの効果を説明する新しい変数を加えること。本問題では特に気にする必要はないため、分析はしていない。

  10. カテゴリ変数の処理:
    カテゴリ変数(文字列データなど)を数値データに変換。pandas.get_dummies()を利用すれば簡単にできる。

以上でEDA・データ準備のチュートリアルは終わりです。あとは、回帰モデルをつくって予測すればいいですね。なお、Kernelのコメント欄での議論を見るとより勉強になります。例えば、0を含む対数変換については、numpy.log1p()(1を足して対数変換)を利用すればいいよ、などのコメントがあります。