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

Шаги:

  1. Понимание метрик расстояния
  2. Кодирование
  3. Стратегии поиска лучшего K-Value (pssst, используйте gridsearch!)
  4. Как оценить эффективность вашей классификации: Точность, отзывчивость, точность, F1-рейтинг.

Эти «близкие точки», о которых я упоминал ранее, существуют в математической плоскости. К сожалению, их становится слишком сложно визуализировать, если у вас более двух или трех функций. На этом этапе расстояние между точками прогнозных данных и точками тренировочных данных математически рассчитывается с использованием метрик расстояния, таких как Манхэттенское расстояние, Евклидово расстояние и Расстояние Минковского. Специалисты по анализу данных, скорее всего, будут работать с евклидовыми и манхэттенскими расстояниями, редко работая с Минковски.

Метрики расстояния

«Расстояние помогает нам количественно оценить сходство»

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

Расстояние до Манхэттена

Лучший способ понять, как работает расстояние до Манхэттена, - это представить карту улиц Манхэттена. Улицы Манхэттена представляют собой сетку, поэтому, если вы едете в машине на Манхэттене, вы выберете самый быстрый путь к месту назначения, объезжая городские кварталы. Вы движетесь по сетке, и каждый блок представляет собой единицу длины. Сложите это, и вы получите расстояние до Манхэттена. Примерно так работает расстояние до Манхэттена! Визуализация ниже должна помочь понять эту метрику расстояния.

Математическая формула для расчета манхэттенского расстояния между двумя точками приведена ниже. Но, конечно, scikit-learn делает расчеты за вас, облегчая вашу работу.

Евклидово расстояние

А теперь представьте, что вы находитесь на оживленных улицах Манхэттена, где нелепое движение и город в тупике. Вам дана возможность летать, так что вы можете перемещаться по зданиям и городским кварталам, теперь у вас есть прямой путь к месту назначения. На диаграмме выше ваш самый быстрый путь - это зеленый путь, чтобы добраться до места назначения. Этот зеленый путь - евклидово расстояние. Евклидов - это прямой путь из точки А в точку Б. Математическая формула приведена ниже. Для двумерных расстояний формула может быть вам знакома, поскольку по сути это теорема Пифагора.

Минковский Расстояние

Математическая формула для расчета расстояния Миновски приведена ниже. Поскольку специалисты по анализу данных на самом деле не касаются расстояния Минковского, я не буду исследовать его так, как Манхэттен и Евклидово расстояние. Полезно знать, что расстояния Евклида и Манхэттена являются частными случаями расстояний Минковского. Буква «c» на расстоянии Минковского ниже указывает на евклидово и манхэттенское расстояния как на особые случаи. Расстояние Минковского, где «c» равно 1, равно формуле Манхэттенского расстояния I, указанной выше. Расстояние Минковского, где «c» равно 2, равно евклидову расстоянию.

Вот код, который я реализовал в наборе данных!

В качестве меры предосторожности может быть «лучший» алгоритм классификации по K-ближайшему соседу. Цель этого примера - предоставить код для выполнения модели K-Nearest Neighbor для всех, кто пытается запустить модель KNN в первый раз.

import pandas as pd
import numpy as np
#convert csv to data frame
df = pd.read_csv('glass.csv')
#created first dataframe for train_test_split, containing relevent features
df1 = df.drop(columns=['Type', 'RI'])
#DataFrame / Series containing my output Types
df2 = df['Type'].to_frame()
# import and run train test split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df1, df2, test_size = 0.2)

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

from sklearn.preprocessing import StandardScaler
#Instantiate the scaler
scaler = StandardScaler()
#scaled train data, followed by scaled test data as arrays
scaled_data_train = scaler.fit_transform(X_train)
scaled_data_test = scaler.transform(X_test)
#convert the trained data array to dataframe with columns from df1
scaled_df_train = pd.DataFrame(scaled_data_train, columns=df1.columns)
scaled_df_train.head()

На этом этапе это просто создание экземпляра классификатора KNN, запускающего ваши масштабированные (или немасштабированные) данные через классификатор.

from sklearn.neighbors import KNeighborsClassifier #import knn
# instantiate knn
clf = KNeighborsClassifier(n_neighbors=1)
# fit classifier into your model
clf.fit(scaled_data_train, y_train)
# When I did clf.fit over here, I created the model and trained it for future iterations
#output is an array of the predicted types of glass
test_preds = clf.predict(scaled_data_test)
#test preds will be used to analyze the model's performance
test_preds

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

from sklearn.metrics import precision_score, recall_score, accuracy_score, f1_score
def print_metrics(labels, preds):
    print("Precision Score: {}".format(precision_score(labels, preds, average = 'macro')))
    print("Recall Score: {}".format(recall_score(labels, preds, average = 'macro')))
    print("Accuracy Score: {}".format(accuracy_score(labels, preds)))
    print("F1 Score: {}".format(f1_score(labels, preds, average = 'macro')))
    
print_metrics(y_test, test_preds) # comparing my actual vs predicted

Если показатели / производительность модели вас не устраивают, вы можете настроить гиперпараметры с помощью GridSearchCV.

Оптимизация гиперпараметров KNN, какое значение K лучше всего?

Значение K указывает количество ближайших соседей, которые мы хотим, чтобы наша модель использовала для классификации данной точки данных. Лучший способ сделать это - использовать GridSearchCV из sklearn.model_selection.

#create parameters for grid search to run through
grid_params = {'n_neighbors': list(range(1,15)), 
               'weights': ['uniform', 'distance'],
               'p' :[1,2]}
#instantiate grid search
gs = GridSearchCV(clf, grid_params, cv=10)
#fit the model to grid search results with optimal parameters
gs_results = gs.fit(X_train_scaled, y_train_resampled)
#the best parameters will be provided with following code
gs.best_params_
#re-instantiate initial model with new optimized parameters
clf = gs.best_estimator_
#find new test values
test_preds = clf.predict(X_test_scaled)
#evaluate performance of optimized parameters
print_metrics(test_preds, y_test)

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