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

kaggle:House Price チュートリアル(住宅価格の予測)

投稿日:

概要説明

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

本記事では、kaggleのコンペティションマスターのSerigneさんのスクリプトを参考にしています。
https://www.kaggle.com/serigne/stacked-regressions-top-4-on-leaderboard

同様に3件別記事にて紹介する予定です。(データ:House Price)

このカーネルは、kaggleで上位をとるスクリプトと比較して、シンプルにエッセンスだけを抽出してくれています。

参考になるテクニックとしては、

  • 欠損値の補完方法
  • 意味のない数値変数のカテゴリ変数化
  • 順序の意味が含まれるカテゴリ変数の数値化
  • ボックスコックス変換:回帰問題のとき目的変数のばらつきが正規分布していないと精度が落ちてしまうことが多いため、歪んだ分布を正規分布に近づける補正)
  • スタッキング(アンサンブル学習):複数の学習機の結果を統合して予測を行う手法
    ※ 線形モデルに関してはを外れ値に対して堅牢にすることが重要

作業の流れ

  1. 前処理
    1. 外れ値の削除
    2. 目的変数の補正
  2. 特徴量エンジニアリング
    1. 欠損値の補完
    2. 数値変数のカテゴリカル変数化
    3. カテゴリカル変数の数値変数化
    4. 特徴量の追加
    5. 特徴量の歪み補正(ボックスコックス変換)
  3. モデリング
    1. クロスバリデーションの定義
    2. ベースモデル作成
    3. スタッキングモデル作成
    4. 結果の評価

ライブラリインポート

データの読み込み

kaggleでは、trainデータで学習し、testデータについて予測を行い、その予測の精度がどれだけ高いかを競います。

データについては、こちらからダウンロードしてください。

IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilitiesLotConfigLandSlopeNeighborhoodCondition1Condition2BldgTypeHouseStyleOverallQualOverallCondYearBuiltYearRemodAddRoofStyleRoofMatlExterior1stExterior2ndMasVnrTypeMasVnrAreaExterQualExterCondFoundationBsmtQualBsmtCondBsmtExposureBsmtFinType1BsmtFinSF1BsmtFinType2BsmtFinSF2BsmtUnfSFTotalBsmtSFHeatingCentralAirElectrical1stFlrSF2ndFlrSFLowQualFinSFGrLivAreaBsmtFullBathBsmtHalfBathFullBathHalfBathBedroomAbvGrKitchenAbvGrKitchenQualTotRmsAbvGrdFunctionalFireplacesFireplaceQuGarageTypeGarageYrBltGarageFinishGarageCarsGarageAreaGarageQualGarageCondPavedDriveWoodDeckSFOpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.0008450PaveNaNRegLvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520032003GableCompShgVinylSdVinylSdBrkFace196.000GdTAPConcGdTANoGLQ706Unf0150856GasAYSBrkr85685401710102131Gd8Typ0NaNAttchd2003.000RFn2548TATAY0610000NaNNaNNaN022008WDNormal208500
1220RL80.0009600PaveNaNRegLvlAllPubFR2GtlVeenkerFeedrNorm1Fam1Story6819761976GableCompShgMetalSdMetalSdNone0.000TATACBlockGdTAGdALQ978Unf02841262GasAYSBrkr1262001262012031TA6Typ1TAAttchd1976.000RFn2460TATAY29800000NaNNaNNaN052007WDNormal181500
2360RL68.00011250PaveNaNIR1LvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520012002GableCompShgVinylSdVinylSdBrkFace162.000GdTAPConcGdTAMnGLQ486Unf0434920GasAYSBrkr92086601786102131Gd6Typ1TAAttchd2001.000RFn2608TATAY0420000NaNNaNNaN092008WDNormal223500
3470RL60.0009550PaveNaNIR1LvlAllPubCornerGtlCrawforNormNorm1Fam2Story7519151970GableCompShgWd SdngWd ShngNone0.000TATABrkTilTAGdNoALQ216Unf0540756GasAYSBrkr96175601717101031Gd7Typ1GdDetchd1998.000Unf3642TATAY035272000NaNNaNNaN022006WDAbnorml140000
4560RL84.00014260PaveNaNIR1LvlAllPubFR2GtlNoRidgeNormNorm1Fam2Story8520002000GableCompShgVinylSdVinylSdBrkFace350.000GdTAPConcGdTAAvGLQ655Unf04901145GasAYSBrkr1145105302198102141Gd9Typ1TAAttchd2000.000RFn3836TATAY192840000NaNNaNNaN0122008WDNormal250000

データサイズの確認と不要なデータ(Id)の除外

The train data size before dropping Id feature is : (1460, 81)

The test data size before dropping Id feature is : (1459, 80)

The train data size after dropping Id feature is : (1460, 80)

The test data size after dropping Id feature is : (1459, 79)

前処理

外れ値

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

右下の2点は、GrLivAreaの大きさに対して、SalePriceが他のデータと比較して著しく低い。この異常な2つのデータを除外する。

注意 顕著に大きく値が異なっていたので除外したが、外れ値は必ずしも除外して良いわけではない。

また、このトレーニングデータには、まだ外れ値が含まれている。これらについては除外しない。理由は、テストデータにも同様のデータが含まれていた場合、モデルの精度に影響があるため。

その代わり、外れ値に対してロバストなモデルを作ることを目指す。

目的変数

SalePriceが目的変数なので、まずはこの変数について分析する。

mu = 180932.92 and sigma = 79467.79

分布をみると、右に歪んでいることがわかる。線形モデルでは正規分布になっていることが望ましい。よって、対数変換により正規分布に近づける。

2つ目のグラフはQ-Qプロットという正規性可視化する方法。 詳しく知りたい人は、こちらを参照。

mu = 12.02 and sigma = 0.40

確かに、補正できている。

特徴量エンジニアリング

編集するにはダブルクリックするか Enter キーを押してください

まず、trainデータとtestデータを結合させる。

all_data size is : (2917, 79)

欠損値

Missing Ratio
PoolQC99.691
MiscFeature96.400
Alley93.212
Fence80.425
FireplaceQu48.680
LotFrontage16.661
GarageQual5.451
GarageCond5.451
GarageFinish5.451
GarageYrBlt5.451
GarageType5.382
BsmtExposure2.811
BsmtCond2.811
BsmtQual2.777
BsmtFinType22.743
BsmtFinType12.708
MasVnrType0.823
MasVnrArea0.788
MSZoning0.137
BsmtFullBath0.069

データ相関

欠損値の補完

項目ごとに 欠損の意味や近似する方法、欠損していない値と整合をとることを考慮しながら、欠損値を埋めていく

PoolQC

データの説明(kaggle参照)によると、NAはプールなしを意味する。よって、Noneで補完する

MiscFeature

データの説明によると、NAは「その他の機能はない」を意味する。よって、Noneで補完する。

Alley, Fence, FireplaceQu, GarageType, GarageFinish, GarageQual, GarageCond

同様にして、Alley, Fence, FireplaceQu, GarageType, GarageFinish, GarageQual, GarageCondの欠損値もNoneで補完する

家から各通りまでの直線距離は、近隣の家と同様のエリアを持っている可能性が高いため、近隣のLotFrontageの中央値で欠損値を補完する。

groupby transformの説明

Utilities

Utilitiesの中身は”NoSeWa”1つとNA2つで構成されており、”NoSeWa”は学習データにしか存在しない。よって、このカラムはテストデータの予測には役に立たないので、カラムごと削除する。

Functional

データの説明によると、NAは一般的であることを示している。よって、欠損値は文字列”Typ”で補完する。

Electrical

欠損値は1つだけ。最頻値(SBrkr)で補完する。

KitchenQual

欠損値は1つだけ。最頻値(TA)で補完する。

Exterior1st, Exterior2nd

いずれも欠損値は1つだけ。最頻値で補完する。

SaleType

欠損値は1つだけ。最頻値で補完する。

MSSubClass

欠損値は建物クラスなしに近い。よって、欠損値をNoneで補完する。

全ての欠損値の処理が完了。

数値変数のカテゴリ変数化

データの型は数値でも数値の大きさに意味を持たない(1と10で比較した場合、10倍の違いがない)場合、カテゴリ変数に変換する。

機械学習においては数式上で四則演算を行うので、基本的には(例外多数あり)全ての値を比例尺度に変換するのが好ましい。

特徴量抽出の前に、まずは統計学の測定尺度についてまとめる。
測定尺度とは、データセットの中の数値を4種類に分類したもので、
それぞれの尺度で処理が異なるので注意が必要。

尺度水準 – Wikipedia

  • 名義尺度:識別のために数字を与えたもの。例えばID、電話番号など。
  • 順序尺度:順序を表す数字。例えばランキング、地震の震度、成績表などが。数字の大小に意味はありますが、差や比は意味がない。
  • 間隔尺度:間隔に意味のある数値。「値の比」に意味はないが、「値の間隔の比」には意味がある。有名なのは℃単位の温度。例えば「夏の最高気温30℃は春の最高気温15℃より2倍大きい」と言うことに意味はないが、「夏の一日の寒暖差(最高気温と最低気温の”間隔”)6℃は、春の寒暖差12℃より2倍小さい」と言うことは可能。
  • 比例尺度:四則演算が全て使える数値。温度も絶対温度K(ケルビン)に直せば比例尺度になる。年齢、金額、期間などもこれに属す。

