【问题标题】:How to change column containing list to one-hot-encoding如何将包含列表的列更改为单热编码
【发布时间】:2022-01-07 18:06:04
【问题描述】:

这就是我的专栏的样子。我想将每列中的数据更改为 one-hot-encoding。

数据是 [1,0,0],[0,1,0] 或 [0,0,1]

我该怎么做?

这是我的代码

def code_letter(letter):
return {
    'A':'2',
    'B':'1',
    'C':'1',
    'D':'1',
    'E':'2',
    'F':'1',
    'G':'1',
    'H':'1',
    'I':'2',
    'J':'1',
    'K':'1',
    'L':'1',
    'M':'1',
    'N':'1',
    'O':'2',
    'P':'1',
    'Q':'1',
    'R':'1',
    'S':'1',
    'T':'1',
    'U':'2',
    'V':'1',
    'W':'1',
    'X':'1',
    'Y':'2',
    'Z':'1'
}[letter]

# #preprocessing
def codify(word):
    n=[]
    for x in word:
        n.append(code_letter(x))
    n = ''.join(n)
    return n

def code_letter2(letter):
    return {
        '0':[1,0,0],
        '1':[0,1,0],
        '2':[0,0,1],
    }[letter]

def codify2d(word):
    n=[]
    for x in word:
        n.append(code_letter2(x))
    return n

def zerox(code):
    code_len = len(code)
    if code_len < 24:
        diff = 24 - code_len
        filled = code.ljust(diff + len(code), '0')
        return filled
    else:
        return code


def one_hot(final_code):
    final_split = list(final_code)
    dummies = pd.get_dummies(final_split)
    return dummies


dataset['Coded'] = dataset['Word'].apply(codify)
dataset['Codedfill'] = dataset['Coded'].apply(zerox)
dataset['Onehot'] = dataset['Codedfill'].apply(codify2d)
print(dataset)

dataset_new = pd.DataFrame(dataset.Onehot.tolist(), index= 
dataset.index)
dataset_new["Syllables"] = dataset["Syllables"]
print(dataset_new)

from sklearn.model_selection import train_test_split

train_dataset, test_dataset = train_test_split(dataset_new, 
test_size=0.2)

xtrain_dataset = train_dataset.loc[:, train_dataset.columns != 
'Syllables']
ytrain_dataset = train_dataset["Syllables"]

# Define a simple sequential model
def create_model():
  model = Sequential()
  model.add(Embedding(len(xtrain_dataset), 3, input_length=24))
  model.add(LSTM(18, dropout=0.1))
  model.add(Dense(12, activation='relu')),
  model.add(Dense(9, activation='relu')),
  model.add(Dense(1, activation="sigmoid"))

  optimizer = Adam(learning_rate=0.01)

  model.compile(optimizer=optimizer,
                loss='binary_crossentropy',
                metrics=['accuracy'])

  return model

#Create a basic model instance
model = create_model()
# Display the model's architecture
model.summary()

train_dataset.Syllables)
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

# Create a callback that saves the model's weights
cp_callback = 
tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,                          
    save_weights_only=True,verbose=1)

# Train the model with the new callback
#print(train_dataset)
model.fit(#train_dataset,
          x=xtrain_dataset,
          y=ytrain_dataset,
          epochs=50,
          batch_size=100,
          callbacks=[cp_callback])  # Pass callback to training

os.listdir(checkpoint_dir)

它给了

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list)

当我尝试喂食神经网络时。

【问题讨论】:

  • "[1,0,0],[0,1,0] or [0,0,1]" -> 这是 1、2、3 的一种热编码
  • 但运行时出现错误:ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list)。
  • 试图将其提供给 NN
  • 向我们展示您的代码并粘贴完整的错误消息,全部以文本格式(不是屏幕截图)
  • 你能添加一个你的问题的最小代码示例吗?

标签: python machine-learning arraylist conv-neural-network one-hot-encoding


【解决方案1】:

您已经在 code_letter2 函数中进行了一种热编码。我认为唯一的问题是您的数据类型。在将数据输入神经网络之前尝试将数据转换为 numpy 数组,即

import numpy as np
x = np.asarray(x).astype('float32')

有关您的错误的更多详细信息和选项,另请参阅此链接: Tensorflow - ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float)

【讨论】:

  • 是的,我试过了: dataset = np.asarray(dataset['Onehot']).astype('float32') 它给出了 ValueError: setting an array element with a sequence。
猜你喜欢
  • 2023-03-05
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2021-08-12
相关资源
最近更新 更多