如何将 csv 文件转换为字符级单热编码矩阵?

how to convert a csv file to character level one-hot-encode matrices?

我有一个如下所示的 CSV 文件

我想选择最后一列并为每个序列制作字符级单热编码矩阵,我使用此代码但它不起作用

data = pd.read_csv('database.csv', usecols=[4])
alphabet = ['A', 'C', 'D', 'E', 'F', 'G','H', 'I', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'Y']
charto = dict((c,i) for i,c in enumerate(alphabet))
iint = [charto[char] for char in data]
onehot2 = []
for s in iint:
    lett = [0 for _ in range(len(alphabet))]
    lett[s] = 1
    onehot2.append(lett)

对于这个任务,你建议做什么? (顺便说一句,我想将此数据集用于 PyTorch 模型)

我认为最好保持 pd.DataFrame 不变,并在 PyTorch 数据集中“即时”进行转换。

首先,与您类似的虚拟数据:

df = pd.DataFrame(
    {
        "ID": [1, 2, 3],
        "Source": ["Serbia", "Poland", "Germany"],
        "Sequence": ["ABCDE", "EBCDA", "AAD"],
    }
)

之后,我们可以创建torch.utils.data.Dataset class(示例字母显示,您可以将其更改为任何您想要的):

class Dataset(torch.utils.data.Dataset):
    def __init__(self, df: pd.DataFrame):
        self.df = df
        # Change alphabet to anything you need
        alphabet = ["A", "B", "C", "D", "E", "F"]
        self.mapping = dict((c, i) for i, c in enumerate(alphabet))

    def __getitem__(self, index):
        sample = df.iloc[index]
        sequence = sample["Sequence"]
        target = torch.nn.functional.one_hot(
            torch.tensor([self.mapping[letter] for letter in sequence]),
            num_classes=len(self.mapping),
        )
        return sample.drop("Sequence"), target

    def __len__(self):
        return len(self.df)

此代码通过 torch.nn.functional.one_hot 函数简单地将字母索引转换为其单热编码。

用法很简单:

ds = Dataset(df)
ds[0]

其中 returns(您可能想更改示例的创建方式,因为我不确定格式并且只关注热编码目标)以下目标 (IDSource 省略):

tensor([ [1., 0., 0., 0., 0., 0.],
         [0., 1., 0., 0., 0., 0.],
         [0., 0., 1., 0., 0., 0.],
         [0., 0., 0., 1., 0., 0.],
         [0., 0., 0., 0., 1., 0.]]))