data-science-summary/summary
VIF(Variance Inflation Factor) 분산팽창지수 in python
고수트
2020. 9. 18. 00:05
반응형
from statsmodels.api import OLS, add_constant
from sklearn import datasets
from sklearn.model_selection import train_test_split
import pandas as pd
datas = datasets.load_diabetes()
datas.target
df = pd.DataFrame(datas.data, columns = datas.feature_names)
y = pd.DataFrame(datas.target, columns = ['y'])
df = pd.concat([df, y], axis=1)
train, test = train_test_split(df, test_size=0.3, random_state=123)
train_x = add_constant(train)
model = OLS(train.y, train_x.drop(columns='y')).fit()
test_x = add_constant(test)
pred = model.predict(test_x.drop(columns='y'))
from sklearn.metrics import mean_squared_error
print('제거전 : ' , mean_squared_error(test.y, pred))
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = pd.DataFrame()
vif['features'] = train_x.drop(columns='y').columns
vif['VIF Factor'] = [variance_inflation_factor(train_x.drop(columns='y').values, i) for i in range(train_x.drop(columns='y').shape[1])]
# vif 확인후 다중공선성 높게 나타난 변수 제거 drop
print(vif)
train_x = train_x.drop(columns=['s1'])
train_x
vif = pd.DataFrame()
vif['features'] = train_x.drop(columns='y').columns
vif['VIF Factor'] = [variance_inflation_factor(train_x.drop(columns='y').values, i) for i in range(train_x.drop(columns='y').shape[1])]
# vif 확인후 다중공선성 높게 나타난 변수 제거 drop
print('제거후')
print(vif)
# 제거한 후 학습
test_x = test_x.drop(columns=['s1'])
model = OLS(train.y, train_x.drop(columns='y')).fit()
pred = model.predict(test_x.drop(columns='y'))
print('제거후 : ' , mean_squared_error(test.y, pred))
<엔지니어는 구현을 못하면 모르는것이다>
VIF(Variance Inflation Factor) 분산팽창지수
=> 다중공선성 판단에 쓰임 => 10이상 보통 다중공선성이 있다 판단
특정 독립변수를 다른 독립변수로 선형 회귀한 성능 => 즉 다른 것으로도 나타낼수 있음
=> 다른 변수에 의존적일수록 VIF 가 커짐 => 높게 나타난것 제거(drop)
제거후 다시 실험 해보면 다중 공선성 제거된 경우 많음
반응형