Теория K-ближайших соседей и реализация с помощью Scikit-Learn

В статистике k-алгоритм ближайшего соседа (k-NN) является непараметрическим Метод классификации, впервые разработанный Эвелин Фикс и Джозефом Ходжесом в 1951 году и позже расширенный Томасом Кавером. Используется для классификации и регрессии. В обоих случаях вход состоит из k ближайших обучающих примеров в наборе данных. Результат зависит от того, используется ли k-NN для классификации или регрессии:

  • В классификации k-NN результатом является принадлежность к классу. Объект классифицируется по множеству голосов его соседей, при этом объект присваивается классу, наиболее распространенному среди его k ближайших соседей (k — положительное целое число, обычно небольшой). Если k = 1, то объект просто присваивается классу этого единственного ближайшего соседа.
  • В регрессии k-NN результатом является значение свойства объекта. Это значение является средним значением k ближайших соседей.

Недостатки

  • Неэффективен для больших данных
  • Проклятие размерности.
  • Очень подвержен переоснащению

Шаги:

  • Выберите количество k
  • Выберите показатель расстояния
  • Найдите k ближайших соседей выборки
  • Назначить метку класса большинством голосов

Делаем прогнозы с KNN

KNN делает прогнозы, используя набор обучающих данных напрямую. Прогнозы делаются для нового экземпляра (x) путем поиска во всей обучающей выборке K наиболее похожих экземпляров. экземпляров (соседей) и суммирования выходной переменной для этих K экземпляров.

Чтобы определить, какие из экземпляров K в обучающем наборе данных наиболее похожи на новые входные данные, используется мера расстояния.

Лучшая подготовка данных для KNN

  • Изменение масштаба данных. KNN работает намного лучше, если все данные имеют одинаковый масштаб. Нормализация ваших данных в диапазоне [0, 1] — хорошая идея. Также может быть хорошей идеей стандартизировать ваши данные, если они имеют распределение Гаусса.
  • Адрес отсутствующих данных. Отсутствующие данные означают, что расстояние между образцами не может быть рассчитано. Эти выборки могут быть исключены, или отсутствующие значения могут быть вменены.
  • Меньшая размерность. KNN подходит для данных меньшего размера. Вы можете попробовать его на многомерных данных (сотни или тысячи входных переменных), но имейте в виду, что он может работать не так хорошо, как другие методы. KNN может извлечь выгоду из выбора признаков, который уменьшает размерность входного пространства признаков.

Получить данные

Исследовательский анализ данных (EDA)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 777 entries, 0 to 776
Data columns (total 18 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   private      777 non-null    object 
 1   apps         777 non-null    int64  
 2   accept       777 non-null    int64  
 3   enroll       777 non-null    int64  
 4   top10perc    777 non-null    int64  
 5   top25perc    777 non-null    int64  
 6   f_undergrad  777 non-null    int64  
 7   p_undergrad  777 non-null    int64  
 8   outstate     777 non-null    int64  
 9   room_board   777 non-null    int64  
 10  books        777 non-null    int64  
 11  personal     777 non-null    int64  
 12  phd          777 non-null    int64  
 13  terminal     777 non-null    int64  
 14  s_f_ratio    777 non-null    float64
 15  perc_alumni  777 non-null    int64  
 16  expend       777 non-null    int64  
 17  grad_rate    777 non-null    int64  
dtypes: float64(1), int64(16), object(1)
memory usage: 109.4+ KB
private        0
apps           0
accept         0
enroll         0
top10perc      0
top25perc      0
f_undergrad    0
p_undergrad    0
outstate       0
room_board     0
books          0
personal       0
phd            0
terminal       0
s_f_ratio      0
perc_alumni    0
expend         0
grad_rate      0
dtype: int64

Обратите внимание, что есть частная школа с процентом выпускников выше 100%. Как называется эта школа?

Установите процент выпускников этой школы на 100, чтобы это имело смысл. Вы можете получить предупреждение, а не ошибку) при выполнении этой операции, поэтому используйте операции DataFrame или просто повторите визуализацию гистограммы, чтобы убедиться, что она прошла.

Сплит-тест поезда

Yes    565
No     212
Name: private, dtype: int64

Стандартизируйте переменные

Прогнозы и оценки

Давайте оценим нашу модель KNN!

TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[148   0]
 [ 19 376]]
ACCURACY SCORE:
0.9650
CLASSIFICATION REPORT:
              No    Yes  accuracy  macro avg  weighted avg
precision 0.8862    1.0     0.965     0.9431         0.969
recall       1.0 0.9519     0.965     0.9759         0.965
f1-score  0.9397 0.9754     0.965     0.9575        0.9656
support    148.0  395.0     0.965      543.0         543.0
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[ 55   9]
 [ 21 149]]
ACCURACY SCORE:
0.8718
CLASSIFICATION REPORT:
              No    Yes  accuracy  macro avg  weighted avg
precision 0.7237  0.943    0.8718     0.8334         0.883
recall    0.8594 0.8765    0.8718     0.8679        0.8718
f1-score  0.7857 0.9085    0.8718     0.8471        0.8749
support     64.0  170.0    0.8718      234.0         234.0

Выбор значения K

Давайте продолжим и используем метод локтя, чтобы выбрать хорошее значение K!

Создайте цикл for, который обучает различные модели KNN с разными значениями k, а затем отслеживайте error_rate для каждой из этих моделей с помощью списка.

Теперь создайте следующий график, используя информацию из цикла for.

Повторное обучение с новым значением K

Переобучите свою модель с лучшим значением K (вы сами решаете, что вам нужно) и повторно сделайте отчет о классификации и матрицу путаницы.

TRAINIG RESULTS: 
===============================
CONFUSION MATRIX:
[[127  21]
 [  8 387]]
ACCURACY SCORE:
0.9466
CLASSIFICATION REPORT:
              No    Yes  accuracy  macro avg  weighted avg
precision 0.9407 0.9485    0.9466     0.9446        0.9464
recall    0.8581 0.9797    0.9466     0.9189        0.9466
f1-score  0.8975 0.9639    0.9466     0.9307        0.9458
support    148.0  395.0    0.9466      543.0         543.0
TESTING RESULTS: 
===============================
CONFUSION MATRIX:
[[ 54  10]
 [  7 163]]
ACCURACY SCORE:
0.9274
CLASSIFICATION REPORT:
              No    Yes  accuracy  macro avg  weighted avg
precision 0.8852 0.9422    0.9274     0.9137        0.9266
recall    0.8438 0.9588    0.9274     0.9013        0.9274
f1-score   0.864 0.9504    0.9274     0.9072        0.9268
support     64.0  170.0    0.9274      234.0         234.0

Краткое содержание

В этом посте вы открыли для себя алгоритм машинного обучения KNN. Вы узнали, что:

  • KNN хранит весь набор обучающих данных, который он использует в качестве своего представления.
  • KNN не изучает никакую модель.
  • KNN делает прогнозы вовремя, вычисляя сходство между входной выборкой и каждым обучающим экземпляром.
  • Существует множество мер расстояния, из которых можно выбрать, чтобы они соответствовали структуре ваших входных данных.
  • Что при использовании KNN рекомендуется изменить масштаб ваших данных, например, с помощью нормализации.
  • Если у вас есть какие-либо вопросы об этом посте или алгоритме KNN, задавайте их в комментариях, и я сделаю все возможное, чтобы ответить.