- K-Nearest Neighbour הוא אחד מאלגוריתמים הפשוטים ביותר של למידת מכונה המבוססת על טכניקת למידה מפוקחת.
- אלגוריתם K-NN מניח את הדמיון בין המקרה/הנתונים החדשים למקרים הזמינים ומכניס את המקרה החדש לקטגוריה הדומה ביותר לקטגוריות הזמינות.
- אלגוריתם K-NN מאחסן את כל הנתונים הזמינים ומסווג נקודת נתונים חדשה על סמך הדמיון. המשמעות היא שכאשר מופיעים נתונים חדשים, ניתן לסווג אותם בקלות לקטגוריית חבילות טובות באמצעות אלגוריתם K-NN.
- ניתן להשתמש באלגוריתם K-NN עבור רגרסיה כמו גם עבור סיווג, אך לרוב הוא משמש עבור בעיות הסיווג.
- K-NN הוא א אלגוריתם לא פרמטרי , מה שאומר שהוא לא עושה שום הנחה על הנתונים הבסיסיים.
- זה נקרא גם א אלגוריתם לומד עצלן מכיוון שהוא לא לומד ממערך ההדרכה באופן מיידי, במקום זאת הוא מאחסן את מערך הנתונים ובזמן הסיווג, הוא מבצע פעולה על מערך הנתונים.
- אלגוריתם KNN בשלב האימון פשוט מאחסן את מערך הנתונים וכאשר הוא מקבל נתונים חדשים, הוא מסווג את הנתונים הללו לקטגוריה שדומה בהרבה לנתונים החדשים.
למה אנחנו צריכים אלגוריתם K-NN?
נניח שישנן שתי קטגוריות, כלומר, קטגוריה A וקטגוריה B, ויש לנו נקודת נתונים חדשה x1, אז נקודת נתונים זו תמצא באיזו מהקטגוריות הללו. כדי לפתור בעיה מסוג זה, אנחנו צריכים אלגוריתם K-NN. בעזרת K-NN, נוכל לזהות בקלות את הקטגוריה או המחלקה של מערך נתונים מסוים. שקול את התרשים שלהלן:
איך K-NN עובד?
ניתן להסביר את פעולת K-NN על בסיס האלגוריתם שלהלן:
נניח שיש לנו נקודת נתונים חדשה ואנחנו צריכים לשים אותה בקטגוריה הנדרשת. שקול את התמונה הבאה:
סדר לפי sql אקראי
- ראשית, נבחר את מספר השכנים, אז נבחר את k=5.
- לאחר מכן, נחשב את מרחק אוקלידי בין נקודות הנתונים. המרחק האוקלידי הוא המרחק בין שתי נקודות, שכבר למדנו בגיאומטריה. ניתן לחשב אותו כך:
- על ידי חישוב המרחק האוקלידי קיבלנו את השכנים הקרובים ביותר, בתור שלושה שכנים הקרובים ביותר בקטגוריה A ושני שכנים הקרובים ביותר בקטגוריה B. שקול את התמונה הבאה:
- כפי שאנו יכולים לראות, שלושת השכנים הקרובים ביותר הם מקטגוריה 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-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-NN לנתוני האימון. לשם כך נייבא את KNeighborsClassifier כיתה של שכנים סקלארן סִפְרִיָה. לאחר ייבוא המחלקה, ניצור את מסווג מושא הכיתה. הפרמטר של מחלקה זו יהיה
#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')
#Predicting the test set result y_pred= classifier.predict(x_test)
תְפוּקָה:
הפלט עבור הקוד לעיל יהיה:
כעת ניצור את מטריצת הבלבול עבור מודל K-NN שלנו כדי לראות את הדיוק של המסווגן. להלן הקוד עבורו:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
בקוד לעיל, ייבאנו את הפונקציה confusion_matrix וקראנו לה באמצעות המשתנה cm.
תְפוּקָה: על ידי ביצוע הקוד לעיל, נקבל את המטריצה כדלקמן:
בתמונה למעלה, אנו יכולים לראות שיש 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
גרף הפלט שונה מהגרף שהתרחשנו ברגרסיה לוגיסטית. ניתן להבין זאת בנקודות הבאות:
- כפי שאנו יכולים לראות, הגרף מציג את הנקודה האדומה והנקודות הירוקות. הנקודות הירוקות הן עבור משתנה 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()
תְפוּקָה:
הגרף שלמעלה מציג את הפלט עבור מערך נתוני הבדיקה. כפי שאנו יכולים לראות בגרף, הפלט החזוי טוב מאוד שכן רוב הנקודות האדומות נמצאות באזור האדום ורוב הנקודות הירוקות נמצאות באזור הירוק.
עם זאת, יש מעט נקודות ירוקות באזור האדום וכמה נקודות אדומות באזור הירוק. אז אלו הן התצפיות השגויות שצפינו במטריצת הבלבול (7 פלט שגוי).