По-лесно е, отколкото си мислите

Здравейте читатели!

Като завършил студент по бизнес анализи, бях зает с курсова работа, изследвания и задачи. Въпреки това, след кратка пауза, се радвам да се върна към писането за анализи и машинно обучение.

В момента вземам курс по „Машинно обучение“, където моят професор ни научи за алгоритъма K-Nearest Neighbors. По време на урока той ни предизвика да кодираме алгоритъма от нулата. Това ми предостави чудесна възможност за нова тема за публикация в блога.

Алгоритъмът

K-най-близкият съсед е тривиален алгоритъм за прилагане от нулата. Красотата му е в неговата простота.

Ето една проста реализация, която ще се опитам да възпроизведа с помощта на Python:

  1. За всяко ново наблюдение ние изчисляваме показателя за разстояние между него и данните за обучение и ги съхраняваме в структура от данни.
  2. В зависимост от броя на съседите (или k), които потребителят предоставя, намираме горните най-близки наблюдения в данните за обучение до новото наблюдение.
  3. Ако това е регресионен проблем, нашият прогнозиран отговор е средната стойност на k съседите. Ако това е проблем с класификацията, нашият прогнозиран отговор е мнозинството от k съседи.

Въпреки че на този етап алгоритъмът изглежда завършен, има определени избори и компромиси, които трябва да направим, които ще обсъдя по-нататък.

Изборът

Сблъсък на етикети в логиката на мажоритарния вот

За проблеми с класификацията понякога може да получим резултати, при които повече от един етикет допринася за логиката на гласуване на мнозинството. В такъв случай има начини да изберете уникален етикет като крайна прогноза.

Например, да кажем, че сме обучили класификатора на k-най-близките съседи да предсказва цвета на пиксел. Тук избираме k като 5. Следователно прогнозираните отговори от нашите съседи са съответно Синьо, Синьо, Червено, ЧервеноиЗелено.

Два етикета предсказват синьо, а два предсказват червено. Трябва да намерим начин да опростим този резултат до един резултат.

Можем да изберем следните методи:

  • Случаен избор:Тук просто избираме на случаен принцип един от резултатите. Това е просто, но може да не е последователно.
  • Претеглени етикети по разстояние:Тук просто избираме етикета с по-малко средно разстояние или по-голямо средно сходство.
  • Намаляването на k, докато само един етикет е отчетливият резултат:Тук ние по същество намаляваме броя на съседите, докато един отделен етикет е прогнозираният отговор на мнозинството.

За да опростя тази публикация в блога, ще се придържам към изпълнението на Mode по подразбиране на SciPy.

Метрика за разстояние

Изборът на метрика за разстояние може да бъде полезен при разглеждане на типа данни. Всеки от тях обаче има своите плюсове и минуси. Някои общи показатели за разстояние, използвани в алгоритъма за k-най-близки съседи, включват:

  • Евклидово разстояние: Евклидовото разстояние изчислява разстоянието между две наблюдения в евклидовото пространство. Изчислява се чрез вземане на корен квадратен от сумата на квадратите на разликите между две наблюдения.
  • Разстояние Манхатън: Това разстояние Манхатън изчислява сумата от абсолютните разлики между две наблюдения. Често е полезно, когато функциите са категорични или когато нашите данни имат голям брой измерения.
  • Косинусово сходство: Косинусното сходство се изчислява от косинуса на ъгъла между два вектора. Често се използва, когато данните са оскъдни, като рецензии на филми, текстови документи и данни за пазарни транзакции, или когато величината на векторите не е от съществено значение.
  • Сходство на Gower:Този показател за разстоянието изчислява сходството между две наблюдения, които са смесени или когато характеристиките са категорични. Той прави това чрез прилагане на различен показател за сходство в зависимост от типа характеристика, върху която изчислява сходството. Когато функцията е числова, тя използва вариант на разстоянието Манхатън. Когато функцията е категорична, тя използва мерки като коефициент на Jaccard или Dice.

За простота в този блог ще прилагам само евклидово разстояние.

Регресия/Класификационна функция

Методът за прогнозиране на класове в класификационен проблем е както следва:

По същия начин, тук е методът за прогнозиране на непрекъсната променлива:

Както можете да видите, двете функции са много сходни. Единствената разлика между двете е, че за класификация използваме режим, докато за регресия използваме средната стойност.

Функцията np.linalg.norm изчислява евклидовото разстояние на всяка точка от данни в нашите тренировъчни данни от всяка точка от данни в нашите тестови данни.

Функцията np.argsort сортира нашия масив и връща сортираните индекси.

Накрая изчисляваме нашия прогнозиран клас/стойност и връщаме масива.

Това е всичко, което трябва да създадете проста реализация на K-най-близките съседи!

Резултати

За резултати сравняваме нашата наивна реализация с текущата най-съвременна реализация на KNN на sci-kit-learn.

Ето ги и тях:

Както можете да видите, нашият модел отговаря на производителността на текущото състояние на техниката!

Разбира се, различни показатели за разстояние и фини разлики в изпълнението ще променят резултатите.

Освен това, както всеки друг алгоритъм, KNN има свой собствен набор от предизвикателства, които могат да повлияят на неговата ефективност, като например:

  • Брой размери
  • Мащабът на данните и отклоненията
  • Избрана стойност на „k“.
  • Небалансирани данни при проблеми с класификацията

Заключение

В обобщение, KNN е прост, но мощен алгоритъм, но има свой собствен набор от предизвикателства, които трябва да бъдат адресирани, за да се гарантират точни прогнози.

Надявам се, че този блог ви е харесал!

Моля, не се колебайте да разгледате някои от другите ми публикации в блога на Medium и да се свържете с мен в LinkedIn. Не забравяйте да оставите бележка!

До следващия път! ✋🏽

👉 Връзка към GitHub repo

Препратки:

👉 https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors

👉 https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm