Сильно взвешенное расстояние возвращает те же результаты, что и обычное расстояние в knn с набором данных iris. - PullRequest
0 голосов
/ 09 мая 2018

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

К моему удивлению, взвешивание 2 предикторов в 100 раз больше, чем остальных 2 предикторов, генерирует идентичные прогнозы с невзвешенной моделью. Что это за довольно нелогичная находка?

Мой код следующий:

X_original = iris['data']
Y = iris['target']

sc = StandardScaler() # Defines the parameters of the Scaler

X = sc.fit_transform(X_original)  # Transforms the original data to standardized data and returns them

from sklearn.model_selection import StratifiedShuffleSplit

sss = StratifiedShuffleSplit(n_splits = 1, train_size = 0.8, test_size = 0.2)

split = sss.split(X, Y)

s = list(split)

train_index = s[0][0]

test_index = s[0][1]

X_train = X[train_index, ] 

X_test = X[test_index, ] 

Y_train = Y[train_index] 

Y_test = Y[test_index] 

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors = 6)

iris_fit = knn.fit(X_train, Y_train)  # The data can be passed as numpy arrays or pandas dataframes/series.
                                                  # All the data should be numeric
                                                  # There should be no NaNs

predictions_w1 = knn.predict(X_test)

weights = np.array([1, 1, 100, 100])
weights =weights/np.sum(weights)

knn_w = KNeighborsClassifier(n_neighbors = 6, metric='wminkowski', p=2, 
                           metric_params={'w': weights})

iris_fit_w = knn_w.fit(X_train, Y_train)  # The data can be passed as numpy arrays or pandas dataframes/series.
                                                  # All the data should be numeric
                                                  # There should be no NaNs

predictions_w100 = knn_w.predict(X_test)

(predictions_w1 != predictions_w100).sum()
0

1 Ответ

0 голосов
/ 10 мая 2018

Они не всегда одинаковы, добавьте случайное состояние в разделение теста поезда, и вы увидите, как оно меняется для разных значений.

 StratifiedShuffleSplit(n_splits = 1, train_size = 0.8, test_size = 0.2, random_state=3)

Кроме того, взвешенное расстояние Минковского с такими экстремальными весами для 3-й (длина лепестка) и 4-й (ширина лепестка) в основном дает такие же результаты, как если бы вы использовали KNN только для этих 2 объектов с невзвешенным Минковским. А поскольку они кажутся достаточно информативными, неудивительно, что вы получаете очень похожие результаты по сравнению со случаем рассмотрения всех 4 функций. Смотри картинку вики ниже

From wiki

...