طبقه بند K نزدیکترین همسایه در scikit-learn

مسائل machine learning  به سه دسته تقسم می شوند:

1.supervised

2.unsupervised

3.enforcement learning

اکنون به دسته ی اول یعنی supervised learning میپردازیم.

The k-Nearest Neighbor Classifier

این الگوریتم از دسته الگوریتم های supervised learning  است. که آن را با چند مثال بررسی خواهیم کرد.

مثال اول:  در اینجا تعدادی feature برای تعدادی از گل ها مشخص کرده ا یم. اندازه ی گلبرگ ها و روشنایی گلبرگ ها.با توجه به مقادیری از feature ها که هر گل دارد، و label  های آن، مکان آن در نمودار مشخص می شود.

اگر بخواهیم بگوییم عکس جدیدی که    label آن را نداشته ایم در کدام دسته از گل ها قرار میگیرد(یعنی در واقع بخواهیم کلاس آن را تعیین کنیم.)، طبق الگوریتم nearest neighbor به صورت زیر میکنیم:

فاصله عکس جدید را با تمام training dataset ها محاسبه میکنیم تا ببنیم به کدام یک نزدیک تر است. و label عکس جدید همان label  نزدیک ترین data خواهد بود.

مثال دوم: در اینجا سه کلاس مختلف و دو feature داریم. و برای تعیین کلاس داده جدید مانند مثال قبل عمل خواهیم کرد.

1-nearest neighbor

در این الگوریتم label داده جدید، همان label نزدیک ترین داده به آن خواهد شد و در آن کلاس قرار خواهد گرفت. مشکل این الگوریتم این است که اگر در داده ها noise داشته باشیم، الگوریتم به درستی عمل نمیکند کرد.و داده ها را در کلاس اشتباه قرار میدهد.

k-nearest neighbor

برای رفع مشکل ذکر شده از این الگوریتم استفاده می شود. که در آن به جای یک همسایه، چند همسایه در نظر گرفته می شوند. K تعداد همسایه ها را مشخص می کند و hyper parameter است. که در فرایند training مشخص نمی شود.

انتخاب مقدار k به مسئله بستگی دارد. و باید مقادیر مختلف آن را برای test data بررسی کرد. اما اگر مقدار آن را بر اساس test data تعیین کنیم، مشکلی که به وجود می آید این است که ممکن است این مقدار فقط روی داده هایی که داریم عملکرد خوبی داشته باشد. و روی داده های جدید به خوبی عمل نکند.

برای مثال در اینجا از این الگوریتم با 3 همسایه استفاده شده است.

از مشکلات این الگوریتم این است که اگر تعدادdata ها زیاد باشد، تعداد مقایسه ها بالا رفته و الگوریتم زمان بر می شود.

روشی که برای بهبود این مشکل وجود دارد استفاده ازVoronoi diagram است. که برای هر کلاس ناحیه ای مشخص شده است. و هنگام مشاهده داده جدید، با توجه به ناحیه ای که در آن قرار دارد، کلاس آن مشخص می شود.

حال وارد بخش عملی ابن الگوریتم میشویم. در اینجا از سه کتابخانه استفاده می کنیم:

1.scipy : برای لود کردن فایل مطلب استفاده می شود.

2.matplotlib : برای کشیدن نمودار استفاده می شود.

3.scikit-learn: کتابخانه ای برای machine learning است و بیشتر در machine learning  سنتی و کلاسیک کاربرد دارد.

میتوانید به جای pip از کلمه ی conda استفاده کنید. (اگر از آناکوندا استفاده میکنید.)

ابتدا package  ها و function های مورد نیاز را import  میکنیم.

 

Load_hoda : تابعی است که قبلا نوشته بودیم. که یک tuple شامل 1000 عدد training data و 200 عدد test data  بر می گرداند.

ایجاد طبقه بند k-nn

در کتابخانه scikit-learn طبقه بند به این شکل ایجاد می شود.

عدد 3 در اینجا همان k است.

و از تابع fit برای ذخیره دیتا های  train استفاده شده است.

پیش بینی داده های آموزشی

متغیر: sample را برای مشخص کردن اولین خانه تعریف می کنیم.

طبق کد X یک لیست شامل یک خانه است که آن خانه لیستی شامل 25 خانه (یک عکس از 200 دیتای  test) است.

 : Predicted_classهمان کلاس تشخیص داده شده برای داده است.

Actual_class : کلاسی است که واقعا داده به آن تعلق دارد. که از روی y_test  که همان label ها هستند تشخیص داده می شود.

در اینجا به تابع predict یک vector 25 تایی دادیم، و در قسمت fit 1000 تا vector 25 تایی. یکvector اول با 1000 vector دوم مقایسه شده و فاصله ها محاسبه می شود. با داشتن label  هر 1000 vector آن ها را sort می کند. و نزدیک ترین ها را پیدا می کند. و با بررسی سه  تا از نزدیک ترین ها، label داده را پیدا می کند.

Predict probability

تابع predict_proba درصد احتمال تعلق x تعریف شده به هرکدام از کلاس ها را بر می گرداند. که در اینجا با k=3 سه حالت اتفاق می افتد. (1، 0.6، 0.3)

پیش بینی چندین داده آزمون

Pred_classes: همه ی 200 داده مربوط به test data است.

True_classes: همه ی کلاس های واقعی را شامل می شود.

ارزیابی

با استفاده از تابع آماده score می توانیم میزان performance را محاسبه کنیم. همانطور که مشاهده می شود performance  برابر با 96 درصد است. یعنی از 200 داده، 8 تای آن اشتباه تشخیص داده شده است.