ขอบคุณ SpanishBoy - มันเป็นโค้ดที่ดี @ilanman: นี่ตรวจสอบค่า VIF แล้วปล่อยตัวแปรที่มี VIF มากกว่า 5 ด้วย "ประสิทธิภาพ" ฉันคิดว่าเขาหมายถึงเวลาทำงาน รหัสด้านบนใช้เวลาประมาณ 3 ชั่วโมงในการรันตัวแปร 300 ตัวและ 5,000 แถว
โดยวิธีการที่ฉันได้แก้ไขมันเพื่อลบลูปพิเศษบางอย่าง นอกจากนี้ฉันได้ทำให้มันสะอาดขึ้นเล็กน้อยและคืนค่าดาต้าเฟรมด้วยตัวแปรที่ลดลง รุ่นนี้ลดเวลาทำงานของฉันลงครึ่งหนึ่ง! รหัสของฉันอยู่ด้านล่าง - หวังว่าจะช่วยได้
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]