Пришло время отдернуть эту метафорическую завесу и раскрыть секреты алгоритма 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 с нуля, мы получили бесценную информацию и получили возможность настраивать и настраивать модель в соответствии с нашими уникальными потребностями.
Итак, продолжайте расширять границы своих знаний, и пусть магия машинного обучения приведет вас к новым захватывающим открытиям. И кто знает, возможно, вы обнаружите свое собственное мифическое существо — революционную модель искусственного интеллекта, которая изменит мир!
Приятного изучения!