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

Машинное обучение — это обширная тема, которая охватывает различные алгоритмы и концепции. Большинство из них могут быть сложными и сложными в математике, но есть определенные алгоритмы, которым довольно легко следовать, обладая базовыми математическими знаниями. Один из таких алгоритмов называется K ближайших соседей или KNN.

Для начала мы должны знать, что означает классификация и регрессия. Проблемы классификации включают задачу классификации данных по группам. Пример: классификация изображения домашнего животного как кошки, собаки или других. Проблемы регрессии включают задачу прогнозирования числового значения, обычно непрерывного значения. Пример: прогнозирование цены дома с учетом количества спален, ванных комнат и расположения собственности.

KNN — это непараметрический алгоритм, который может выполнять задачи как классификации, так и регрессии. Это один из самых простых алгоритмов благодаря легкому пониманию и прямолинейному подходу.

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

Некоторые плюсы KNN:

  1. Очень простой и легкий для понимания и реализации
  2. KNN не имеет тренировочной фазы
  3. KNN имеет только один гиперпараметр (K), поэтому его легко настроить.

Некоторые минусы KNN:

  1. Плохо с большими наборами данных, временная сложность сильно возрастает.
  2. KNN чувствителен к выбросам данных
  3. KNN также не очень хорош с множеством функций (независимых переменных), если они переданы

Прежде чем мы углубимся в работу и реализацию KNN, давайте рассмотрим математический подход к этому алгоритму.

Математика:

Чтобы найти ближайшее расстояние в KNN, чаще всего используется формула для непрерывных переменных — Евклидово расстояние, а для дискретных переменных (например, текста) можно использовать расстояние Хэмминга.

пример использования

скажем, у нас есть 2 точки в 2d плоскости.

х = (4,2) и у = (3,3).

Чтобы найти расстояние между этими двумя точками, воспользуемся формулой Евклидова расстояния.

Расстояние между точкой X и точкой Y в примере равно 1 единице.

Как это работает на практике?

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

Терминология

Здесь возраст, история болезни называются независимыми переменными (представлены X). В то время как логический ответ (Да/Нет) для риска сердечно-сосудистых заболеваний является нашей зависимой переменной (представленной Y).

Мы разделяем наш набор данных (сбор данных) на 2 половины: обучающий набор и тестовый набор. В KNN мы находим K ближайших точек данных из наших данных тестирования к данным наших обучающих данных и выбираем наиболее распространенную метку (зависимую переменную) в качестве нашего решения.

Что, если у нас ничья?

Один из способов решить эту проблему — уменьшать значение K на 1 до тех пор, пока ничья не исчезнет.

Базовая реализация Python:

Требуемые знания: Концепция Python и ООП, Basic Pandas и Numpy, Основы Sklearn.

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

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import Normalizer
import matplotlib.pyplot as plt

Шаг 2. Импорт набора данных с помощью pandas

Мы используем функцию pandas read_cv для чтения нашего набора данных.

data = pd.read_csv("datasets/heart.csv") # hearts.cv dataset inside datasets folder
data.head()

В этом наборе данных мы сосредоточимся на использовании только возраста, холестерина, АД в покое и максимальной ЧСС, которые будут нашей независимой переменной, а болезнь сердца будет нашей зависимой переменной.

data = data[["Age", "RestingBP", "Cholesterol", "MaxHR", "HeartDisease"]]
data.head()

Шаг 3. Разделение независимых (как X) и зависимых переменных (как Y)

X = data[["Age", "RestingBP", "Cholesterol", "MaxHR"]] #Independent variable
Y = data["HeartDisease"] #Dependent Variable
print(X.shape, Y.shape) #gives the size of X and Y

Шаг 4. Нормализация наших данных

Поскольку каждая из наших независимых переменных имеет разные масштабы, это может создать проблему для нашего алгоритма KNN, поскольку он чувствителен к большим различиям в числах. Чтобы решить эту проблему, мы будем нормализовать наш набор данных, чтобы привести его к значению от 0 до 1.

Norm = Normalizer() 

X_transform = Norm.fit_transform(X) #Passing our X to normalise
X_transform # output is numpy nd array

Шаг 5. Разделите наш набор данных на обучающий и тестовый

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

#train size = 0.7 says that use 70% of our dataset for training and 30% for testing
X_train, X_test, y_train, y_test = train_test_split(X_transform, Y, train_size=0.7)

Шаг 6. Создание объекта KNN и использование алгоритма

Мы создаем объект KNN, функция .fit(X_train, y_train) помогает сохранить наш тренировочный набор в памяти. Функция .predict(X_test) классифицирует все данные в X_test либо на 1, либо на 0, где 1 означает риск сердечно-сосудистых заболеваний, а 0 означает отсутствие заболевания.

KNN = KNeighborsClassifier(n_neighbors= 3) # here K = 3, means we take 3 closest points and do majority voting
KNN.fit(X_train, y_train)
KNN.predict(X_test)

Шаг 7. Оценка нашего алгоритма

Чтобы узнать, насколько хорош наш алгоритм, нам нужно найти его точность для тестовых данных, для этого используйте функцию .score(X_test, y_test), которая находит процентное соотношение количества раз, когда мы получили его правильно, сравнивая его с фактическим результатом.

KNN.score(X_test, y_test)

Заключение

Теперь эта модель/алгоритм, который мы сделали, не годится для практического использования. Для медицины точность очень важна, так как мы рискуем поставить неправильный диагноз. Для улучшения модели существуют различные методы, включая визуализацию данных для поиска корреляций, проектирование признаков, методы перекрестной проверки, настройку гиперпараметров, ансамблевые методы, улучшенные алгоритмы в параметрическом подходе. Но мы можем сказать, что требования к точности модели зависят от того, в каком приложении вы работаете. Оценка модели действительно важна. Лучших моделей не бывает, но улучшения всегда будут. Иногда простейший алгоритм дает вам лучшую производительность/время. В нашей следующей статье мы рассмотрим контролируемое и неконтролируемое обучение. Продолжайте учиться и удачного кодирования :)