Спасибі SpanishBoy - це хороший фрагмент коду. @ilanman: Це перевіряє значення VIF, а потім відміняє змінні, VIF яких перевищує 5. Під "продуктивністю" я думаю, що він означає час виконання. Вищеописаний код знадобився мені близько 3 годин, щоб працювати на 300 змінних, 5000 рядків.
До речі, я його змінив, щоб видалити кілька зайвих циклів. Крім того, я зробив це трохи більш чистим і повернути кадр даних зі зменшеними змінними. Ця версія скоротила мій час роботи вдвічі! Мій код нижче - сподіваюся, що це допомагає.
from statsmodels.stats.outliers_influence import variance_inflation_factor
def calculate_vif_(X, thresh=5.0):
variables = list(range(X.shape[1]))
dropped = True
while dropped:
dropped = False
vif = [variance_inflation_factor(X.iloc[:, variables].values, ix)
for ix in range(X.iloc[:, variables].shape[1])]
maxloc = vif.index(max(vif))
if max(vif) > thresh:
print('dropping \'' + X.iloc[:, variables].columns[maxloc] +
'\' at index: ' + str(maxloc))
del variables[maxloc]
dropped = True
print('Remaining variables:')
print(X.columns[variables])
return X.iloc[:, variables]