פקטור הפיפוח בשונות (VIF): טיפול ברב-קולינאריות בניתוח רגרסיה

בניתוח רגרסיה, רגרסיה מרובה מתרחשת כאשר משתנים בלתי תלויים מקושרים זה לזה. זה מקשה על קביעת ההשפעה הייחודית של כל מנבא על המשתנה התלוי. כתוצאה מכך, יש לך שגיאות סטנדרטיות מנופחות, מה שמשפיע על המשמעות של הקואפיציאנטים.

גורם ההיפרדות של השונות (VIF) הוא כלי נהדר לזיהוי רגרסיה מרובה, המציע תובנות מעבר לקורלציות פשוטות בין זוגות. מדריך זה מסביר כיצד עובד ה-VIF, כיצד לחשב ולפרש אותו, ומה לעשות אם תמצא ערכי VIF גבוהים. צעדים אלו יעזרו לך כמקצוען נתונים וכמדען נתונים לשפר את יציבות המודל שלך.

כעת, בעוד ש-VIF הוא כלי אבחון חשוב וכדאי ללמוד אותו, הוא מייצג רק חלק קטן מהסט הכולל של כישורים שתפתח במסלול הקריירה שלנו מדען למידת מכונה בפייתון, אז הירשם היום.

מהו גורם ההיפרדות של השונות (VIF)?

פותח על ידי הסטטיסטיקאי קאתברט דניאל, VIF הוא כלי רווחה משמש במדידת התאמה בניתוח התקדמות לזיהוי רב-התאמות, שידוע כגורמים לשיפוטיות וחידוד מקדמים בניתוח התקדמות. מבחינה טכנית יותר, VIF פועל על ידי כימות מה מה שבגללו נפוחה אזורת מקדם ריבויי כתוצאה מהשוואה בין ניבאים.

כל זה חשוב מאוד מכיוון שהשוואות אלו עושות קשה לבדוד את ההשפעה הייחודית של כל נבא על משתנה המטרה, מה שמביא להערכות מודל פחות אמינות. כדאי גם לציין, על מנת לספר את הסיפור הנכון באמת, VIF מחושב תמיד עבור כל נבא במודל.

נוסחת פקטור נפיחות השוואות

הַ-VIF עבור פורקן X נחשב כך:

הַמקום:

  • R2 הוא קואפיציינט ההבהרה שנרקם כאשר X משוקלל על ידי כל הפורקנים האחרים.

חישוב שלב אחר שלב

מציאת VIF הוא תהליך של שלושה צעדים. הצעד הראשון הוא להתאים מודל ליניארי נפרד עבור כל פורקן נגד כל הפורקנים האחרים. הצעד השני הוא לקבל את ערך ה-R2 עבור כל מודל. הצעד הסופי הוא לחשב VIF באמצעות הנוסחה שנתונה לעיל.

פרשנות של ערכי VIF

כך ניתן לפרש ערכי VIF כדי להבין את רמת הריבוי של משתנים תלת-ממדיים:

  • VIF = 1: מראה על חוסר ריבוי. המנבא לא מתואם עם מנבאים אחרים, ולכן אינו מפנח את שגיאת הסטנדרט ואינו משפיע על יציבות המודל.
  • VIF בין 1 ל-5: מראה על ריבוי בינוני. ישנה קורלציה עם מנבאים אחרים, אך כללית אינה קשה. עם זאת, כדאי לשמור עין על מנבאים אלו כדי לראות האם ריבוי משתנים עלול להפוך לבעיה, במיוחד אם ערכי VIF אחרים גבוהים.
  • VIF > 5: קיימת מולטי-קולינאריות גבוהה. שגיאת התחזיות של המנבא עשויה להיות מורפת באופן משמעותי, מה שעשוי להופיע את הערך שלו פחות אמין. כדאי לשקול לפעול על מנת להפחית את המולטי-קולינאריות, דוגמת הסרת או שילוב של מנבאים המתואמים.
  • VIF > 10: מדובר במולטי-קולינאריות קשה מאוד. שגיאת התחזיות של המנבא עשויה להיות מורפת מאוד, והערך המוחלט של המנבא סביר שאינו יציב. פעולות תיקון, דוגמת הסרת המנבא או שימוש בטכניקות רגולריזציה, נדרשות בדרך כלל.

לדוגמה, אם VIF של מנבא הוא 10, זה מציין שהשגיאה של ערך המנבא הזה היא 10 פעמים מה שהיא הייתה אם לא הייתה מולטי-קולינאריות.

איך VIF מסביר את המולטי-קולינאריות ברגרסיה

ריבוי-קולינאריות גורם לגידול בשגיאות סטנדרטיות, ומקשה על ניתוח הסימכות של כל המטפלים לחיזוי. זה קורה משום שמשתנים קולינאריים מעבים מידע דומה, מה שיוצר קושי בהפרדת ההשפעות האישיות המסוימות שלהם על משתנה התוצאה.

אף על פי שריבוי-קולינאריות לא בהכרח פוגע ביכולת המודל לחזות, הוא מפחית את האמינות והבהירות של המקדמים. זה בעיקר בעיה כאשר רוצים להבין את ההשפעה האישית של כל מטפל.

מדד הפלטה בליטתית (VIF) משמש כמדד דיאגנוסטי מדויק כדי לזהות ריבוי-קולינאריות. להבדיל מהאקראיות הכללית על סמיכות, VIF מבדיל את השפעתם המשולבת של כל המטפלים על כל משתנה, מדגיש יחסים שאינם ברורים מהקורלציות בין זוגות.

מדד הפלטה בליטתית בפייתון וב-R

