logo

אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

  • K-Nearest Neighbour הוא אחד מאלגוריתמים הפשוטים ביותר של למידת מכונה המבוססת על טכניקת למידה מפוקחת.
  • אלגוריתם K-NN מניח את הדמיון בין המקרה/הנתונים החדשים למקרים הזמינים ומכניס את המקרה החדש לקטגוריה הדומה ביותר לקטגוריות הזמינות.
  • אלגוריתם K-NN מאחסן את כל הנתונים הזמינים ומסווג נקודת נתונים חדשה על סמך הדמיון. המשמעות היא שכאשר מופיעים נתונים חדשים, ניתן לסווג אותם בקלות לקטגוריית חבילות טובות באמצעות אלגוריתם K-NN.
  • ניתן להשתמש באלגוריתם K-NN עבור רגרסיה כמו גם עבור סיווג, אך לרוב הוא משמש עבור בעיות הסיווג.
  • K-NN הוא א אלגוריתם לא פרמטרי , מה שאומר שהוא לא עושה שום הנחה על הנתונים הבסיסיים.
  • זה נקרא גם א אלגוריתם לומד עצלן מכיוון שהוא לא לומד ממערך ההדרכה באופן מיידי, במקום זאת הוא מאחסן את מערך הנתונים ובזמן הסיווג, הוא מבצע פעולה על מערך הנתונים.
  • אלגוריתם KNN בשלב האימון פשוט מאחסן את מערך הנתונים וכאשר הוא מקבל נתונים חדשים, הוא מסווג את הנתונים הללו לקטגוריה שדומה בהרבה לנתונים החדשים.
  • דוגמא:נניח שיש לנו תמונה של יצור שנראה דומה לחתול ולכלב, אבל אנחנו רוצים לדעת אם זה חתול או כלב. אז בשביל הזיהוי הזה, אנחנו יכולים להשתמש באלגוריתם KNN, מכיוון שהוא עובד על מדד דמיון. מודל ה-KNN שלנו ימצא את התכונות הדומות של מערך הנתונים החדש לתמונות החתולים והכלבים ובהתבסס על התכונות הדומות ביותר הוא יכניס אותו לקטגוריית חתול או כלב.
אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

למה אנחנו צריכים אלגוריתם K-NN?

נניח שישנן שתי קטגוריות, כלומר, קטגוריה A וקטגוריה B, ויש לנו נקודת נתונים חדשה x1, אז נקודת נתונים זו תמצא באיזו מהקטגוריות הללו. כדי לפתור בעיה מסוג זה, אנחנו צריכים אלגוריתם K-NN. בעזרת K-NN, נוכל לזהות בקלות את הקטגוריה או המחלקה של מערך נתונים מסוים. שקול את התרשים שלהלן:

אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

איך K-NN עובד?

ניתן להסביר את פעולת K-NN על בסיס האלגוריתם שלהלן:

    שלב 1:בחר את המספר K של השכניםשלב 2:חשב את המרחק האוקלידי של מספר K של שכנים שלב 3:קח את ה-K השכנים הקרובים ביותר לפי המרחק האוקלידי המחושב.שלב 4:בין k השכנים הללו, ספרו את מספר נקודות הנתונים בכל קטגוריה.שלב-5:הקצה את נקודות הנתונים החדשות לאותה קטגוריה שעבורה מספר השכן הוא המקסימלי.שלב-6:הדגם שלנו מוכן.

נניח שיש לנו נקודת נתונים חדשה ואנחנו צריכים לשים אותה בקטגוריה הנדרשת. שקול את התמונה הבאה:

סדר לפי sql אקראי
אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה
  • ראשית, נבחר את מספר השכנים, אז נבחר את k=5.
  • לאחר מכן, נחשב את מרחק אוקלידי בין נקודות הנתונים. המרחק האוקלידי הוא המרחק בין שתי נקודות, שכבר למדנו בגיאומטריה. ניתן לחשב אותו כך:
אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה
  • על ידי חישוב המרחק האוקלידי קיבלנו את השכנים הקרובים ביותר, בתור שלושה שכנים הקרובים ביותר בקטגוריה A ושני שכנים הקרובים ביותר בקטגוריה B. שקול את התמונה הבאה:
אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה
  • כפי שאנו יכולים לראות, שלושת השכנים הקרובים ביותר הם מקטגוריה A, מכאן שנקודת הנתונים החדשה הזו חייבת להשתייך לקטגוריה A.

כיצד לבחור את הערך של K באלגוריתם K-NN?

להלן כמה נקודות שכדאי לזכור בעת בחירת הערך של K באלגוריתם K-NN:

  • אין דרך מסוימת לקבוע את הערך הטוב ביותר עבור 'K', אז אנחנו צריכים לנסות כמה ערכים כדי למצוא את המיטב מהם. הערך המועדף ביותר עבור K הוא 5.
  • ערך נמוך מאוד עבור K כגון K=1 או K=2, יכול להיות רועש ולהוביל להשפעות של חריגים במודל.
  • ערכים גדולים עבור K הם טובים, אבל זה עשוי למצוא כמה קשיים.

היתרונות של אלגוריתם KNN:

  • זה פשוט ליישום.
  • זה חזק לנתוני האימון הרועשים
  • זה יכול להיות יעיל יותר אם נתוני האימון גדולים.

החסרונות של אלגוריתם KNN:

  • תמיד צריך לקבוע את הערך של K שעשוי להיות מורכב מתישהו.
  • עלות החישוב גבוהה בגלל חישוב המרחק בין נקודות הנתונים עבור כל דגימות האימון.

יישום Python של אלגוריתם KNN

