コンペチュートリアル データハンドリング 前処理 可視化 機械学習

kaggle:House Price チュートリアル(LASSO回帰とRIDGE回帰)

投稿日:8月 17, 2019 更新日:

概要説明

本記事は、機械学習を始めて基本的な操作を覚え、次に精度を上げるために何をすればよいのか?という悩みを持つ方たちのために、機械学習のコンペサイトkaggleの練習問題をベースに事例を紹介していきたいと思います。

本記事では、kaggleのコンペティションマスターのAlexandru Papiuさんのスクリプトを参考にしています。
https://www.kaggle.com/apapiu/regularized-linear-models

このカーネルは、kaggle上位をとるxgboostなど比較して、シンプルな正則化回帰(LOSS、RIDGE回帰など)により精度を上げるためのテクニックを紹介します。
簡単な特徴量エンジニアリングだけで、劇的な改善が確認できました。ポイントは、対数変換による歪みの補正です。

作業の流れ

  1. 特徴量エンジニアリング
    • 対数変換
    • ダミー変数化
    • 欠損値の処理
  2. モデリング
    • RIDGE回帰
    • LASSO回帰
    • 回帰係数の確認
    • 残差の確認

ライブラリインポート

データの読み込み

kaggleでは、trainデータで学習し、testデータについて予測を行い、その予測の精度がどれだけ高いかを競います。
データについては、こちらからダウンロードしてください。

IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilitiesLotConfigLandSlopeNeighborhoodCondition1Condition2BldgTypeHouseStyleOverallQualOverallCondYearBuiltYearRemodAddRoofStyleRoofMatlExterior1stExterior2ndMasVnrTypeMasVnrAreaExterQualExterCondFoundationBsmtQualBsmtCondBsmtExposureBsmtFinType1BsmtFinSF1BsmtFinType2BsmtFinSF2BsmtUnfSFTotalBsmtSFHeatingCentralAirElectrical1stFlrSF2ndFlrSFLowQualFinSFGrLivAreaBsmtFullBathBsmtHalfBathFullBathHalfBathBedroomAbvGrKitchenAbvGrKitchenQualTotRmsAbvGrdFunctionalFireplacesFireplaceQuGarageTypeGarageYrBltGarageFinishGarageCarsGarageAreaGarageQualGarageCondPavedDriveWoodDeckSFOpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.08450PaveNaNRegLvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520032003GableCompShgVinylSdVinylSdBrkFace196.0GdTAPConcGdTANoGLQ706Unf0150856GasAYSBrkr85685401710102131Gd8Typ0NaNAttchd2003.0RFn2548TATAY0610000NaNNaNNaN022008WDNormal208500
1220RL80.09600PaveNaNRegLvlAllPubFR2GtlVeenkerFeedrNorm1Fam1Story6819761976GableCompShgMetalSdMetalSdNone0.0TATACBlockGdTAGdALQ978Unf02841262GasAYSBrkr1262001262012031TA6Typ1TAAttchd1976.0RFn2460TATAY29800000NaNNaNNaN052007WDNormal181500
2360RL68.011250PaveNaNIR1LvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520012002GableCompShgVinylSdVinylSdBrkFace162.0GdTAPConcGdTAMnGLQ486Unf0434920GasAYSBrkr92086601786102131Gd6Typ1TAAttchd2001.0RFn2608TATAY0420000NaNNaNNaN092008WDNormal223500
3470RL60.09550PaveNaNIR1LvlAllPubCornerGtlCrawforNormNorm1Fam2Story7519151970GableCompShgWd SdngWd ShngNone0.0TATABrkTilTAGdNoALQ216Unf0540756GasAYSBrkr96175601717101031Gd7Typ1GdDetchd1998.0Unf3642TATAY035272000NaNNaNNaN022006WDAbnorml140000
4560RL84.014260PaveNaNIR1LvlAllPubFR2GtlNoRidgeNormNorm1Fam2Story8520002000GableCompShgVinylSdVinylSdBrkFace350.0GdTAPConcGdTAAvGLQ655Unf04901145GasAYSBrkr1145105302198102141Gd9Typ1TAAttchd2000.0RFn3836TATAY192840000NaNNaNNaN0122008WDNormal250000

前処理

この前処理では以下の処理をおこないます。

  • 歪んだ数値変数については、対数変換により正規分布に近づける
  • カテゴリカエル変数については、ダミー変数に変換する
  • 数値の欠損値については、平均値で補正する

