重回帰分析でKaggleしてみる

今回はKaggleのこのコンペを重回帰分析を使ってトライしてみました。

 

目標

 

  • kaggleのスコアアップ
  • 重回帰分析に対する理解
  • 説明変数の選択のアプローチ法を知る

 

まずは単回帰でチャレンジ

 

重回帰の結果と比較するためにまずはこのサイトを参考にして、単回帰で結果を見てみました。

 

seabornのheatmap()などを使って、可視化などをして目的変数であるSalePriceと相関のありそうなGrLivAreaを説明変数にして単回帰分析をしました。

 

結果

スコアは0.28918で、
今現在のランキングで4705位/5095でした。
うわっ…、私のスコア、低すぎ…?

 

重回帰分析をする

 

単回帰は説明変数は1つでしたが、重回帰では説明変数に復数のパラメータを選びます。

 

ではさっそく本題の重回帰分析をしていきたいと思います。
今回のデータはSalePriceを含めて81カラムもあるのですが、
ひとまず全部ぶっこんで送信してみます。

 

また、今回はscikit-learnの他にstatsmodelsというのを使ってみます。
これを使うと、t値なども算出してくれるので結果を見て分析をするにはscikit-learnだけでは物足りないので良さそうです。

 

また、本題ではないので手順は省略しますが、欠損値についてはffillし、
カテゴリカルデータはpandasのget_dummies()を使いました。

 

一つ、気を付けるべき点は
sklearnの場合は
model.fit(説明変数, 目的変数)ですが、
statsmodelsは逆で
model.fit(目的変数, 説明変数)の順になります。

 

statsmodelsの使い方などは以下のサイトを参考にしました。

 

【参考】PythonのStatsmodelsを使って回帰分析を行う – wonderful cool something

 

 

出力

 

結果

結果は0.28763
めっちゃちょっとだけ上がりました。

 

statsmodelsの出力を見てみる

 

上の出力を少し見てみます。
上部の表の項目は以下の通りです。

  • R-squared: 決定係数
     - 大きいほどいい

    • 一般的に説明変数が多いほど向上するが、そうすると過学習気味になる
    • 弱点は説明変数を増やすと分子が減少すること。データ数が少ないと決定係数が自由度の影響を受けて必要以上に大きくなることになる
  • Adj. R-squared: 自由度調整済みの決定係数
    • 決定係数の弱点を克服
    • 1に近い方がいい
  • F-statistic: F値
    • 回帰式が意味があるかどうかを検定する統計量
  • Prob: F検定に基づくp値
    • 回帰式が意味がない確率
  • Log-Likelihood: 対数尤度
    • 想定した回帰モデルから見て、実際に得られた標本がどの程度もっともらしいか
    • 大きい方がいい。
  • AIC: 赤池情報量基準
    • 回帰式の当てはまりの良さを示す。(低い方がいい)
  • BIC: ベイジアン情報量基準

 

一つ一つはあまり調べられてないのですが、
今後じっくりと勉強したいなと思います。

 

次に、下のテーブルのカラムを見ていきます。

 

  • coef: 偏回帰係数
  • std err: パラメータの標準誤差。ばらつき具合
  • t: t値
    • 大きいほど影響が大きい
  • P>|t|: t検定に基づくp値
    • 小さいほどその変数の影響が偶然でない可能性が高い
    • 検定を行う場合は0.05未満や0.01未満が基準
  • 最後: 95%信頼区間。95%の確率でこの区間内に値が収まる

 

t値が大きいほど影響が大きくとありますが、これは切片は除きます。

 

多重共線性(マルチコ)とは

 

次に、重回帰分析をしているとよく出てくる単語である「多重共線性」について少し記述します。

 

重回帰分析では説明変数に復数のパラメータを使うことは上述しましたが、
この説明変数同士で、層化係数が高いものがあると、多重共線性という現象が生じる可能性があります。

 

説明変数の数を増やすと決定係数が大きくなるので、
一見するとモデルの説明力が上がっているようにみえるのですが、
ここに多重共線性があると、モデルが不安定になりやすくなります。

 

では、先ほどのstasomodelのsummary()の出力をどこを見れば、
多重共線性があると判断できるのでしょうか。

 

多重共線性がある特徴は以下のようなものです。

 

  • 説明変数相互の相関係数が高い
  • 目的変数との相関係数と、偏回帰係数の符号が逆になっている
  • 決定係数は大きいのにt値が小さい
  • 観測値を少し増やしたり説明変数を増減すると、推定値が大きく変動する

 