כדי לבצע את הטמעת Python של אלגוריתם K-NN, נשתמש באותה בעיה ומערך נתונים שבהם השתמשנו ברגרסיה לוגיסטית. אבל כאן נשפר את הביצועים של הדגם. להלן תיאור הבעיה:

בעיה עבור אלגוריתם K-NN: יש חברה ליצרנית רכב שייצרה מכונית SUV חדשה. החברה רוצה לתת את המודעות למשתמשים המעוניינים לקנות את רכב השטח הזה. אז לבעיה זו, יש לנו מערך נתונים המכיל מידע רב של משתמשים דרך הרשת החברתית. מערך הנתונים מכיל מידע רב אך ה שכר משוער ו גיל נשקול את המשתנה הבלתי תלוי ואת משתנה שנרכש הוא עבור המשתנה התלוי. להלן מערך הנתונים:

אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

שלבים ליישום אלגוריתם K-NN:

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

שלב עיבוד נתונים מראש:

שלב עיבוד מוקדם של נתונים יישאר זהה לחלוטין לשלב רגרסיה לוגיסטית. להלן הקוד עבורו:

 # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test) 

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

אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

מתמונת הפלט לעיל, אנו יכולים לראות שהנתונים שלנו הותאמו בהצלחה.

    התאמת מסווג K-NN לנתוני האימון:
    כעת נתאים את מסווג K-NN לנתוני האימון. לשם כך נייבא את KNeighborsClassifier כיתה של שכנים סקלארן סִפְרִיָה. לאחר ייבוא ​​המחלקה, ניצור את מסווג מושא הכיתה. הפרמטר של מחלקה זו יהיה
      n_שכנים:כדי להגדיר את השכנים הנדרשים של האלגוריתם. בדרך כלל, זה לוקח 5.metric='minkowski':זהו פרמטר ברירת המחדל והוא קובע את המרחק בין הנקודות.p=2:זה שווה ערך למדד האוקלידי הסטנדרטי.
    ואז נתאים את המסווג לנתוני האימון. להלן הקוד עבורו:
 #Fitting K-NN classifier to the training set from sklearn.neighbors import KNeighborsClassifier classifier= KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2 ) classifier.fit(x_train, y_train) 

פלט: על ידי ביצוע הקוד לעיל, נקבל את הפלט כ:

 Out[10]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform') 
    חיזוי תוצאת הבדיקה:כדי לחזות את תוצאת מערך הבדיקה, ניצור א y_pred וקטור כפי שעשינו ברגרסיה לוגיסטית. להלן הקוד עבורו:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

תְפוּקָה:

הפלט עבור הקוד לעיל יהיה:

אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה
    יצירת מטריצת הבלבול:
    כעת ניצור את מטריצת הבלבול עבור מודל K-NN שלנו כדי לראות את הדיוק של המסווגן. להלן הקוד עבורו:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

בקוד לעיל, ייבאנו את הפונקציה confusion_matrix וקראנו לה באמצעות המשתנה cm.

תְפוּקָה: על ידי ביצוע הקוד לעיל, נקבל את המטריצה ​​כדלקמן:

אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

בתמונה למעלה, אנו יכולים לראות שיש 64+29= 93 תחזיות נכונות ו-3+4= 7 תחזיות שגויות, בעוד שברגרסיה לוגיסטית, היו 11 תחזיות שגויות. אז אנחנו יכולים לומר שהביצועים של המודל משתפרים על ידי שימוש באלגוריתם K-NN.

    הדמיית תוצאת מערך האימון:
    כעת, נדמיין את תוצאת ערכת האימונים עבור מודל K-NN. הקוד יישאר זהה לזה שעשינו ברגרסיה לוגיסטית, מלבד השם של הגרף. להלן הקוד עבורו:
 #Visulaizing the trianing set result from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN Algorithm (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show() 

תְפוּקָה:

על ידי ביצוע הקוד לעיל, נקבל את הגרף שלהלן:

c++ gui
אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

גרף הפלט שונה מהגרף שהתרחשנו ברגרסיה לוגיסטית. ניתן להבין זאת בנקודות הבאות:

    • כפי שאנו יכולים לראות, הגרף מציג את הנקודה האדומה והנקודות הירוקות. הנקודות הירוקות הן עבור משתנה Purchased(1) ונקודות אדומות עבור משתנה לא נרכש(0).
    • הגרף מראה גבול לא סדיר במקום להציג כל קו ישר או כל עקומה מכיוון שהוא אלגוריתם K-NN, כלומר מציאת השכן הקרוב ביותר.
    • הגרף סיווג משתמשים בקטגוריות הנכונות שכן רוב המשתמשים שלא קנו את רכב השטח נמצאים באזור האדום ומשתמשים שקנו את רכב השטח נמצאים באזור הירוק.
    • הגרף מציג תוצאה טובה אך עדיין, יש כמה נקודות ירוקות באזור האדום ונקודות אדומות באזור הירוק. אבל זה לא בעיה גדולה שכן על ידי ביצוע מודל זה נמנע מבעיות התאמת יתר.
    • מכאן שהדגם שלנו מאומן היטב.
    הדמיה של תוצאת ערכת הבדיקה:
    לאחר ההכשרה של המודל, כעת נבדוק את התוצאה על ידי הצבת מערך נתונים חדש, כלומר, מערך נתונים מבחן. הקוד נשאר זהה למעט כמה שינויים קלים: כגון x_train ו-y_train יוחלף על ידי x_test ו-y_test .
    להלן הקוד עבורו:
 #Visualizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN algorithm(Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show() 

תְפוּקָה:

אלגוריתם K-Nearest Neighbor(KNN) ללמידת מכונה

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

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