Что происходит, когда мы применяем метод .fit() к модели kNN в Scikit-learn, если в kNN нет фазы обучения?

#machine-learning #scikit-learn #knn #training-data

#машинное обучение #scikit-learn #knn #обучение-данные

Вопрос:

Поскольку kNN обрабатывает как обучение, так и прогнозирование на уровне оперативной памяти и не требует явного процесса обучения, что именно происходит при подгонке модели knn? Я думал, что этот шаг связан с обучением модели. Спасибо.

Вот ошибка, которую я получу, если пропущу шаг подгонки.

 NotFittedError: This KNeighborsClassifier instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.
 

Пример кода:

 from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd

f=r"aug_train.csv"
df=pd.read_csv(f)

X=df[:90000][["training_hours", "city_development_index"]].values
y=df[:90000]["target"].values

X_train, X_test, y_train, y_test=train_test_split(X,y)

knn=KNeighborsClassifier(n_neighbors=2)
knn.fit(X_train, y_train)
    
yhat=knn.predict(X_test)
print(yhat)
 

Ответ №1:

В отличие от других алгоритмов машинного обучения, KNN не оптимизирует функцию затрат, вместо этого он запоминает обучающие данные. Когда выполняется прогноз, KNN сравнивает входные данные с данными обучения, которые он сохранил. Метка класса точки данных, которая имеет максимальное сходство с запрошенными входными данными, задается как прогноз. Следовательно, когда мы подгоняем модель KNN, она изучает или сохраняет набор данных в памяти.

Комментарии:

1. При необходимости также создается более эффективная структура данных для прогнозирования во время подгонки (см. Параметр algorithm ).

2. @BenReiniger Да, технически поиск в массиве может занять от O (n) до O (n ^ 2) времени, поэтому, чтобы сократить время, KNN строит KD-дерево, что снижает скорость до O (nlogn).

3. @BenReiniger По умолчанию scikit-learn использует ball tree(модификацию KDTree).