Метод KNeighborsClassifier .fit возвращает ValueError: истинное значение ряда неоднозначно.

Я прочитал множество вопросов и ответов по названию темы; однако мне трудно понять, почему при использовании метода KNeighborsClassifier .fit возникает ошибка неоднозначного значения истинности. Код и данные, которые у меня есть, относительно просты:

Во-первых, я удаляю все значения nan по оси строк из кадра данных Opt_Data и присваиваю результаты переменной Training_Data.

Training_Data = Opt_Data.dropna(axis=0,how='any')

Скриншот примера набора данных

Затем я создаю два пустых массива из фрейма данных Training_Data. Массив X_Train состоит из данных из столбцов 1–10, а массив Y_Train состоит из данных из целевого столбца. В приведенном ниже коде имя переменной question — это имя столбца целевого столбца.

X_Train = np.array(Training_Data.loc[:,Training_Data.columns != question])

Y_Train = np.array(Training_Data[question])

После создания массивов я настроил функцию KNeighborsClassifier и передал результаты в переменную с именем knn. Переменная opt_neighbors представляет собой целое число (29). Когда я использую метод .fit для knn, я получаю вышеупомянутую ошибку значения «Истинное значение ряда неоднозначно».

knn = KNeighborsClassifier(n_neighbors=opt_neighbors,weights='distance',metric='hamming')

knn.fit(X_Train,Y_Train)

Форма фактического массива X_Train — (1783,10), а форма фактического массива Y_Train — (1783,).

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

Я также читал, что «операторам python or и и требуются значения истинности. Для панд они считаются неоднозначными, поэтому вы должны использовать «побитовые» | (или) или & ( и) операции». Однако я не уверен, как это утверждение применимо, поскольку я не использую операторы или или и явно.

Я очень ценю любую помощь, которую кто-либо может предложить мне. Благодарю вас!


person Community    schedule 04.01.2018    source источник
comment
никогда не предоставлять скриншоты данных; вставьте данные. тем не менее, просто используйте Traning_data.loc[:,Training_data.columns != 'Target column' ]. не уверен, что вопрос = «Целевой столбец»? также, когда вы нарезаете по loc, это даст ndarray. вам не нужно превращать его в один.   -  person skrubber    schedule 04.01.2018
comment
Спасибо. Я попробую этот метод. Было бы полезно, если бы вы могли объяснить, как вставлять таблицы из Excel без потери форматирования. Это все, что я смог найти: мета .stackexchange.com/questions/73566/   -  person    schedule 04.01.2018
comment
Переменная «вопрос» — это фактическое имя столбца целевого столбца. Например, если целевой столбец — «Что вы ели на завтрак?», то переменная «вопрос» — это строка «Что вы ели на завтрак?»   -  person    schedule 04.01.2018


Ответы (1)


Была часть моего кода, которая, как мне казалось, не имела отношения к проблеме; однако, как выясняется, это было причиной проблемы:

В приведенном ниже коде я назначаю элемент из кадра данных (Opt_report) переменной opt_neighbors. Я думал, что это присваивание создаст скалярное значение, однако это серия pandas, состоящая из порядкового номера (135) и целочисленного значения (19). Когда я передаю эту переменную в аргумент n_neighbors в функции KNeighborsClassifier, она понимается как Series 135 19.0, как показано в Out [3], строка 2, n_neighbors = 135 19.0. Мой KNeighborsClassifier был плохо выполнен, что привело к тому, что метод .fit KNeighborsClassifier не работал должным образом.

In  [1]:  opt_neighbors = Opt_report['Optimal_Neighbors']
Out [1]:  135 19.0
          Name: Optimal_Neighbors, dtype: float64

In  [2]: type(opt_neighbors)
Out [2]: pandas.core.series.Series

In  [3]: knn = KNeighborsClassifier(n_neighbors=opt_neighbors,weights='distance',metric='hamming')
         knn
Out [3]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='hamming', metric_params=None, n_jobs=1,
         n_neighbors=135    19.0
         Name: Optimal_Neighbors, dtype: float64,p=2, weights='distance') 

Обновление кода, как показано ниже, устраняет эту проблему.

In  [4]: opt_neighbors = int(Opt_report['Optimal_Neighbors'])
Out [4]: 19
person Community    schedule 05.01.2018