以上のような点が見られるときは、多重共線性の疑いがあるので、
データを増やすか、説明変数のいずれかを外して重回帰分析をやり直したほうがいいみたいです。

 

ただ、「データを増やす」というのも難しいし、「いずれか一つの説明変数を外す」と言っても「どれを取り除くか問題」もあったりします。

 

【参考】
重回帰分析
多重共線性ってなんだったんだっけ?+正則化の話。 | 分析のおはなし。
多重回帰分析 – Qiita

 

多重共線性とダミー変数の関係

 

カテゴリデータをダミー変換して作った変数を全て目的変数として使うと多重共線性が出やすくなるので、
一般的にはどれか1つを外したりします。

 

ダミー変換してくれるpandasのget_dummies()ですが、
オプションにdrop_firstというのがあるのでこれをTrueにすると、
ダミー変換されたあとのデータの先頭を削除してくれます。

 

ただ、あくまでも「先頭」なので、これを外すのが最適かどうかはわかりません。

 

説明変数を選択する

 

上述の通り、

 

  • 説明変数は多いほうが良いわけではない
  • 目的変数に影響していない雑多な説明変数は少ない方がいい

 

ということがわかりましたが、ではどうやって説明変数を選択したら良いのでしょうか
いくつか方法はあるみたいですが、ここれでは代表的なものを2つ紹介します。

 

変数増加法

 

説明変数を0個から始め、目的変数との相関が強いものから順に1つずつ追加して結果を見ていきます。
t値の小さいもの(t^2<2を目安にすることが多い)が登場すればその直前までを使います。

 

変数減少法

準備した説明変数を全部使って、多重共線性の疑いのあるものから順に取り除いていきます。
t値の小さいもの(t^2<2を目安にすることが多い)を外して繰り返し分析します。
ただし、ダミー変数に変換したデータを外すときは、そのカテゴリのデータを全部外す必要があるみたいです。

 

今回は使うデータが81カラムもあるので、
変数減少法を使ってみようかと思います。

 

まずは、「t^2<2を満たすものをすべて外してみる」という操作を繰り返して結構な数のカラムを削除しました。

 

 

結果

スコアは0.19032
順位は3609位!!
まだまだ3000番代ですが1000位以上もあがりました!

 

VIFとトレランスとは

 

多重共線性をチェックする尺度に「VIF(Variance Inflation Factor)」、「トレランス(tolerance)」というのもあるみたいです。
VIFは日本語で言うと、「分散拡大係数」と言います。

 

変数aとbとの間のVIFを、変数aとbの間の相関係数Rを使って以下のように定義します。
VIF = 1 / (1 - R^2)

一般的には、10より大きいと多重共線性の疑いがあります。

 

【参考】
PythonのStatsmodelsを使って回帰分析を行う – wonderful cool something
Variance Inflation Factor (VIF) Explained – Python

 

実装にはstatsmodelsのvariance_inflation_factor()を使って求めます。

 

 

出力

 

一応5以上とか10以上とかが指標として使われるらしいので、
5以上が出たKitchenQualを外して提出してみました。

 

結果

スコアは、0.43711
えぇ。。
めっちゃ下がるやん・・。
なんでだ・・。

 

ちなみに「トレランス(tolerance)」というのもあります。
これは単純にVIFの分母のことをトレランスと呼ぶので、
トレランスが小さいと多重共線性が起きていると考えられます。

 

その他のアプローチ

 

符号の異なるものを外す

 

偏回帰係数と、目的変数との相関係数の符号が異なるものを外して提出してみたりしましたが、
これもスコアは0.27799とさがってしまいました。

 

交差項

 

今回はやってませんが交差項を入れるというアプローチもあるみたいです。
【参考】PythonのStatsModelsによる線形回帰分析! 交差項もモデルに入れてみた! – これで無理なら諦めて!世界一やさしいデータ分析教室

 

さいごに

 

はじめてKaggleにトライしてみました。
データ分析は体系的に「この結果が出たら、次はこうしましょう」みたいなのがないので難しいけど、
自分が持っている武器と、データから読み取れるヒントをすくってスコアをあげていく感じが謎解きゲームみたいでおもしろいですね。
今回はちょろっと触ってみただけでしたが、
statsmodelsの結果の各項目に対する理解や、検定についても勉強していきたいなと思います。

コメントを残す