KNN - это контролируемый обучающийся алгоритм классификации и регрессии, который использует близлежащие точки для создания прогноза. Я коснусь некоторых основных, но важных концепций, которые нужно понять о моделях KNN. Позже я приведу пример модели KNN, которую я тестировал.
Шаги:
- Понимание метрик расстояния
- Кодирование
- Стратегии поиска лучшего K-Value (pssst, используйте gridsearch!)
- Как оценить эффективность вашей классификации: Точность, отзывчивость, точность, 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.