בעולם הדינמי של ניתוח נתונים ולמידת מכונה, בחירת המשתנים הנכונים למודל היא שלב קריטי שמשפיע על ביצועי המודל, על פשטותו, ועל משאבי החישוב הדרושים לו.
מערכי נתונים מודרניים עשויים לכלול עשרות ואף מאות משתנים, אך לא כולם תורמים בפועל לדיוק החיזוי.
Forward Selection היא שיטה מתקדמת לבחירת משתנים, שמאפשרת לבנות מודל פשוט ויעיל תוך התמקדות במשתנים המשמעותיים ביותר.
במאמר זה נסקור את השיטה, נבין את היתרונות והחסרונות שלה, ונתמקד ביישום מעשי בתהליך הרגרסיה.
אז מה זה ‘בחירה קדימה’?
רגרסיה בשלבים (Stepwise Regression) היא שיטה מיוחדת של רגרסיה היררכית, שבה אלגוריתמים סטטיסטיים קובעים אילו משתנים מסבירים (predictors) ייכללו במודל. לשיטה זו יש שלוש וריאציות בסיסיות: בחירה קדימה (Forward Selection), סילוק לאחור (Backward Elimination), וסילוק דו-כיווני (Bidirectional elimination).
הגישה הפשוטה ביותר לבניית מודל מבוסס נתונים נקראת בחירה קדימה (Forward Selection). המודל מתחיל ללא משתנים מסבירים, ומוסיף משתנים באופן הדרגתי בהתאם לחשיבותם הסטטיסטית, עד שמגיעים לקריטריון עצירה.
בשיטה זו, מוסיפים משתנה אחד בכל פעם, ובודקים אילו מהמשתנים שאינם נמצאים במודל ראויים להיכלל בו. המשתנה המשמעותי ביותר (בעל ערך ה-p הנמוך ביותר) מתווסף למודל, כל עוד ערך ה-p שלו נמוך מרמה מסוימת שנקבעה מראש. נהוג לקבוע רמה זו מעל 0.05, לדוגמה 0.10 או 0.15, בשל האופי האקספלורטיבי של השיטה.
עם זאת, לשיטה זו ישנם חסרונות. הוספת משתנה חדש למודל עשויה להפוך משתנים שכבר נבחרו לפחות משמעותיים.
ולכן, במקרים מסוימים, נכון יותר להשתמש בשיטת סילוק לאחור (Backward Elimination), שבה מתחילים ממודל הכולל את כל המשתנים האפשריים, ומסירים בהדרגה משתנים לא משמעותיים, בהתאם לקריטריון עצירה שנקבע מראש. בתהליך זה, מסירים בכל שלב את המשתנה הכי פחות משמעותי, כל עוד ערך ה-p שלו חורג מהרמה הקריטית שנקבעה.
שיטה נוספת היא רגרסיה בשלבים (Stepwise Regression), המשלבת את שתי הגישות. בשיטה זו, המודל מאפשר גם הוספה וגם הסרה של משתנים בשלבים שונים. תהליך זה כולל בחירה של המשתנה הכי פחות משמעותי להסרה, ובחינה מחדש של משתנים שהוסרו כדי לבדוק אם יש להחזירם למודל. יש לקבוע שתי רמות מובהקות נפרדות לתהליך זה: רמת מובהקות להסרה (גבוהה יותר) ורמת מובהקות להוספה (נמוכה יותר).
במאמר זה אתמקד בגישת בחירה קדימה (Forward Selection).
איך מחשבים את זה?
כמו שכתבתי מקודם- בחירה קדימה היא שיטה לבניית מודל רגרסיה בצורה הדרגתית, שבה מוסיפים משתנים למודל בהתבסס על תרומתם הסטטיסטית.
בתהליך זה, כל שלב מתמקד בהערכת משתנים ובחירת המשתנה המשמעותי ביותר לשיפור המודל.
אלה הצעדים המרכזיים לביצוע התהליך, עם דגש על רגרסיה ליניארית:
1. הגדרת מודל ראשוני:
נתחיל ממודל בסיסי, ללא משתנים מסבירים.
2. הערכת משתנים אפשריים:
עבור כל משתנה שאינו במודל הנוכחי (כולם אם המודל שלנו ריק או פשוט עוד לא קיים) נעריך את המודל מחדש הכולל את המשתנה הזה.
נחשב קריטריון סטטיסטי עבור המודל, הקריטריון יכול להיות P-Value או גם R².
3. בחירת המשתנה המשמעותי ביותר:
כעת נבחר את המשתנה שמביא לשיפור הגדול ביותר במודל, לדוגמא:
נבחר במשתנה שמוביל לשיפור המשמעותי ביותר בערך ה-R² או שנבחר במשתנה עם סף ה-P-Value הנמוך מ- 0.05.
4. חזרה על התהליך:
כעת נבצע חזרה על שלבים 2 ו-3, כאשר בכל פעם נוסיף משתנה אחד אחרי השני.
נמשיך עד שאף משתנה נוסף אינו משפר את המודל באופן מובהק.
5. עוצרים:
עוצרים את החזרה כאשר:
אין יותר משתנים שמובהקותם הסטטיסטית מספיקה להוספה למודל.
לחילופין במקרים בהם השיפור במדד הנבחר הופך לזניח.
זה הזמן לקוד 💀
בחרתי לכתוב תוכנית אשר תבצע תהליך בחירה קדימה (Forward Selection) כדי לזהות משתנים המשפיעים על רגרסיה ליניארית. התוכנית תבקש מהמשתמש להזין נתיב ושם של קובץ CSV, תקרא את הנתונים מהקובץ, ותאתר את המשתנים המשמעותיים ביותר עבור המודל, בהתבסס על רמת מובהקות של 0.05 (P-Value).
לבסוף, התוכנית תדפיס את האינדקסים של המשתנים הנבחרים.
הנחות יסוד
מספר העמודות בקובץ אינו ידוע מראש.
כל הערכים בעמודות הם ערכים מספריים רציפים (אין עמודות קטגוריאליות).
העמודה האחרונה בקובץ היא המשתנה התלוי (response variable), וכל שאר העמודות הן משתנים בלתי תלויים (predictors).
דרישות
יש ליישם את אלגוריתם Forward Selection כדי להוסיף משתנים למודל רגרסיה בהדרגה.
ההחלטה אם לכלול משתנה במודל תתבסס על p-value של 0.05:
משתנה ייכלל במודל אם p-value שלו נמוך מ-0.05.
משתנה עם p-value גבוה מ-0.05 לא ייכלל במודל.
לאחר סיום התהליך, התוכנית תדפיס את האינדקסים של העמודות שנבחרו.
הלכה למעשה
תחילה נייבא את הספריות הדרושות
import pandas as pd
import statsmodels.api as sm
לאחר מכן, נייבא את קובץ הנתונים ואם הכל תקין נדפיס למסך את חמשת השורות הראשונות של הקובץ:
input_path = input("Please specify file and path for CSV file: \n")
try:
dataset = pd.read_csv(input_path)
print(dataset.head(5))
except Exception as e:
print(f"Error while reading the file: {e}")
כעת, נגדיר את הצירים שלנו:
target_column = dataset.columns[-1]
X = dataset.iloc[:,:-1].values
y = dataset.iloc[:,-1].values
שימו לב שצריך y (המשתנה התלוי) הוא הלכה למעשה האחרון.
כל הפיצ’רים (הפרדיקטורים/מנבאים) מוגדרים מאינדקס 0 (המשתנה הראשון) ועד אחד לפני האחרון.
כעת אנחנו נבצע את האלימינציה, לשם כך נייצר לולאת WHILE שתרוץ על כל העמודות ותסנן עבורנו רק את המשתנים בעלי ערך ה-p-value הנמוך מ-0.05:
if not isinstance(X, pd.DataFrame):
X = pd.DataFrame(X, columns=dataset.columns[:-1])
initial_features = []
remaining_features = list(X.columns)
selected_features = []
significance_level = 0.05
while remaining_features:
p_values = []
for feature in remaining_features:
# מודל רגרסיה עם התכונות הנוכחיות
current_features = initial_features + [feature]
X_current = sm.add_constant(X[current_features]) # הוספת intercept
model = sm.OLS(y, X_current).fit()
p_values.append((feature, model.pvalues[feature]))
# מציאת התכונה עם ה-p-value הקטן ביותר
p_values = sorted(p_values, key=lambda x: x[1])
best_feature, best_p_value = p_values[0]
if best_p_value < significance_level:
# הוספת התכונה למודל
initial_features.append(best_feature)
remaining_features.remove(best_feature)
selected_features.append(best_feature)
else:
break
selected_feature_indices = [X.columns.get_loc(col) for col in selected_features]
print("After forward selection the most important independent variables are in index:", selected_feature_indices)
דוגמא לפלט:
After forward selection the most important independent variables are in index: [0, 2]
לסיכום
במאמר זה הבנו את החשיבות של בחירת משתנים באמצעות Forward Selection בתהליך בניית מודלים. דנו על היתרונות של השיטה, כמו פישוט המודל, שיפור דיוק החיזוי, וחיסכון במשאבים חישוביים.
בנוסף, הצגנו את היישום התיאורטי של השיטה, ולבסוף ביצענו הדגמה טכנית הממחישה את תהליך הבחירה, שלב אחר שלב.
השיטה מתאימה במיוחד לפרויקטים המבוססים על ניתוח נתונים ולמידת מכונה, והיא מעניקה כלים להבנה טובה יותר של המשתנים הקריטיים שמשפיעים על תוצאות המודל.