機械学習においては数式上で四則演算を行うので、基本的に(例外多数)全ての値を比例尺度に変換するのが好ましい。
(ただし、モデルによってはカテゴリ値も扱えます。例えば決定木ベースのXGBoostやLightGBMではカテゴリ変数を扱うオプションがある。)
従って、尺度を比例尺度に変換することが特徴量抽出の一つの目標となる。

ラベルエンコーディング

順序尺度の性質を持つと考えられるカラムをラベルエンコーディングで数値化する
(さっそく上述の方針の例外です。。。)

Shape all_data: (2917, 78)

特徴量の追加

価格を決める要素として面積はとても重要なため、住居の地下、1階,
2階の面積の総和を特徴量として追加する。

特徴量の歪み補正

特徴量の歪みを数値化して、補正の必要な特徴量を見つける。数値化には歪度を使う。

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

Skew
MiscVal21.940
PoolArea17.689
LotArea13.109
LowQualFinSF12.085
3SsnPorch11.372
LandSlope4.973
KitchenAbvGr4.301
BsmtFinSF24.145
EnclosedPorch4.002
ScreenPorch3.945

大きく歪んだ特徴量は、ボックスコックス変換を使って補正する。

ボックスコックスはこのページががわかりやすい。

歪度0.75以上の特徴量に対して補正をかける。 ※lamを自動で決める方法もあるが、ここでは定数0.15を利用しています。

最後に、カテゴリカル変数をダミー変数に変換。

(2917, 220)

trainデータとtestデータに戻す。

モデリング

クロスバリデーションの定義

sklearnのcross_val_scoreを使ってクロスバリデーションを行う。 複数のモデルで活用するため、関数化しておく。

ベースモデル

各種モデルのハイパーパラメータについては記述はないがランダムサーチなどで最適化していると思われる。

LASSO回帰 :

このモデルは外れ値に弱いため、よりロバスト(堅牢)にする必要がある。 ここでは、パイプラインでsklearnのRobustscalerを活用する。

※ LASS回帰:不要と判断される特徴量を無視する事ができる

※ ロバスト:ここでは、外れ値の影響を小さくし安定化させること

※ Robustscaler:中央値が0、四分位範囲が1になるように移動・スケール変換する

代替テキスト

※ パイプライン:一連の処理をつなげシンプルに記述することができる

Elastic Net Regression :

LASSO回帰同様外れ値に弱いため、同様の処理を加える。

Kernel Ridge Regression :二次曲線でRidge回帰する

Ridge回帰:特徴量の影響が大きくなりすぎないように抑える特徴がある。

Gradient Boosting Regression :

外れ値にロバストにするため、loss=’huber’を使う。

XGBoost :

LightGBM :

ベースモデルのスコア

Lasso score: 0.1115 (0.0074)

ElasticNet score: 0.1116 (0.0074)

Kernel Ridge score: 0.1153 (0.0075)

Gradient Boosting score: 0.1177 (0.0080)

Xgboost score: 0.1168 (0.0058)

LGBM score: 0.1167 (0.0072)

stackingモデル

Averaged base models class

各学習機の予測結果結果の平均を取るための、クラスの作成。

Averaged base modelsのスコア

Averaged base models score: 0.1091 (0.0075)

単純なスタッキングモデルにも関わらず、単一モデルのベストスコアよりも改善している。

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

執筆者:


comment

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

関連記事

no image

python/matplotlib/subplot(グラフの複数表示)

サブプロットを使うことで複数のグラフを並べて表示する事ができる。 Contents1 データ取得2 メソッド3 手順 データ取得 必要なモジュールのインポート [crayon-5da9b7df23d6 …

no image

pythonのpandasを使ったデータ処理2

pythonのpandasを使ったデータ処理1からの続き。 データは有名なタイタニックデータを使います。 データはこちらkaggleコンペページのリンクです。 左上の「data」からデータをダウンロー …

no image

python/pandas/dataframe/重複関連

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

no image

タイタニック生存者予測~ランダムフォレスト~

有名なタイタニックのデータを使って、RandamForestを使って生存者を予測します。 Contents0.1 前処理について0.2 モデル選定について 0.2.1 ロジスティック回帰0.2.2 S …

no image

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

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