Пошаговое руководство по K-Nearest Neighbours (KNN) и его реализации на Python

Алгоритм K-ближайших соседей

K-Nearest Neighbours (KNN) - это модель, которая классифицирует точки данных на основе точек, наиболее похожих на них. Он использует тестовые данные, чтобы сделать «обоснованное предположение» о том, как неклассифицированную точку следует отнести к категории ».

Реализация KNN Python

Мы будем строить нашу модель KNN, используя самый популярный пакет машинного обучения python scikit-learn. Scikit-learn предоставляет специалистам по данным различные инструменты для выполнения задач машинного обучения. Для нашей модели KNN мы собираемся использовать алгоритм ‘KNeighborsClassifier’, который легко доступен в пакете scikit-learn. Наконец, мы оценим наши прогнозы модели KNN с помощью функции «оценка точности» в scikit-learn. Давай сделаем это!

Шаг 1. Импорт необходимых пакетов

Все простые или сложные задачи программирования начинаются с импорта необходимых пакетов. Чтобы построить нашу модель KNN, наши основные пакеты включают scikit-learn для построения модели, pandas для исследовательского анализа данных (EDA) и seaborn для визуализаций.

Реализация Python:

Теперь, когда мы импортировали все необходимые пакеты для обучения и построения нашей модели KNN. Следующим шагом является импорт данных и выполнение исследовательского анализа данных.

Шаг 2: Импорт набора данных и EDA

В этой статье мы собираемся использовать набор данных iris, предоставленный пакетом seaborn. Давайте импортируем данные и посмотрим на них на Python.

Реализация Python:

Выход:

     sepal_length  sepal_width  petal_length  petal_width    species
0             5.1          3.5           1.4          0.2     setosa
1             4.9          3.0           1.4          0.2     setosa
2             4.7          3.2           1.3          0.2     setosa
3             4.6          3.1           1.5          0.2     setosa
4             5.0          3.6           1.4          0.2     setosa
..            ...          ...           ...          ...        ...
145           6.7          3.0           5.2          2.3  virginica
146           6.3          2.5           5.0          1.9  virginica
147           6.5          3.0           5.2          2.0  virginica
148           6.2          3.4           5.4          2.3  virginica
149           5.9          3.0           5.1          1.8  virginica
[150 rows x 5 columns]

Теперь давайте посмотрим на статистическое представление данных с помощью функции ‘describe’, а также некоторую информацию о данных с помощью функции ‘info’ в Python.

Реализация Python:

Описание данных:

       sepal_length  sepal_width  petal_length  petal_width
count    150.000000   150.000000    150.000000   150.000000
mean       5.843333     3.057333      3.758000     1.199333
std        0.828066     0.435866      1.765298     0.762238
min        4.300000     2.000000      1.000000     0.100000
25%        5.100000     2.800000      1.600000     0.300000
50%        5.800000     3.000000      4.350000     1.300000
75%        6.400000     3.300000      5.100000     1.800000
max        7.900000     4.400000      6.900000     2.500000

Информация о данных:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   sepal_length  150 non-null    float64
 1   sepal_width   150 non-null    float64
 2   petal_length  150 non-null    float64
 3   petal_width   150 non-null    float64
 4   species       150 non-null    object 
dtypes: float64(4), object(1)
memory usage: 6.0+ KB

Получив четкое представление о наших данных, мы можем перейти к их визуализации. Мы собираемся создать четыре разных визуализации, используя наши данные с помощью seaborn и matplotlib в python.

(i) Диаграмма рассеяния

Мы собираемся создать два разных графика рассеяния: один - длина чашелистика относительно его ширины, а другой - длина лепестка относительно ширины лепестка. Давайте сделаем это на питоне!

Реализация Sepal Scatter Python:

Выход:

Реализация Python с лепестковым разбросом:

Выход:

(ii) Тепловая карта

Тепловые карты очень полезны для поиска корреляций и отношений между переменными в данных. Тепловые карты можно эффективно создавать с помощью seaborn в python.

Реализация Python:

Выход:

(iii) Матрица рассеяния

Матрица разброса - это еще один способ эффективного поиска взаимосвязей или корреляций между переменными в наборе данных. Этот сюжет также можно сделать с помощью библиотеки seaborn на Python.

Реализация Python:

Выход:

(iv) График распределения

