Почему мой алгоритм KNN, созданный с нуля, не работает? - PullRequest
0 голосов
/ 02 июля 2018

Я пытался создать алгоритм KNN с нуля. Мой набор данных - это DataFrame для панд. Алгоритм всегда возвращает 1,0 (прогнозы всегда идеально соответствуют фактическому результату), и я беспокоюсь, что что-то не так, хотя я не знаю, что. Любая помощь в определении очень ценится.

Вот мой код:

def get_neighbors(train,row,n):
      distances=list()
      for i in range(len(test)):
        dist=euclidean_distance(row,train.iloc[i])
        distances.append((row,dist))
      distances.sort(key=lambda tup: tup[1])
      neighbors=list()
      for i in range(n):
        neighbors.append(distances[i][0])
      return neighbors

def predict_classification(train,row,n):
  neighbors=get_neighbors(train,row, n)
  output_values=[row.iloc[-1]for row in neighbors]
  prediction=max(set(output_values),key=output_values.count)
  return prediction
import math

def euclidean_distance(row1,row2):
  distance = 0.0
  for i in range((row1.shape[0])):
    distance+=(row1[i] -row2[i]) ** 2
  return math.sqrt(distance)

def k_nearest_neighbors(train,test,n):
  predictions=list()
  for i in range(len(test)):
    output=predict_classification(train,test.iloc[i],n)
    predictions.append(output)
  return(predictions)


train=dataset.iloc[0:500]
test=dataset.iloc[500:600]
df=po.DataFrame()
df["Actual"]=test["Outcome"]
df["Predicted"]=k_nearest_neighbors(train,test,5)

1 Ответ

0 голосов
/ 02 июля 2018

Я не проверил ваш код полностью, но у вас есть несколько проблем здесь. Вот некоторые из них:

  1. Вы не используете ярлыки. Из вашего кода можно заподозрить, что последний столбец - это метки, но тогда вы не должны использовать их для расчета расстояний, например, здесь: dist=euclidean_distance(row,train.iloc[i])
  2. Вы добавляете здесь тот же образец: distances.append((row,dist)) не то, что вы хотите. Добавить строку тренировочного набора (хотя и не очень эффективно)
  3. Поскольку у вас нет никаких ярлыков здесь, это неправильно: output_values=[row.iloc[-1]for row in neighbors]
  4. Вопросы эффективности. Почему ты работаешь с пандами? Используйте NumPy для вашей реальной работы и передайте ее пандам, когда закончите.
  5. Вы используете слишком много функций для выполнения вашей классификации. Просто итерируйте свои тренировочные данные, вычисляя расстояния. Получите индексы (не фактические выборки) обнаруженных n соседей и после голосования сравните их с вашей основной правдой. Вам не нужно сохранять фактические сэмплы где-то (как вы).
...