如何解决OneHotEncoding蛋白序列
我具有下面列出的序列的原始数据帧,并尝试使用单热编码,然后将其存储在新的数据帧中,我尝试使用以下代码来实现,但由于我得到了随后输出如下:
代码:
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
解决方法
您会得到一个奇怪的数组,因为它将每个序列都视为一个条目并尝试对其进行一次热编码,我们可以使用一个示例:
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.,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。