- 内容:中古住宅価格の回帰分析
- 目標:上位2割に入るまで
- 以下の、各Versionは、notebookのバージョン(Ver1が一番古い)
- Ver5で、目標を達成したので、新しい案が出るまで一旦終了
Ver5
- パブリックスコア:0.11915
- notebookリンク
- 前回までの反省:
- 外れ値処理:
- データの関係性を考えず一律で1.5IQRの値を超える値を5%,95%tile値で置き換えてたので、Ver5では、重要な変数を調べて対応をどうするか検討し直す。
- 欠損値処理:
- 変数毎の欠損値の意味を考えず一律で補完などを行っていたので、Ver5では、変数ひとつひとつの意味を考えて補完値を検討する。
- モデリング:
- モデルを考慮した前処理を考えていなかったので、Ver5では、線形回帰モデルを使うことを前提に、前処理を進める。(変数の正規分布とか、従属変数との相関とかをきちんと調べて、線形回帰モデルがうまくフィットするように前処理する。(特に従属変数の分布が線形回帰モデルの前提 - 残差の正規性・等分散性・線形性 - を満たさないようなら、線形回帰モデルの適用は諦める。)
- 前処理:
- 方針:
- 線形回帰モデルがハマるように、従属変数や従属変数と相関の高い独立変数の分布を正規分布に近づける。(正規分布に近づけるのに無理があったら、線形回帰モデルではなく、他のモデルを検討する。)
- 外れ値も、従属変数との関係を見て削除するものを決める。
- 欠損値:
- 変数ひとつひとつの欠損値の意味を把握し、それぞれの変数にあった補完値を決めていく。
- 外れ値:
- 線形回帰モデルを使うので、従属変数との相関が強い変数を重点的に調べ、外れ値を見つけ取り除く。
- 変数変換:
- 線形回帰モデルを使いたいので、従属変数・独立変数共に正規分布か確認し、対数変換で正規分布に近づける。
- 名義変数は、Binary Encodingでカテゴリ内の要素は同じ重みにし、順序変数はOrdinal Encodingを用いて、各カテゴリ内で重み付けする。
- 線形回帰モデル利用時は、数値型変数は正規化する。
- 変数選択:
- どれも正規分布を前提にして、VarianceThresholdを用いて、分散0.01以下の変数を除外する。(前回まで、変数毎のスケールを揃えることを忘れていたので、VarianceThresholdをかける前に、min-maxでスケールを揃える。)
- モデリング:
- 線形回帰モデルは、Ridge, Lasso, ElasticNet, SVRを使う。
- 線形回帰モデル利用時は、スケーリング時にデータリークが起きないように、正規化とモデリング工程をPipelineで繋げる。
- 複数モデルの予測結果を組み合わせる手法を知ったので、線形回帰モデルで一番汎化性能が良いモデルと、分類木モデルで一番汎化性能が良いモデルの予測結果の平均をとって提出してみる。
- 試すモデル。
- 線形回帰モデル:Ridge, Lasso, ElasticNet, SVR
- 分類木1:Random Forest, Gradient Boosting
- 分類木2:lightGBM, XGBoost
- スタックモデル:上記のなかで最も汎化性能の高かったモデル2つの予測値の平均を利用
- GridSearchでパラメータチューニング後に、交差検証で各モデルの汎化性能を調べ、良かったモデル上位3つとスタックモデルで予測する。
- 結果:
- スタックモデル(ElasticNet&XGBoostの平均値)が一番スコアが良かった。
- パブリックスコア
- ElasticNET:0.12109
- Random Forest:0.14486
- XGBoost:0.12520
- (ElasticNet + XGBoost) / 2:0.11915
- 交差検証スコア:
- 線形回帰モデル:
- Ridge: 0.1143 (標準偏差: 0.0120)
- Lasso: 0.3136 (標準偏差: 0.0118)
- ElasticNet: 0.1135(標準偏差: 0.0118)
- SVR : 0.1170(標準偏差: 0.0115)
- 分類木モデル1:
- Random Forest: 0.1350 (標準偏差: 0.0143)
- Gradient Boosting: 0.1467(標準偏差: 0.0136)
- 分類木モデル2:
- lightGBM: 0.1190(標準偏差: 0.0131)
- XGBoost: 0.1160(標準偏差: 0.0099)
- notebookリンク
Ver4
- パブリックスコア:0.14039
- notebookリンク
- 結果:
回帰問題といえば正規分布前提と思い、従属変数を含め重要度の高い変数に対数変換を実施したものも、線形回帰モデルを使っていなかったので、意味が無いかなと思ったら、RandomForestのスコアが良くなった。(スコアの分散を調べていないので、何とも言えないが、誤差かもしれない。) - 前処理:
- 方針:
- 独立変数間で相関高い変数の削除
- rightgbmやRandomForestメインなので、外れ値処理止める。
- 上記と同じ理由で、min-maxスケーリング止める。
- 従属変数や重要度の高い変数(従属変数と相関の高い独立変数)を対数変換して正規分布に近づける
- 前処理:
- 欠損値処理:
- 2割以上欠損値の変数削除
- categorical変数は最頻値、continuous変数は中央値で補完
- 特徴量選択:
- VarianceThreshold()により、分散0.1未満の変数削除
- 変数変換
- 従属変数(SalePrice)を対数変換
- 独立変数のうち、従属変数と相関の高い変数を対数変換
- 名義変数は、Binary Encoding
- 順序変数は、Ordinal Encoding
- スコア
- lightgbm:0.1581
- Random Forest:0.14039
- notebookリンク
Ver3
- パブリックスコア:0.14455
- notebookリンク
- 結果:
特徴量選択で相関低い変数や、独立変数間で相関高い変数の一方を削除したら、返ってスコア下がった。 - 前処理:
- 方針:
- Ver2に加えて、以下を追加
- SalePriceと相関の低い変数の削除
- 独立変数間で相関の高い変数のどちらかを削除
- モデリング:
- Random Forest
- lightgbm
- スコア
- Random Forest:0.14455
- lightgbm:0.18110
- notebookリンク
Ver2
- パブリックスコア:0.14394
- notebookリンク
- 前処理:
- 方針:
- ver1忘れたので、ver1考慮せずに実施。
- 欠損値処理:
- 欠損値が2割以上ある変数を除外('Alley', 'FireplaceQu', 'PoolQC', 'Fence', 'MiscFeature')
- 欠損値補完は、KNNで埋める方法と、最頻値・中央地で埋める方法で比較
- 外れ値処理:以下の3パターンで比較
- 1.5IQRを超える数値を5%tile値、95%tile値で置き換え
- 1.5IQRを超える数値を持つ変数を対数変換
- 外れ値処理なし
- 特徴量選択:
- VarianceThreshold()により、分散0.1未満の変数削除
('Street', 'Utilities', 'LandSlope', 'Condition2', 'Heating','CentralAir', 'BsmtHalfBath', 'KitchenAbvGr') - 0以外の数が2割未満の7変数を削除
('BsmtFinSF2', 'LowQualFinSF', 'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'MiscVal') - 変数変換:
- 名義変数:Binary Encoding
- 順序変数:Ordinal Encoding
- 数値型変数はすべて正規化する
- モデリング
- SVR
- Random Forest
- lightgbm
- スコア:それぞれ一番良かった組み合わせ
- SVR
- 「KNN欠損値補完」&「外れ値処理無し」:0.23727
- Random Forest
- 「最頻値・中央値欠損値補完」&「外れ値処理無し」:0.14648
- lightgbm
- 「KNN欠損値補完」&「外れ値対数変換」:0.14394
- notebookリンク
Ver1
- パブリックスコア:0.15337
- notebookリンク
- 前処理
- 方針:変数の数が多いので、ひたすら減らしてみる。
- 欠損値処理:
- AlleyとFenceを除外
- その他は、カテゴリカルは最頻値、数値は中央値で補完
- 外れ値処理:
- 数値型のいくつかを対数変換
- 特徴量選択:
- カテゴリカル変数:クラスカル=ウォリス検定かけて、p値0.05、効果量中以上の変数を選択
- 数値型変数:SalePriceとの相関が0.4以上の変数のみ選択
- 変数変換:
- カテゴリカル変数:one-hotエンコーディング
- 数値型:min-maxスケーリングで最小0、最大1に揃える
- 従属変数:min-maxスケーリングで最小0、最大1に変換
- モデリング:
- RandomForest
- LightGBM
- スコア:
- RandomForest : 0.15857
- LightGBM : 0.15337
- notebookリンク
参考notebook:
- Comprehensive data exploration with Python
- A study on Regression applied to the Ames dataset
- XGBoost + Lasso
- Stacked Regressions : Top 4% on LeaderBoard
0コメント