График распределения используется для визуализации частоты указанных значений в наборе данных. Это можно сделать на питоне, используя пакет seaborn. Учитывая наш набор данных по радужке, мы собираемся построить график длины и ширины чашелистиков и лепестков, чтобы наблюдать за их распределением. Давайте сделаем это на Python!

Реализация Python:

Выход:

С помощью этой визуализации мы переходим к следующей части кодирования, которая заключается в создании и обучении нашей модели K-Nearest Neighbor с использованием scikit-learn на python.

Шаг 3: Построение и обучение модели

Во-первых, нам нужно определить переменную «X» и переменную «Y», чтобы построить нашу модель KNN. Учитывая наш набор данных, нам нужно классифицировать переменную «виды», поэтому ее можно использовать как переменную «Y» или как зависимую переменную. Все остальные переменные в нашем наборе данных можно рассматривать как независимые переменные или переменные «X». Теперь давайте определим наши переменные X и Y в Python!

Реализация Python:

Выход:

X variable : [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
Y variable : ['setosa' 'setosa' 'setosa' 'setosa' 'setosa']

Теперь нам нужно нормализовать наши значения переменной «X», которые могут быть полезны при обучении нашей модели KNN. До этого нормализация - это процесс структурирования и удаления аномалий для заданного набора значений. Это также снижает количество данных и улучшает целостность данных. Чтобы нормализовать значения, мы можем использовать функцию ‘StandardScaler’ в scikit-learn. Давайте сделаем это на Python!

Реализация Python:

Выход:

[[-0.90068117  1.01900435 -1.34022653 -1.3154443 ]
 [-1.14301691 -0.13197948 -1.34022653 -1.3154443 ]
 [-1.38535265  0.32841405 -1.39706395 -1.3154443 ]
 [-1.50652052  0.09821729 -1.2833891  -1.3154443 ]
 [-1.02184904  1.24920112 -1.34022653 -1.3154443 ]]

Теперь, когда у нас есть идеальные зависимые и независимые переменные. Теперь мы можем продолжить обучение нашей модели KNN. Чтобы обучить нашу модель, мы должны сначала разделить наши данные на обучающий набор и набор для тестирования, где обучающий набор имеет наибольшее количество точек данных. Чтобы разделить наши данные, мы можем использовать функцию ‘train_test_split’, предоставляемую scikit-learn на python.

Реализация Python:

Выход:

Train set shape : (105, 4) (105,)
Test set shape : (45, 4) (45,)

В приведенном выше коде мы использовали train_test_split, чтобы разделить наши данные на обучающий набор и набор для тестирования. Внутри функции мы указали, что наш тестовый набор должен состоять из 30% данных, а остальное - это обучающий набор. Наконец, мы упомянули, что не должно быть случайного перетасовки наших данных при разделении.

Теперь мы готовы создать наш алгоритм KNN. Давайте сделаем это на Python!

Реализация Python:

Выход:

KNeighborsClassifier(algorithm='auto',leaf_size=30,metric=minkowski,
                   metric_params=None,n_jobs=None,n_neighbors=3,p=2,
                   weights='uniform')

Во-первых, мы указали для нашего значения «K» значение 3. Затем мы определили наш алгоритм и, наконец, подогнали наши значения набора параметров к алгоритму. После распечатки алгоритма мы видим, что «metric = minkowski» - это не что иное, как указание на то, что метод, используемый для вычисления расстояния до соседей, - это метод Минковского. Существуют также другие методы, такие как метод евклидова расстояния и метод индекса Жаккара, но его нужно определять вручную.

После завершения обучения нашего алгоритма KNN, давайте предскажем тестовые значения с помощью нашего обученного алгоритма и оценим наши результаты, используя оценочные показатели scikit-learn.

Реализация Python:

Выход:

Prediction Accuracy Score (%) : 97.78

Используя наш обученный алгоритм KNN, мы предсказали значения тестового набора. Наконец, мы использовали метрику оценки «precision_score», чтобы проверить точность наших прогнозируемых результатов. В выходных данных мы видим, что результаты имеют точность 97,78%, что означает, что наша модель KNN очень хорошо работает и для данного набора данных радужной оболочки глаза, она способна решать реальные проблемы классификации. Таким образом, мы успешно построили, обучили и оценили нашу модель KNN на Python. На этом мы подошли к концу статьи.

Я надеюсь, что эта статья окажется для вас полезной, и не беспокойтесь, если вы не выполнили какую-либо часть кода, поскольку я предоставил полный исходный код для этой статьи.

Удачного машинного обучения!

Полный код: