Feeding Torch объекты из CSV, чтобы узнать - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь дать PyTorch вход для построения очень простой нейронной сети. Вот моя проблема: У меня есть все данные, которые я хочу использовать в CSV, и я использую Panda, чтобы прочитать их. Вот мой код:

data = pd.read_csv("../myFile.csv")
input = [x for x in data]
input = np.asarray(input)
input = torch.from_numpy(input)

Это возвращает ошибку:

line 42, in <module>
input = torch.from_numpy(input)
TypeError: can't convert np.ndarray of type numpy.str_. The only supported types are: float64, float32, float16, int64, int32, int16, int8, and uint8.

Я понимаю, что означает ошибка. Основная проблема заключается в том, что в моем csv есть несколько столбцов, которые нельзя преобразовать в int или float, поскольку они в основном являются строками, например, идентификатор клиента будет выглядеть примерно так: AAABBBCCC; и я не могу бросить это, чтобы плавать или int. Ты хоть представляешь, что я могу сделать?

РЕДАКТИРОВАТЬ: Вот мой новый обновленный код с предложенным ответом Anubhav:

data = pd.read_csv("myFile.csv", names=col_names)
data = data.drop(["Customer-ID", "name"], axis=1)

for column in list(data):
    # one hot encode of Object Columns
    one_hot = pd.get_dummies(data[column])
    # drop encoded columns
    data = data.drop(column, axis=1)
    # join the encoded data
    data = data.join(one_hot)

print(data.dtypes)

inp = [x for x in data]
inp = np.asarray(inp, dtype=np.float32)
inp = torch.from_numpy(inp)

Но я все еще получаю следующую ошибку:

line 52, in <module>
    inp = np.asarray(inp, dtype=np.float32)
  File "C:\Users\Paul\anaconda3\lib\site-packages\numpy\core\numeric.py", line 538, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not convert string to float: '01139_Lichtenau'

При поиске этого значения из print (data.dtypes) ясно сказано:

01139_Lichtenau  uint8

По какой-то причине произошла ошибка кодирования?

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Вы проверили вывод [x for x in data]? Это просто список имен столбцов типа string. Вот почему вы получаете выше ошибки. Теперь я помогу вам решить вашу проблему, используя образец csv файла.

Имя файла: data.csv

custID name age salary label
EMP1 Mahi 23 120000 Yes
EMP2 Tom 28 200000 No
EMP3 Chris 25 123000 No
EMP4 Matt 29 2130000 Yes
EMP5 Brown 27 324675 Yes

Как видите, файл выше содержит как строковые, так и целочисленные значения. Сначала я покажу вывод вашего кода:

data = pd.read_csv('data.csv', sep=' ')
inp = [x for x in data]   # ['custID', 'name', 'age', 'salary', 'label']
inp = np.asarray(inp)     # array(['custID', 'name', 'age', 'salary', 'label'], dtype='<U6')
inp = torch.from_numpy(inp)

TypeError: невозможно преобразовать np.ndarray типа numpy.str_. Единственный Поддерживаемые типы: double, float, float16, int64, int32 и uint8

Что вы можете сделать, так это считать, что только те строковые столбцы важны для нейронных сетей и что вы можете one-hot кодировать. Столбцы типа custID и name не имеют никакого значения для нейронной сети.

data = pd.read_csv('data.csv', sep=' ')

# one-hot encode of column 'label'
# Get one hot encoding of column 'label'
one_hot = pd.get_dummies(data['label'])
# Drop column 'label' as it is now encoded
data = data.drop('label',axis = 1)
# Join the encoded data
data = data.join(one_hot)

inp = [data[x] for x in data]
inp = np.asarray(inp[2:], dtype=np.float32)
inp = torch.from_numpy(inp)
* * Тысяча двадцать-одина выход:
tensor([[     23.,      28.,      25.,      29.,      27.],
        [ 120000.,  200000.,  123000., 2130000.,  324675.],
        [      0.,       1.,       1.,       0.,       0.],
        [      1.,       0.,       0.,       1.,       1.]])

В приведенном выше коде я сначала горячим образом закодировал столбец label, затем отбросил этот столбец и соединил закодированные данные. После этого я читаю все столбцы файла csv (включая custID и name), затем игнорирую столбцы custID и name и преобразовываю другие в float и, наконец, использую torch.from_numpy для преобразования его в тензор.

В приведенном выше выводе каждая строка соответствует столбцу в one-hot закодированных данных.

0 голосов
/ 10 июля 2019

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

Fastai (библиотека, построенная сверху на pytorch) имеет секцию Tabular, которая может помочь вам проще построить вашу сеть, вы можете проверить это: https://docs.fast.ai/tabular.html (она выполнит вложение категориальной переменной и некоторая предварительная обработка для вас).

...