Python3 - TypeError: объект 'numpy.float64' не повторяется - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу построить график, который показывает ошибку ошибочной классификации по сравнению с соседями де К, используя KNN.

Это код, который я построил для этого:

# creating odd list of K for KNN
myList = list(range(1,50))

# subsetting just the odd ones
neighbors = filter(lambda x: x % 2 != 0, myList)

# empty list that will hold cv scores
cv_scores = []

# perform 10-fold cross validation
for k in neighbors:
    knn = KNN(n_neighbors=k, n_jobs = 6, metric = 'minkowski', contamination = 0.05)
    scores = cross_val_score(knn, X_test, pred, cv=10, scoring='accuracy')
    cv_scores.append(scores.mean())

### Create Plot
import matplotlib.pyplot as plt
plt.style.use('ggplot')

# changing to misclassification error
MSE = [1 - x for x in cv_scores]

# determining best k
optimal_k = neighbors[MSE.index(min(next(iter(MSE))))]
print ("The optimal K neighbors number is %d" % optimal_k)

# plot misclassification error vs k
plt.plot(neighbors, MSE, figsize = (20,12))
plt.xlabel('Number of Neighbors K')
plt.ylabel('Misclassification Error')
plt.show()

Проблема вэта строка:

optimal_k = neighbors[MSE.index(min(next(iter(MSE))))]

Этот код, кажется, был написан на python 2. Это была оригинальная строка:

optimal_k = neighbors[MSE.index(min(MSE))]

Я добавил next() и iter(), чтобы решить эту проблему, как советуют некоторые пользователи в других темах, похожих на эту.Но я получаю эту ошибку:

TypeError: 'numpy.float64' object is not iterable

Я знаю, почему происходит эта ошибка, она должна проходить через список, но она принимает только цифры.Я думаю, что проблема связана с использованием filter() в этой строке:

neighbors = filter(lambda x: x % 2 != 0, myList)

Как я могу исправить этот код для запуска на Python 3 и предотвратить это? ?? 1021 *

Спасибо вadvance

EDIT:

Используемая мной версия KNN не предназначена для sklearn, для тех, кто хотел бы попробовать этот код.Это происходит из пакета обнаружения аномалий под названием PYOD.Ссылка здесь

Вы также можете попробовать его с оригинальным KNN из sklearn, но учтите, что вам нужно будет удалить параметр загрязнения и, возможно, параметр расстояния

1 Ответ

0 голосов
/ 17 февраля 2019

Проблема в том, что код определяет neighbors как генератор и исчерпывает его в первом цикле.Решение: используйте список.

neighbors = list(filter(lambda x: x % 2 != 0, myList))

Также ваш правильный синтаксис для получения оптимального значения был правильным (нет необходимости в iter или next):

optimal_k = neighbors[MSE.index(min(MSE))]
...