KaggleのHouse Pricesで回帰分析(モデル作成編)

今回も、kaggleの入門者向けチュートリアルコンペ「住宅価格予測」を解いてみます。

House Prices: Advanced Regression Techniques

各種指標を用いて住宅の価格を予測する分析問題です。

データ分析のプロセスとして、CRISP-DM(CRoss Industry Standard Process for Data Mining)というものがあります。

モデリングより前のステップである「ビジネスの理解」「データの理解(Exploratory Data Analysis)」「データの準備(Feature Engineering)」のステップが大半を占めます。

今回はタイタニックに続いて二度目の「モデル作成(Model Building)」です。

学習モデルの生成

選ぶべきモデルを確認したい場合、下記のSklearnのチートシートを使うのが早いです。

1.サンプル数は50以上か?→Yes
2.カテゴリ予測?→No
3.数値予測?→Yes
4.サンプル数は100000以下か?→Yes
5.説明変数の一部だけの特徴量が重要か?→Yes

この結果より、Regression(回帰)の中でもLasso回帰かElasticNetを使うのが良さそうです。

また、Kaggleで人気のXGBoost、LightGBM、CatBoostを適用して結果を確認します。

結果は次のようになります。

もっとも精度が高いのは「LightGBM」でした。

モデルにテストデータを投入し予測

この学習モデルに対してテストデータの予測値を求めます。

ターゲットをYeo-Johnson変換にしていたので、inverse_transformを使って元のスケールに戻す事を忘れないで下さい。

最後に出力されたcsvファイルをKaggleにサブミットすればスコア表示されます。

「0.18152」でした。

スコアは対数平均二乗誤差(RMSLE)であり、この値が0に近ければちかほど、良いモデルが作れたということになります。

[応用] グリッドサーチ (Grid Search)とは?

グリッドサーチとはモデルの精度を向上させるために用いられる手法で、全てのパラメータの組み合わせを試してみる方法のことです。

イメージとしてはループさせてパラメータの組み合わせを全て試し、最も評価精度の良いものを探索します。

scikit-learnにはハイパーパラメータ探索用の「GridSearchCV」が用意されています。

次のような結果が出力されます。

私のPCでは、4分程度の計算時間が必要でした。

[応用] アンサンブル学習(Ensemble Learning)とは?

前回も「アンサンブル学習」って何?で簡単に記載しましたが、より詳細です。

機械学習において、単一の学習器をそのまま使うのではなく、複数の学習器を組み合わせることで、予測エラーを小さくする手法をアンサンブル学習(Ensemble Learning)といいます。

Kaggleなどのデータ分析コンペではよく利用されており、事実、多くのコンペティションの上位にランクインする方々はアンサンブル学習を活用しています。

※XGboostやLightGBMもアンサンブル学習の1つであるブースティングを用いています。

今回はXGBoostを2つ、LightGBMを1つの計3つを組み合わせました。

組み合わせ方は、基本はXGBoost1の結果に従うものの、たまにXGBoost1が、汎化性能が高いXGBoost2やLightGBMの結果と大きく外れる時は、LightGBMの結果を用いる、ということをしました。

のようなイメージです。

前提となる知識

まずはアンサンブル学習を理解する上で前提となる知識、「バイアス(Bias)」「バリアンス(Variance)」の2つを説明します。

バイアスが大きいとはモデルの予測がかなり外れていることを表し、バイアスが小さいということはモデルがかなりの精度で予測できていることを表します。

バイアス(Bias)(偏り)

真の値(学習データ)と平均予測値のずれの大きさを意味します。

バイアスは「偏り」という意味であり、機械学習の概念的に覚える時は

「真の値とモデルの予測値の偏りがどのくらいあるか」

という風に覚えます。

より具体的には、バイアスは実際値と予測値との誤差の平均のことです。

値が小さいほど予測値と真の値の誤差が小さいということになります。

バリアンス(Variance)(分散)

バリアンスは予測値がどれだけ散らばっているかを示す度合いのことで、値が小さいほど予測値の散らばりが小さいということになります。

バリアンスが大きいと学習データごとに予測値が大きく変化することを表し、バリアンスが小さいと学習データにかかわらず予測値がほぼ一定になるということを表します。

バリアンスは「分散」という意味なので、「学習データに応じた予測値の分散の大きさ」を意味します。

3つの手法

アンサンブル(混合学習手法の)には次の3つがあります。

バギング(Bagging)

アンサンブルに用いる個々の弱学習機の学習において、すべての学習データを使うのではなく、その一部を抽出したデータで別個に学習する手法です。

それぞれの弱学習機が異なるデータセットで学習するために汎化性能が向上し、また学習の計算を並列処理できるという利点もあります。

バギングを利用する代表的なアルゴリズムとして「ランダムフォレスト」があります。

ブースティング(boosting)

最初にベースラインとなる弱学習器を生成し、これを改善するような学習を行って新たな学習器を生成していく手法です。

例えば、前回生成した弱学習器が誤って予測したデータに重点を置き、その予測を改善するように次の学習が行われます。

学習は逐次的に行われるため、バギングのような並列処理はできません。

スタッキング(stacking)

モデルを多段に積み上げていく手法です。

機械学習モデルの精度を向上させる手法の1つで、モデルを積み重ねる(Stackする)ことで精度を高めます。

1段目で様々な弱学習器の学習を行い、2段目では1段目の各学習器の出力(予測値)を使って、最終的な予測を行う学習器を生成します。

言い換えれば、2段目では1段目のどの弱学習器をどう組み合わせれば最も性能が上がるかを学習します。

Kaggleでは段数を増やした複雑なスタッキングモデルが用いられることもあり、計算量が非常に大きくなりモデルが複雑で扱いにくいというデメリットもあります。

[参考サイト] Kaggleの練習問題(Regression)を解いてKagglerになる

まとめ

「0.18152」という結果は「Top 79%」程度であり低いです。

Top 50%に入るには「0.13176」以下の誤差にする必要があり、難易度は高めです。

「LightGBM使って誤差0.13となった」などと書かれているサイトを見ていると、私の場合は前処理が不十分だと思われます。

関連書籍を立ち読みしても、日記上で記載しているノウハウとほぼ一緒だと思うので、後は経験を増やして精度を上げていくしかないと思ってます。

今回用いたコード

タイトルとURLをコピーしました