значение k в KNeighborsClassifier - PullRequest
       18

значение k в KNeighborsClassifier

0 голосов
/ 29 сентября 2018

Я пытаюсь найти лучшее K значение для KNeighborsClassifier.

Это мой код для iris набора данных:

k_loop = np.arange(1,30)
k_scores = []
for k in k_loop:
    knn = KNeighborsClassifier(n_neighbors=k)
    cross_val = cross_val_score(knn, X, y, cv=10 , scoring='accuracy')
    k_scores.append(cross_val.mean())

Я взял среднее значение cross_val_score вкаждый цикл и построил его.

plt.style.use('fivethirtyeight')
plt.plot(k_loop, k_scores)
plt.show()

Это результат.

Line Plot

Вы можете увидеть точность выше, когда k составляет от 14 до 20.

1) Как выбрать наилучшее значение k.

2) Существуют ли другие способы расчета и поиска наилучшего значения для K?

3) Также приветствуются любые другие предложения по улучшению.Я новичок в ML

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

На основании графика я бы сказал 13.

Я предполагаю, что это классификационное задание.
в этом случае: Не не устанавливайте k как четное число.

Например, если у вас есть 2 класса A и B, и k установлено на 4.
Существует вероятность того, что новые данные (или точка)
находятся между 2 классом A и 2 классом B.
Таким образом, у вас будет 2 голоса, чтобы классифицировать новую точку данных как A
, и 2 голоса, чтобы классифицировать как B.
Установка k как нечетного числа позволяет избежать этой ситуации.

0 голосов
/ 30 сентября 2018

Давайте сначала определим, что такое 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, то есть он стремится обеспечить, чтобы каждый класс был приблизительно , одинаково представленным в каждом тестовом сгибе(т.е. каждый сгиб представляет все страт данных ).

...