Метод ближайшего соседа возвращает разные выходные данные для разных размеров выборки - PullRequest
0 голосов
/ 06 мая 2020

Я построил модель NearestNeighbor с помощью Scikit-learn . Кластеры кажутся прекрасными, если получить кластеры методом колен сразу после подбора модели.

    model = NearestNeighbors(n_jobs=-1, n_neighbors=5).fit(np.array(df))
    distance, indices = model.kneighbors(np.array(df))  ## one of the distances is always 0, as expected. And clusters are acceptable.

Но когда я сохраняю модель, а затем читаю данные поезда, выходы неприемлемы.

     model = pickle.load(f)
     distance, indices = model.kneighbors(np.array(df))  ## same dataset, average/bad results. None of distances are 0.

И, самая большая проблема, индексы и расстояния меняются в зависимости от размера df.

      model = pickle.load(f)
      df_1 = df[df["id"] == "1"] # Trying for just one user
      distance, indices = model.kneighbors(np.array(df_1))  ## one row, same output for every user.
      df_2 = df[df["id"] == "2"]
      distance, indices = model.kneighbors(np.array(df_2)) ## same output

      df = df[df["id"] == "2" | df["id"] == "1"]
      distance, indices = model.kneighbors(np.array(df)) ## different output for both

Набор данных для обучения / тестирования выглядит следующим образом

feature1 | feature2 | feature3
   0          1          1
   1          1          1
   0          0          0

Почему мы обучаем и сохраняем модель, если ее нельзя использовать после с другим набором данных? Это ожидаемое поведение модели или мне что-то не хватает?

1 Ответ

0 голосов
/ 07 мая 2020

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

Я читал документы тысячу раз, а потом заметил, что они используют np.array, но не DataFrame. Ну, я использовал Dataframe для предсказания и рандомизацию столбцов. Итак, он работал некорректно.

Если у вас возникла такая проблема, будьте осторожны с numpy индексами!

...