UMAP Error TypeError: требуется байтовый объект, а не `` список ''

Я пытаюсь запустить код, который использует UMAP для уменьшения размерности на основе работы здесь: https://umap-learn.readthedocs.io/en/latest/basic_usage.html

Я использую Spyder (Python 3.7). Я получаю такую ​​ошибку: TypeError: a bytes-like object is required, not 'list'

Это мой код:


импортировать numpy как np
из sklearn.datasets импортировать load_iris, load_digits
из sklearn.model_selection import train_test_split
импортировать matplotlib.pyplot как plt
импортировать seaborn как sns
импортировать панд как pd

импортировать umap.umap_ как umap

# import umap

из sklearn.preprocessing import StandardScaler
из патчей импорта matplotlib


#data = pd.read_csv('/ Пользователи /chrisweber/Documents/Walsh Lab/UMAP.csv')

data = pd.read_csv('/ Пользователи / Элизабет / Рабочий стол /UMAPtest.csv')


# Раскомментируйте тот или иной раздел


################################# РАЗДЕЛ 1 - UMAP ################################################################
редуктор = umap.UMAP()
endpoints = data[['RR', 'na1', 'fa1', 'nt1', 'ft1', 'nt2', 'ft2']]. значения
scaled_endpoints = StandardScaler().fit_transform(конечные точки)
embedding = reducer.fit_transform(scaled_endpoints)


plt.scatter (
    встраивание [:, 0],
    встраивание [:, 1],
    c =[sns.color_palette()[x] для x в data.Identifier.map ({0: 0, 1: 1})])

plt.gca().set_aspect('равно', 'данные')

plt.title ('Проекция UMAP по идентификатору', fontsize=24)

синий = патчи.Patch(color='steelblue', label='0')
оранжевый = патчи.Patch (color = 'orange', label = '1')
plt.legend (handles=[синий, оранжевый])
############################################### ############################################### ####################


################################# РАЗДЕЛ 2 - Парный график ########### ############################################### ##
# sns.pairplot (данные, оттенок = 'Идентификатор')
# plt.subplots_adjust(.05,.05,.95,.95)
# plt.suptitle('Анализ конечной точки по идентификатору')
############################################### ############################################### ####################


plt.show()

Это сообщение, которое я получаю, когда он запускается:

Отслеживание (последний вызов последний):

  Файл "C:\Users\Elizabeth\Desktop\UMAPs.py", строка 31, в 
    embedding = reducer.fit_transform(scaled_endpoints)

  Файл "C:\ProgramData\Anaconda3\lib\site-packages\umap\umap_.py", строка 2012, в fit_transform
    self.fit (X, y)

  Файл "C:\ProgramData\Anaconda3\lib\site-packages\umap\umap_.py", строка 1833, соответствует
    self._search_graph.transpose()

  Файл "C:\ProgramData\Anaconda3\lib\site-packages\scipy\sparse\lil.py", строка 437, транспонированный
    return self.tocsr(copy=copy).transpose(axes=axes, copy=False).tolil(copy=False)

  Файл "C:\ProgramData\Anaconda3\lib\site-packages\scipy\sparse\lil.py", строка 462, в tocsr
    _csparsetools.lil_get_lengths(self.rows, indptr[1:])

  Файл "_csparsetools.pyx", строка 109, в scipy.sparse._csparsetools.lil_get_lengths

  Файл "stringsource", строка 658, в View.MemoryView.memoryview_cwrapper

  Файл "stringsource", строка 349, в View.MemoryView.memoryview.__ cinit__

TypeError: требуется объект, похожий на байты, а не `` список '' ''

Я не знаю, как исправить ошибку или что искать, поскольку поиск ошибки ничего мне не дает.


2 ответа

Я наткнулся на ту же проблему, странно то, что UMAP просто перестал работать с данными (тем же фреймом данных) в одночасье. Как бы то ни было, с UMAP-learn [1,2] это часто повторяется, и я исправил это, установив pynndescent:

pip install pynndescent

или

conda install -c conda-forge pynndescent

Я надеюсь, что это помогает:)

[1] https://github.com/lmcinnes/umap/issues/401
[2] https://github.com/lmcinnes/umap/issues/452

Я не знаком с используемой вами библиотекой, поэтому это будет не правильный ответ на этот конкретный вопрос, а общий совет о том, как бороться с подобными ошибками.

Ошибка возникает в этой строке:

embedding = reducer.fit_transform(scaled_endpoints)

и жалуется, что функции был предоставлен объект неправильного типа (список, а не байты). Итак, перед этой строкой поместите это:

print(scaled_endpoints)
print(type(scaled_endpoints))

чтобы точно понять, что вы собираетесь предоставить reducer.fit_transform()функция. Затем перейдите к документации по этой функции. Какого рода вводные данные ожидаются и как их следует создавать? Как ты можешь получитьscaled_endpoints чтобы соответствовать этому ожиданию?

Другие вопросы по тегам