【问题标题】:OneHotEncoding Protein Sequences一种热编码蛋白质序列
【发布时间】:2020-12-22 18:10:07
【问题描述】:

我有下面列出的序列的原始数据帧,我正在尝试使用单热编码,然后将它们存储在一个新的数据帧中,我正在尝试使用以下代码执行此操作,但无法存储,因为我得到了之后的输出:

代码:

onehot_encoder = OneHotEncoder()
sequence = np.array(list(x_train['sequence'])).reshape(-1, 1)
encoded_sequence = onehot_encoder.fit_transform(sequence).toarray()
encoded_sequence

但出现错误

ValueError: Wrong number of items passed 12755, placement implies 1

【问题讨论】:

    标签: python scikit-learn one-hot-encoding


    【解决方案1】:

    你会得到那个奇怪的数组,因为它把每个序列都当作一个条目,并尝试对它进行一次热编码,我们可以举个例子:

    import pandas as pd
    from sklearn.preprocessing import OneHotEncoder 
    df = pd.DataFrame({'sequence':['AQAVPW','AMAVLT','LDTGIN']})
    
    enc = OneHotEncoder()
    seq = np.array(df['sequence']).reshape(-1,1)
    encoded = enc.fit(seq)
    encoded.transform(seq).toarray()
    
    array([[0., 1., 0.],
           [1., 0., 0.],
           [0., 0., 1.]])
    
    encoded.categories_
    
    [array(['AMAVLT', 'AQAVPW', 'LDTGIN'], dtype=object)]
    

    由于您的条目是唯一的,因此您会得到这个全零矩阵。如果你使用 pd.get_dummies 可以更好地理解这一点

    pd.get_dummies(df['sequence'])
    
      AMAVLT AQAVPW LDTGIN
    0   0   1   0
    1   1   0   0
    2   0   0   1
    

    有两种方法可以做到这一点,一种方法是简单地计算氨基酸的出现并将其用作预测因子,我希望我得到正确的氨基酸(很久以前的学校):

    from Bio import SeqIO
    from Bio.SeqUtils.ProtParam import ProteinAnalysis
    
    pd.DataFrame([ProteinAnalysis(i).count_amino_acids() for i in df['sequence']])
    
        A   C   D   E   F   G   H   I   K   L   M   N   P   Q   R   S   T   V   W   Y
    0   2   0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0   1   1   0
    1   2   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   1   1   0   0
    2   0   0   1   0   0   1   0   1   0   1   0   1   0   0   0   0   1   0   0   0
    

    另一种是对序列进行拆分,按位置进行编码,这要求序列要等长,并且你有足够的内存:

    byposition = df['sequence'].apply(lambda x:pd.Series(list(x)))
    byposition
    
        0   1   2   3   4   5
    0   A   Q   A   V   P   W
    1   A   M   A   V   L   T
    2   L   D   T   G   I   N
    
    pd.get_dummies(byposition)
    
        0_A 0_L 1_D 1_M 1_Q 2_A 2_T 3_G 3_V 4_I 4_L 4_P 5_N 5_T 5_W
    0   1   0   0   0   1   1   0   0   1   0   0   1   0   0   1
    1   1   0   0   1   0   1   0   0   1   0   1   0   0   1   0
    2   0   1   1   0   0   0   1   1   0   1   0   0   1   0   0
    

    【讨论】:

    • 哦,哇,谢谢你这么详细的回答。这真的太不可思议了,我真的很感激。老实说,我什至不认为最后一部分,看起来很酷。我的每一个序列一般都在 300-305bp 左右。
    • 我正在查看 pd.get_dummies() 但我真的很想查看序列的每个位置,这非常理想。我有一个关于count_amino_acids 的问题。是否考虑到我们的序列是否有例如“aa-aa-ca”的间隙。
    • count_amino_acids 应将“-”视为缺失。我尝试了pd.Series(ProteinAnalysis("AA-QVT").count_amino_acids()).sum(),它给出了 5。您可能需要再次检查所有序列
    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 2013-09-18
    • 2012-06-27
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多