Давайте сначала определим, что такое K
?
K
- это число избирателей , которое алгоритм использует для принятия решения о к какому классу данная точка данных принадлежит .
Другими словами, он использует K
для определения границ каждого класса.Эти границы будут отделять каждый класс от другого.
Соответственно, граница становится более гладкой с увеличением значения K
.
Итак, если говорить логически, если мы увеличим K
до бесконечность , он, наконец, станет всеми точками любого класса в зависимости от общего числа большинство !.Однако это привело бы к тому, что называется High Bias (т.е. недостаточное соответствие).
В отличие от этого, если мы сделаем K
равным только 1 , то ошибкавсегда будет ноль для обучающего образца .Это потому, что самая близкая точка к любой точке данных обучения - сама.Тем не менее, в конечном итоге мы перегрузим границы (т.е. высокую дисперсию), поэтому не сможет обобщить для любых новых и невидимых данных!.
* 1048К сожалению,
нет эмпирическое правило.Выбор
K
определяется как конечным приложением, так и набором данных.
Предлагаемое решение
Использование GridSearchCV , которое выполняет исчерпывающий поиск по указанным значениям параметров для оценки. Поэтому мы используем его, чтобы попытаться найтилучшее значение K
.
Для меня я не превышаю класс max по количеству элементов в каждом классе, когда я хочу установить максимальный порог K
, и он имеетне подводите меня пока ( посмотрите пример позже, чтобы понять, о чем я говорю )
Пример:
import numpy as np
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X, y = iris.data, iris.target
# get the max class with respect to the number of elements
max_class = np.max(np.bincount(y))
# you can add other parameters after doing your homework research
# for example, you can add 'algorithm' : ['auto', 'ball_tree', 'kd_tree', 'brute']
grid_param = {'n_neighbors': range(1, max_class)}
model = KNeighborsClassifier()
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=2)
clf = GridSearchCV(model, grid_param, cv=cv, scoring='accuracy')
clf.fit(X, y)
print("Best Estimator: \n{}\n".format(clf.best_estimator_))
print("Best Parameters: \n{}\n".format(clf.best_params_))
print("Best Score: \n{}\n".format(clf.best_score_))
Результат
Best Estimator:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=17, p=2,
weights='uniform')
Best Parameters:
{'n_neighbors': 17}
Best Score:
0.98
Обновление, касающееся RepeatedStratifiedKFold
Проще говоря, это KFold
, то есть повторяется более n_repeats
раз, Почему ?Потому что это может снизить смещение и дать вам лучшую оценку с точки зрения статистики.
Также это Stratified
, то есть он стремится обеспечить, чтобы каждый класс был приблизительно , одинаково представленным в каждом тестовом сгибе(т.е. каждый сгиб представляет все страт данных ).