VIFを利用した減少法による変数選択法in Python

統計学




VIF統計量が10以上の変数を取り出すプログラムを考えていく。 Pythonのライブラリvariance_inflation_factorを使って、VIFを計算していく。 (adsbygoogle = window.adsbygoogle || []).push({}); データセット-ボストン住宅価格
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_boston


# サンプルデータを用意
dataset = load_boston()

# 標本データを取得
data_x = pd.DataFrame(dataset.data,columns=dataset.feature_names)

# 正解データを取得
data_y = pd.DataFrame(dataset.target,columns=['target'])

VIF variance_inflation_factor

from statsmodels.stats.outliers_influence import variance_inflation_factor

vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(data_x.values, i) for i in range(data_x.shape[1])]
vif["features"] = data_x.columns

減少法-変数選択-VIF削除システム

variance_inflation_factoによって、算出したVIF値が指定した許容値に収まるように、変数を削除していく。

変数選択法の減少法を用いる。

VIF値が最大のものから順に削除していく。

from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

'''
VIF削除システム
'''
#許容値
perm_level = 10

while True:
    x=data_x
    vif = pd.DataFrame()
    vif["VIF Factor"] = [variance_inflation_factor(x.values, i) for i in range(x.shape[1])]
    vif["features"] = x.columns
    
    if vif["VIF Factor"].max() > perm_level:
        print(vif)
        OLS_rv = LinearRegression(fit_intercept=True).fit(x, data_y)
        print(OLS_rv.score(x, data_y))
        remove_id = vif["VIF Factor"].idxmax()
        remove_data = vif["features"][remove_id]
        data_x = data_x.drop(remove_data, axis=1)
    else:
        print("finish")
        print(vif)
        OLS_rv = LinearRegression(fit_intercept=True).fit(x, data_y)
        print(OLS_rv.score(x, data_y))
        y_pred = OLS_rv.predict(data_x)
        #y_pred = pd.DataFrame(y_pred.round(1))
        print("2乗平均誤差:", mean_squared_error(data_y, y_pred))
        print("決定係数:", r2_score(np.array(data_y), y_pred))
        break
  
タイトルとURLをコピーしました