対数変換

まずは、可視化して全体を眺める。

生のSalePriceは左に歪んでいる。これを対数変換(log(price + 1))すると確かに、正規分布に近づいている。よって、対数変換 した値に置き換える。

歪んでいる数値特徴量に対して同様の処理を行う。
具体的には、歪度を利用して歪んだ特徴量を見つけ、対数変換を行う。歪みの閾値は歪度0.75とした。

歪度(https://bellcurve.jp/statistics/course/17950.html) : 分布の非対称性を表す指標。値が正のとき分布が右に歪んでいる。逆に負のとき左に歪んでいる。

ダミー変数化

欠損値処理

数値型の特徴量には平均値で補完

データの分割

trainデータとtestデータ二分割

モデリング

sklearnの正則化線形回帰(L1:LASSO、L2:RIDGE)を使って予測を行う。
また、クロスバリデーションとして、RMSEでモデルを評価し、最適なパラメータを選択する。

RIDGE回帰

RIDGE回帰の主なハイパーパラメータは正則化パラメータalpha。この値が高いほど、モデルへの過適合を抑止する。逆に低いほど、データへの柔軟性が低下する特徴がある。

alphaの最適値を探索するため、alphaの値を変えたモデルのリストを作成し、精度への影響を可視化する

best rmse = 0.12733734668670757

グラフはU字カーブを描き、alphaが大きいときモデルはデータの複雑性を捉えることができない。逆にalphaが小さいとき過適合により精度が落ちている。
また、alpha=10のときrmse=0.1273で予測精度が最も高いことがわかる。

LASSO回帰

次にLASSO回帰を試す。ここではRIDGEとは少し異なるアプローチ(組み込みのLASSO_CVを使用)で最適なalphaを見つける。

0.12314421090977457

LASSO回帰の方が良い結果となったため、このモデルでテストデータの予測を行う。 また、LASSO回帰の特徴として、重要度の低い特徴量の係数をゼロにすることで、特徴量の選択を行ってくれる。 テストデータの予測の前に、係数を確認してみる。

回帰係数の確認

Lasso picked 110 variables and eliminated the other 178 variables

ただし、この特徴量には多重共線性があるため、選択した特徴量が必ずしも「正しい(重要度が高い)」わけではないということに注意。 この評価のアイデアとしては、ブートストラップサンプルでLASSOを数回実行し、特徴選択がどれほど安定しているかを確認することなどがあるが、ここでは行わない。

最も重要な特徴量が何であるかを可視化する。

ポジティブな影響の最も大きな特徴量はGrLivArea。これは決定的に影響度が大きい結果となった。続いて、立地や機能に関する特徴量の影響度が高かった。
逆にネガティブな影響の高い特徴量は、おそらくカテゴリカル変数の偏りにより、あまり意味がなく、更に調査が必要。

また、ここでの結果はランダムフォレストとは異なり、モデルに実際の回帰係数のため、予測結果の大小の要因が何であったかを正確に示すことが可能。ただし、対数変換を行っているため工夫が必要。

残差の確認

残差プロットを確認しても、偏りなく問題がないように見える。

-コンペチュートリアル, データハンドリング, 前処理, 可視化, 機械学習

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

python/matplotlib/散布図(scatterplot)

2つの数値データの関係を可視化する Contents1 データ取得2 メソッド3 可視化 データ取得 必要なモジュールのインポート

デ …

no image

python lambda/list/list内包表記の使い方まとめ

pythonのlmadaとlist、list内包表記の使い方を一覧にまとめておきます。 Contents1 lambda2 listとlambdaの組み合わせ3 list内包表記 lambda 基本形 …

no image

python/pandas/dataframe/重複関連

pandasのDataFrameの取り扱いで、特に重複関連についてのまとめ データは有名なタイタニックデータを使います。 データはこちらkaggleコンペページのリンクです。 左上の「data」からデ …

no image

ハイパーパラメータの調整(分類器)

分類問題用にk-NN、SVM、ランダムフォレストの3つの手法及び各手法のハイパーパラメータを最適化するランダムサーチ、グリッドサーチのサンプルスクリプトです。 Contents1 データセット作成1. …

no image

python/pandas/DataFrame/欠損値確認

データフレーム内の値がNoneまたはNAかどうかを確認する。 ※isnullとisnaの機能は同じ。isnullはisnaの別名なのでisnaが推奨 Contents1 メソッド2 データの準備3 p …