הגרף מספק סיכום חזותי של הקשרים בין המשתנים בcorrel_data
. ערכי הקורלציה נעים בין -1 ל-1, כאשר ערכים הקרובים ל-1 מצביעים על קורלציה חיובית חזקה, ערכים הקרובים ל–1 מצביעים על קורלציה שלילית חזקה, וערכים סביב 0 מציעים חוסר קורלציה. ברור שאין קורלציה זוגית חזקה בין המשתנים, כאשר אף אחד מערכי הקורלציה אינו גבוה מ-0.6.
השלב הבא הוא לחשב את ערכי ה-VIF עבור משתני התחזית. הקוד למטה מחשב את הערכים עבור כל משתנה תחזית בקבוצת הנתונים על מנת לבדוק עבור ריבוי שותפים.
לְרִאשׁוֹן, הקוד מגדיר את X
על ידי הסרת עמודת היעד Performance
והוספת אינטרספט. לאחר מכן, הוא יוצר DataFrame, datacamp_vif_data
, על מנת לאחסן את שמות התחזיות וערכי ה-VIF שלהן. באמצעות לולאה, הוא מחשב את ה-VIF עבור כל תחזית באמצעות פונקציית variance_inflation_factor()
, כאשר ערכי VIF גבוהים מציינים קיום של ריבוי שותפים.
# הגדרת משתני התחזית X = datacamp_retail_data.drop(columns=['Performance']) # הוספת קבוע למודל (אינטרספט) X = add_constant(X) # חישוב VIF עבור כל תכונה datacamp_vif_data = pd.DataFrame() datacamp_vif_data['Feature'] = X.columns datacamp_vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(datacamp_vif_data)
פלט:
פלט המציג את ערכי ה־VIF. תמונה מאת המחבר
הפלט הזה מציג את ערך ה־VIF עבור כל משתנה תחזית, מציין רמות של מולטי-קולינאריות בקבוצת הנתונים. שורת const
מייצגת את מונח החיתוך, עם ערך VIF שקרוב ל־1, מה שאומר שאין לו מולטי-קולינאריות. בין המשתנים התחזייתיים, ל־Product_range
יש VIF הגבוה ביותר (5.94), מה שמרמז על צורך בפעולות תיקון. כל המשתנים האחרים יש להם ערכי VIF שמתחת ל־3, מה שמציין על מולטי-קולינאריות נמוכה.
גישה ידנית לחישוב VIF
הגישה השנייה היא לחשב את הערכים בנפרד על ידי החזקת כל משתנה תלוי בשאר משתני התחזית.
כך שהתהליך הוא שעבור כל ישות ב־retail_data
, הוא מגדיר את הישות הזו כמשתנה תלוי (y) ואת שאר הישויות כמשתנים תלויים (X). מודל רגרסיה לינארית מותאם לחזות y באמצעות X, וערך ה־R-squared של המודל משמש לחישוב VIF באמצעות הנוסחה שדיברנו עליה בסעיף הראשוני.
לאחר מכן, כל תכונה וערכי ה־VIF המתאימים שלהן מאוחסנים במילון (vif_manual
), שנמירו ל־DataFrame (vif_manual_df
) לתצוגה.
datacamp_retail_data = retail_data.drop(columns=['Performance']) # חישוב VIF ידני vif_manual = {} for feature in retail_data.columns: # הגדרת משתנה היעד (תכונה נוכחית) והניבאים (כל התכונות האחרות) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # התאמת המודל ליניארי model = LinearRegression().fit(X, y) # חישוב R-squared r_squared = model.score(X, y) # חישוב VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # המרת המילון ל־DataFrame לתצוגה נוחה יותר vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)
פלט:
הפלט מציג את ערכי ה־VIF. תמונה מאת המחבר
הפלט מציג כל תכונה יחד עם ערך VIF שלה, עוזר לזהות בעיות אפשריות של ריבוי קולינאריות. ניתן לראות שהתוצאה כמובן זהה למה שקיבלנו למעלה; וכך גם תהיה הפרשנות שלה, שהמשתנה Product_range
מציג ריבוי קולינאריות.
מדד פיפוח השטח ב־R
בסעיף זה, נשחזר את התרגיל של מדד פיפוח השטח מהסעיף לעיל בפייתון, במיוחד למפתחים העובדים עם שפת התכנות R. אנו מתחילים על ידי טעינת הקבצים והספריות הדרושות.
library(tidyverse) library(car) library(corrplot) data <- read.csv('vif_data.csv') str(data)
פלט:
השלב הבא הוא לחשב את מטריצת ההתאמה הזוגית, ולהמחיש אותה עם המפתח. הפונקציות cor()
ו־corrplot
עוזרות לנו לבצע משימה זו.
# הסר את עמודת היעד predictors_data <- data[, !(names(data) %in% "Performance")] # חשב את מטריצת המתאם correlation_matrix <- cor(predictors_data) # הצג את מפה החום של המתאם # טען ספריות נחוצות library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # הצג את מפה החום עם ggplot2 ggplot(data = melted_corr_matrix, aes(x = Var1, y = Var2, fill = value)) + geom_tile(color = "white") + scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1, 1), space = "Lab", name="Correlation") + theme_minimal() + # נושא מינימלי למראה נקי theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # הסר את תוויות הצירים geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))
פלט:
מתאם בין המשתנים. תמונה מאת המחבר
זה ברור ממפת החום של המתאם שאין מתאם חזק בין המשתנים, כאשר אף אחד מערכי המתאם אינו גבוה מ-0.6. עכשיו, נחשב את ערכי ה-VIF ונראה אם יש משהו מדאיג. השורה הבאה של קוד מבצעת את המשימה הזו.
# התאם מודל רגרסיה model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # חשב VIF vif(model)
פלט:
מהפלט, אנו רואים כי בין משתני החזקה, רק במשתנה Product_range
יש ערך VIF גדול מ-5, מה שמרמז על רב-קולינאריות גבוהה שדורשת פעולות תיקון.
שיטת חישוב VIF ידנית
השיטה השנייה לחישוב VIF תהיה לחשב את ערכי ה-VIF עבור כל משתנה בנפרד על ידי לקבל את ערכי ה-VIF לכל משתנה תלוי על המשתנים החזקים האחרים.
זה נעשה בקוד למטה, שמשתמש בפונקציית sapply()
על כל חזקה, כאשר כל חזקה מוגדרת כנתונה תלוית במודל רגרסיה לינארית עם החזקות האחרות כמשתנים תלויים.
ערך ה-R-squared מכל מודל משמש לאחר מכן לחישוב ערכי ה-VIF באמצעות הנוסחה שלו. בסופו של דבר, התוצאה, vif_values
, מציגה את ה-VIF עבור כל חיזוי, ועוזרת לזהות בעיות של ריבוי מתאם.
# חישוב VIF עבור כל חיזוי ידנית predictors <- c("Ambience", "Customer_service", "Offers", "Product_range") vif_values <- sapply(predictors, function(pred) { formula <- as.formula(paste(pred, "~ .")) model <- lm(formula, data = data[, predictors]) 1 / (1 - summary(model)$r.squared) }) print(vif_values)
פלט:
אנחנו מקבלים את אותה תוצאה וברור כי המשתנה Product_range
עם ערך VIF גבוה מעל 5 זקוק להתערבות.
VIF מול מטריצת מתאם ושיטות אחרות
כסקירה, הנה השיטות הפופולריות לזיהוי ריבוי מתאם:
- ערכי VIF גבוהים: ערך VIF גבוה הוא אינדיקטור ברור למולטיקולינאריות. כאשר ערכים אלו חורגים מספים מסוימים, הם מצביעים על כך שחזאי קשור באופן חזק לחזאים אחרים, מה שעלול להשפיע על היציבות, האמינות והביצועים של המודל.
- מטריצות מתאם: על ידי בחינת מטריצת מתאם, ניתן לראות את המתאמים הזוגיים בין חזאים. מתאמים זוגיים גבוהים מצביעים על מולטיקולינאריות בין אותם חזאים ספציפיים. עם זאת, שיטה זו מזהה רק קשרים לינאריים ישירים בין שני משתנים ועשויה לפספס מולטיקולינאריות המעורבת באינטראקציות מורכבות יותר בין מספר משתנים.
- שינויי מקדם: אם המקדמים של חזאי משתנים באופן משמעותי כאשר מוסיפים או מסירים משתנים אחרים מהמודל, זה עשוי לשמש כסימן לרב-קולינאריות. תנודות כאלו מצביעות על כך שחלק מהזוהמה עשוי לשתף מידע משותף, מה שהופך קשה יותר לזהות את השפעתם הייחודית של כל משתנה על תוצאה.
מבין כל השיטות אלו, מדד ה-VIF יכול להיות מיוחדות מכיוון שהוא יכול לזהות רב-קולינאריות גם כאשר הקורלציות בין זוגות המשתנים נמוכות, כפי שראינו בדוגמה שלנו. דבר זה הופך את VIF לכלי מתקדם יותר.
רעיונות נוספים על איך לטפל בערכי VIF גבוהים
אם ערכי VIF מצביעים על רב-קולינאריות גבוהה, ואין בהכרח רק רצון להסיר את המשתנה, ישנן אסטרטגיות מתקדמות נוספות להפחתת רב-קולינאריות:
- בחירת תכונות: להסיר אחת מהמתאימים המקורלצים למעלה, ולחשב מחדש את ה־VIF כדי לראות אם זה עוזר לפשט את המודל ולשפר את היציבות.
- ניתוח ראשי של רכיבים (PCA): להשתמש ב־PCA כדי לשלב את המתאימים שלך לסט קטן יותר של רכיבים לא מקורלציים. זה מעביר את המשתנים המקוריים למשתנים חדשים, עצמאיים ולא מקורלציוניים שתופסים רוב מהשינויים בנתונים, עוזרים לטפל ברב-התקללות בלתי אחראית ולאבד מידע חשוב.
- טכניקות רגולריזציה: להחיל רגרסיה רידג' או לסו, שמוסיפות תנאי עונש למודל. טכניקות אלה עוזרות להפחית את הריבויות המרובות על ידי כיווץ השפעתן של משתנים המתואמים, מה שהופך את המודל ליציב ואמין יותר.
מסקנה
ידיעת השימוש ב-VIF היא מפתח לזיהוי ותיקון מולטיקולינריות, מה שמשפר את הדיוק והבהירות של מודלים רגרסיביים. בדיקה קבועה של ערכי VIF והפעלת אמצעים מתקנים בעת הצורך עוזרת לאנשי מקצוע ונתונים ולמנתחים לבנות מודלים שהם יכולים לסמוך עליהם. גישה זו מבטיחה שההשפעה של כל מנבא ברורה, מה שמקל על הסקת מסקנות מהימנות מהמודל וקבלת החלטות טובות יותר על בסיס התוצאות. קח את מסלול הקריירה מדען למידת מכונה בפייתון כדי להבין באמת כיצד לבנות מודלים ולהשתמש בהם. בנוסף, סיום התוכנית נראה מצוין בקורות חיים.
Source:
https://www.datacamp.com/tutorial/variance-inflation-factor