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

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

Понимание алгоритма k-ближайших соседей

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

import numpy as np
from collections import Counter

class KNN:
    def __init__(self, k=3):
        self.k = k
    
    def fit(self, X, y):
        self.X_train = X
        self.y_train = y
    
    def euclidean_distance(self, x1, x2):
        return np.sqrt(np.sum((x1 - x2)**2))
    
    def predict(self, X):
        y_pred = [self._predict(x) for x in X]
        return np.array(y_pred)
    
    def _predict(self, x):
        # Calculate distances between x and all examples in the training set
        distances = [self.euclidean_distance(x, x_train) for x_train in self.X_train]
        
        # Sort by distance and return indices of the first k neighbors
        k_indices = np.argsort(distances)[:self.k]
        
        # Extract the labels of the k nearest neighbor samples
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        
        # Return the most common class label
        most_common = Counter(k_nearest_labels).most_common(1)
        return most_common[0][0]

Шаг 1: Предварительная обработка данных

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

Шаг 2: Расчет расстояния

Суть алгоритма kNN заключается в измерении сходства между точками данных с использованием метрики расстояния. Наиболее распространенной используемой метрикой расстояния является евклидово расстояние, хотя другие метрики, такие как манхэттенское расстояние или косинусное сходство, могут использоваться в зависимости от рассматриваемой проблемы.

Шаг 3: Определение ближайших соседей

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

Шаг 4: Делаем прогнозы

После определения k ближайших соседей класс большинства (для классификации) или среднее их целевых значений (для регрессии) используется для прогнозирования немаркированной точки данных. В случае классификации неотмеченной точке присваивается класс с наибольшей частотой среди соседей.

Шаг 5: Оценка модели

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

# Generate random training data
np.random.seed(123)
X_train = np.random.rand(1000, 2)
y_train = np.random.choice([0, 1], size=1000)

# Generate random test data
X_test = np.random.rand(200, 2)
y_test = np.random.choice([0, 1], size=200)

knn = KNN(k=5)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)

print("Predicted labels:", predictions)
print("True labels:", y_test)

мы генерируем больший набор случайных данных для обучения и тестирования. Набор обучающих данных состоит из 1000 образцов, а набор тестовых данных состоит из 200 образцов, оба с двумя функциями.

Метки случайным образом назначаются обучающим и тестовым данным с использованием np.random.choice. Мы создаем экземпляр класса KNN с k=5 и подгоняем модель, используя обучающие данные.

Затем мы делаем прогнозы на тестовых данных, используя метод predict, и сохраняем предсказанные метки в переменной predictions.

Наконец, мы печатаем предсказанные метки и истинные метки для сравнения.

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

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

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

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

Приятного изучения!