#pandas #dataframe #numpy #tensorflow #tensorflow-datasets
#pandas #фрейм данных #numpy #tensorflow #tensorflow-datasets
Вопрос:
Я знаю, что подобные вопросы задавались неоднократно, но ни одно из предложенных решений, похоже, не работает для меня. У меня есть следующий фрейм данных Pandas
:
Название | Автор | Цель | Tag0 | Tag1 | Tag2 | Tag3 | Tag4 | Tag5 | Tag6 | Tag7 | Tag8 | Tag9 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Говорит, что Рон Джонсон назвал «The Lego Movie» «коварным заговором против бизнеса». | 0 | 0 | 30 | 0 | 36 | 35 | nan | nan | nan | nan | nan | nan |
1 | «Сорок процентов из списка Fortune 500 были созданы иммигрантами или детьми иммигрантов». | 1 | 0 | 9 | 21 | 5 | 28 | nan | nan | nan | nan | nan | nan |
Я векторизовал Title
атрибут с помощью TextVectorization
layer при Keras
получении следующего фрейма данных:
Название | Автор | Цель | Tag0 | Tag1 | Tag2 | Tag3 | Tag4 | Tag5 | Tag6 | Tag7 | Tag8 | Tag9 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | [9415, 19483, 9066, 16820, 20256, 6959, 6931,…,0 ] | 0 | 0 | 3213 | 3829 | 223 | 3140 | nan | nan | nan | nan | nan | nan |
Я хочу преобразовать этот Pandas
фрейм данных в TensorFlow
набор данных. Я попытался добиться этого, используя следующий код:
dataset = tf.data.Dataset.from_tensor_slices((data.values, target.values))
Вот ошибка, которую я получаю:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).
При удалении Title
столбца ошибка исчезает, затем Title
появляется столбец, который выдает ошибку. Title
выглядит так:
print(data["Title"].values)
array([array([ 9415., 19483., 9066., 16820., 20256., 6959., 6931., 8539.,
10705., 1342., 1896., 4353., 14143., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
...,
array([17497., 20189., 4280., 3460., 20256., 15754., 9178., 1114.,
19441., 18731., 13875., 14018., 5789., 6959., 8740., 13042.,
929., 9541., 773., 19384., 5659., 13042., 14578., 2813.,
17452., 888., 6206., 6959., 14540., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0.],
dtype=float32)], dtype=object)
Мой вопрос: что не так с Title
? Что я должен изменить?
Я предполагаю, что это связано с типом данных numpy.ndarray
, содержащим каждый numpy.ndarray
заголовок. Как это видно выше dtype=object
. Но я не совсем уверен.
Заранее спасибо!
Редактировать:
Я нашел решение этой проблемы, просто преобразовав набор данных в Numpy
ndarray.
# To numpy
numpy_dataset = data.to_numpy(dtype="<U43")
#Get Target
target = data.pop("Target")
#TF dataset
dataset = tf.data.Dataset.from_tensor_slices((numpy_dataset, target.values))
Комментарии:
1. Каждая ячейка
Title
столбца представляет собой массив.values
тогда это массив массивов. Попробуйтеnp.stack(data["Title"].values)
. Если он выдает ошибку, эти вложенные массивы отличаются по форме и не могут быть преобразованы в 2d числовой массив (которыйtensorflow
можно использовать).2. Отлично, что решил мою проблему, но частично. Как вы можете видеть в приведенном выше коде, я передаю фрейм данных не только
Titles
. Если я сделаю то, что вы предложили,tf.data.Dataset.from_tensor_slices((np.stack(data["Title"].values), target.values))
TensorFlow
набор данных будет создан. Но как я могу включить остальные столбцы?
Ответ №1:
Я нашел решение этой проблемы, просто преобразовав набор данных в Numpy
ndarray.
# To numpy
numpy_dataset = data.to_numpy(dtype="<U43")
#Get Target
target = data.pop("Target")
#TF dataset
dataset = tf.data.Dataset.from_tensor_slices((numpy_dataset, target.values))
Ответ №2:
Я сталкиваюсь с тем же вопросом, когда пробую демонстрацию tf feature_columns.ipynb. Я обнаружил, что данные содержат нулевые данные, после их удаления код сработал
#drop null data
dataframe = dataframe.dropna(axis=0, how='any')