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
  
      
        
        
        
        
        
        
        
        
        
        
        
        