多重共線性が発生していそうな組み合わせを抜き出す
まず相関係数をcorr()メソッドで出してあげる
train_corr = train.corr()
train_corr = train_corr.mask(train_corr[train_corr.columns] == 1.0)
train_corr
実行結果(kaggleのNotebook画面)
この実行結果からfor文を利用し、多重共線性が発生している要素の組み合わせを求める
今回の多重共線性が発生しているとする基準は相関係数が0.8より大きい要素の組み合わせとする。
# for文で実行した相関係数の値を格納するために宣言
corr_list = []
# for文開始を2行目から始めたい為、変数に1を渡し、後に配列番号として利用する。
# 2行目から開始したい理由としては同じ要素同士の相関係数は1になり、計算にリソースを取られた
# くないことに加えてfor文の中で1ずつ加算することによって必要のない計算はスキップできる。
ind_st = 1
# カラムでfor文を回す。最後の列は計算に含めたくなため、:-1で指定している
for col in train_corr.columns[:-1]:
# カラムfor文の中でインデックスfor文を回すことで1列毎に対して指定した分の行を回すことができる
for ind in train_corr.index[ind_st:]:
# [col][ind]で列と行の相関係数を見ることで相関係数をtmpに渡す
tmp = train_corr[col][ind]
if tmp > 0.8:
print(tmp)
#appendの際に(())で二重括弧にしているのはタプル形式で変数に追加するため。
corr_list.append((col, ind, tmp))
#次の周回の時に一つ下の行で処理を行うために、1加算する
ind_st += 1
実行結果
0.8256674841743408
0.8195299750050339
0.8254893743088425
0.882475414281462
これだけではどの組み合わせかわからないので、for文の中のif文で定義づけた、相関係数が0.8より大き要素名と、相関係数を渡した変数corr_listを呼び出す
corr_list
実行結果
[('YearBuilt', 'GarageYrBlt', 0.8256674841743408),
('TotalBsmtSF', '1stFlrSF', 0.8195299750050339),
('GrLivArea', 'TotRmsAbvGrd', 0.8254893743088425),
('GarageCars', 'GarageArea', 0.882475414281462)]
カラム名, インデックス名, 相関係数といった形がタプルとして保管されている。
ハマったところ
今回個人的にハマってわからなかった場所としては列x行総当たりのような処理。
for col in df.columns:
for ind in df.index:
こういった書き方で1列に全行という処理ができることを学習した。
今後も使うことがあると思うのでメモ