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