כדי להפוך זאת לפעולתית, בואו נעבור דוגמה בשני השפות Python ו-R באמצעות קבוצת נתונים ייחודית. נחשב את VIF באמצעות חבילות אוטומטיות וגם באמצעות נוסחת VIF כדי לבנות רגישות. כדי להיות בעלי שיטה טובה, יצרתי במכוון קבוצת נתונים שבה נגלה ערך VIF גבוה עבור אחת מהמשתנים שלנו אף על פי שאין שיתוף פעולה גבוה ביותר בין שני משתנים – כך שאני חושב שזו דוגמה משכנעת. בואו נתחיל עם סקירת הנתונים שנשתמש בה.

סקירת הנתונים:

קבוצת הנתונים המדומה הזו מייצגת תוצאות סקר ממחקר שנערך ב-1,000 חנויות של ענק קמעונאי. בקניית הצרכן בכל חנות נשאלו לקוחות לדרג אספקטים שונים של חוויית הקניות שלהם בסולם מ-5 עד +5, כאשר -5 מציין חוויית שירות שלילית מאוד, ו+5 מציין חוויית שירות חיובית מאוד. הממוצע של דירוגי הלקוחות בכל חנות נלקח על פני ארבע פרמטרים מרכזיים:

  • אווירה: תפיסת הלקוח לסביבת החנות, כגון ניקיון, עיצוב, תאורה ואווירה כללית.

  • שירות_לקוחות: דירוג השירות שמספקים עובדי החנות, כולל עזרה, ידידותיות ותגובה לצרכי הלקוח.

  • הצעות: דירוג ההצעות הקידומות, ההנחות והדילים הזמינים ללקוחות בחנות.

  • Product_range: דירוג המגוון ואיכות המוצרים הזמינים בחנות.

המשתנה המטרה, ביצועים, מודד את הביצועים הכלליים של כל חנות. אך, אינו רלוונטי מנקודת מבט על פקטור הפליטות ברזולוציה גבוהה. באפשרותך להוריד את קובץ הנתונים כאן.

פקטור הפליטות ברזולוציה גבוהה בפייתון

נתחיל בחישוב ערכי VIF באמצעות חבילות פייתון. הצעד הראשון הוא לטעון את מערך הנתונים ואת הספריות הנדרשות.

from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant datacamp_retail_data = pd.read_csv(' vif_data.csv') datacamp_retail_data.head()

הקוד למעלה יטען את הנתונים ויציג את חמש הרשומות הראשונות.

כצעד הבא, נוכל להריץ מטריצת מתאם כדי לבדוק מתאם זוגי.

הקוד למטה בוחר ארבעה עמודים ושומר אותם במסגרת נתונים חדשה בשם correl_data. הוא מחשב לאחר מכן את מטריצת הקורלציה הזוגית באמצעות הפונקציה .corr(). התוצאה נשמרת באובייקט, corr_matrix, שהיא טבלה המראה את מקדמי הקורלציה בין כל זוגות העמודות הנבחרות. 

המטריצה מוויזואלית לאחר מכן באמצעות הפונקציה heatmap() של Seaborn, מציגה כל מקדם קורלציה כתא בצבע, כאשר כחול מייצג קורלציות שליליות ואדום מייצג קורלציות חיוביות, בהתבסס על מפה צבעונית coolwarm

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # חשב את מטריצת הקורלציה הזוגית corr_matrix = correl_data.corr() # ויזואליזציה של מטריצת הקורלציה plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

פלט:

  קורלציה בין המשתנים. תמונה מאת המחבר

הגרף מספק סיכום חזותי של הקשרים בין המשתנים ב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 מצביעים על רב-קולינאריות גבוהה, ואין בהכרח רק רצון להסיר את המשתנה, ישנן אסטרטגיות מתקדמות נוספות להפחתת רב-קולינאריות:

  1. בחירת תכונות: להסיר אחת מהמתאימים המקורלצים למעלה, ולחשב מחדש את ה־VIF כדי לראות אם זה עוזר לפשט את המודל ולשפר את היציבות.
  2. ניתוח ראשי של רכיבים (PCA): להשתמש ב־PCA כדי לשלב את המתאימים שלך לסט קטן יותר של רכיבים לא מקורלציים. זה מעביר את המשתנים המקוריים למשתנים חדשים, עצמאיים ולא מקורלציוניים שתופסים רוב מהשינויים בנתונים, עוזרים לטפל ברב-התקללות בלתי אחראית ולאבד מידע חשוב.
  3. טכניקות רגולריזציה: להחיל רגרסיה רידג' או לסו, שמוסיפות תנאי עונש למודל. טכניקות אלה עוזרות להפחית את הריבויות המרובות על ידי כיווץ השפעתן של משתנים המתואמים, מה שהופך את המודל ליציב ואמין יותר.

מסקנה

ידיעת השימוש ב-VIF היא מפתח לזיהוי ותיקון מולטיקולינריות, מה שמשפר את הדיוק והבהירות של מודלים רגרסיביים. בדיקה קבועה של ערכי VIF והפעלת אמצעים מתקנים בעת הצורך עוזרת לאנשי מקצוע ונתונים ולמנתחים לבנות מודלים שהם יכולים לסמוך עליהם. גישה זו מבטיחה שההשפעה של כל מנבא ברורה, מה שמקל על הסקת מסקנות מהימנות מהמודל וקבלת החלטות טובות יותר על בסיס התוצאות. קח את מסלול הקריירה מדען למידת מכונה בפייתון כדי להבין באמת כיצד לבנות מודלים ולהשתמש בהם. בנוסף, סיום התוכנית נראה מצוין בקורות חיים.

כמו כן, למידה נוספת, שקול לחקור את המשאבים הבאים מהבלוג והחלקים של DataCamp:

Source:
https://www.datacamp.com/tutorial/variance-inflation-factor