如何使用 numpy 数组列表来训练 ML 算法?
How to use list of numpy arrays to train ML algorithm?
我正在尝试开发一种使用 LinearSVC 的机器学习算法和另一种使用卷积神经网络对 DNA 序列进行分类的算法。
我不得不对 DNA 序列进行一次热编码,然后将每个序列的结果数组存储在一个列表中。
但是当我进行训练测试拆分步骤时,我无法使用它。
我的DNA序列是这样的(不是我的真实数据集,更大,只是为了举例说明。所有序列都在文件'seqs_for_test.fasta'中):
>TE_seq1
CCATAAACTATCTAAATAAGCACTTTTCTGGCTCTCTGGCCCCCCTTCTTCTTTTTGGGAAGGTGACAG
AGGGTAAAAGGGCTCTCTGCCGTGCGAGGCTCCTCACAGACACACAGCAAGAAAGAAGCGCCGCGCAGCA
>TE_seq2
GATAGCCCCTCTCCCAGCCCCAGTCTGATCCCTAACCCTAACTCCACGGCTCCTGTCTCTACCCCCGTCT
CTTTCTTCTTGTACCCTAGTCCCCCAGATCATTAGCTCCCTGCTCGGGCCCAGGGTTTTAAGAGAAGCCC
>TE_seq3
TGACTCAAGTCATGCTACCCAGCCCCGTCTTCTTAAAAATGAGACATGTTGAGACACCCTGCTTTTCGCC
TACAAACACATCCATTCTCTATACTTAGTCTTATTTAAATTCTATCCTCTGTATGTCTAGTCCTGGGGGT
>RD_seq4
TGCTCGCCCCCCAGGAAGTGCAGAGACCGCCTGGGTGTGACTGTTTTTAGGCCTAACAAAGGCACAGAAA
CACCCGTGCGGTCTCTGTATCCCCTGGAGGTATTTCTCCCCATTAGTTTGCTTGACACTAAGTTTTTAAA
>RD_seq5
TAAAAAAAGCTTATTAAGTCCCTAGAACCTGGGACCTATCTACCCAAGTTTTAAAACCTTACTTTTAAGG
CTACATTTTTTTATTTTGACTGTTTTACCATAAGGTCACATATAGGAAACCCCCACTGTCCTAATAAAAA
>RD_seq6
CTAATCTCCTGTTGGCTGACTTACATCAGTTTGGGAAGTTGTTCATGATGACTCTGCGACGATCAAGAAG
GACCAGGACTCTCCCTGGACACCTCAGGGACTTCTTGCTGGAGGGCACCATACATCAGTTTGCCAGCAAA
这是我的 LinearSVC 代码:
import pandas as pd
import numpy as np
from numpy import array
from numpy import argmax
from Bio import SeqIO
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
with open('../fasta/seqs_for_test.fasta') as fasta_file: # Will close handle cleanly
identifiers = []
sequences = []
for seq_record in SeqIO.parse(fasta_file, 'fasta'): # (generator)
identifiers.append(seq_record.id)
sequences.append(seq_record.seq.lower())
s1 = pd.Series(identifiers, name='ID')
s2 = pd.Series(sequences, name='sequence')
# Gathering Series into a pandas DataFrame and rename index as ID column
fasta_frame = pd.DataFrame(dict(ID=s1, sequence=s2)).set_index(['ID'])
fasta_frame
label_serie = pd.Series()
fasta_frame.insert(1, "label", label_serie)
# Transposable element (TE) == 0; Random (RD) == 1.
fasta_frame.loc[fasta_frame.index.str.contains(r'TE_'),'label'] = 0
fasta_frame.loc[fasta_frame.index.str.contains(r'RD_'),'label'] = 1
fasta_frame
# empty list to store ohe array sequences
res_arr = []
for index, row in fasta_frame['sequence'].iteritems():
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(row)
# print(integer_encoded)
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
# print(index)
# print(onehot_encoded)
# append ohe arrays
res_arr.append(onehot_encoded)
y = fasta_frame['label']
# y
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(res_arr,
y,
test_size = 0.20,
random_state=42)
# print(x_train)
# print(y_train)
# print(x_test)
# print(y_test)
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
modelo = LinearSVC()
modelo.fit(x_train, y_train)
previsoes = modelo.predict(y_test)
acuracia = accuracy_score(y_test, previsoes) * 100
print("accuracy was %.2f%%" % acuracia)
我尝试过重塑、np.vstack 和其他方式,但没有成功。
如何使用数组列表作为我的训练集?
错误信息:
ValueError: Found array with dim 3. Estimator expected <= 2.
你的问题是,SVM 期望每个训练样例都有固定数量的 n 个维度 1 的特征,然后试图在这个 n 维特征中找到一个分离超平面-space。如果你对长度为 m 的 DNA 序列进行单热编码,你实际上得到了维度 4 的 m 个特征。LinearSVC 实现不适应这种情况(我不确定 SVM 是否通常适用于不是一个的特征-dimensional,space 应该是什么样子,它被任意维度的特征所跨越?)。
如果您想使用 sklearn 的 SVM 实现,您必须找到解决方法 "formaly" 将特征的维度减少到一个。一种可能性是展平你的序列表示。 IE。从一个维度为 [140, 4] 的 DNA 序列开始,您可以通过连接相同维度中的单热表示来创建维度 [560, 1] 的扁平化表示。
也许 示例 是说明性的:
举个例子,DNA 序列 "AC" 被单热编码为 [[1, 0, 0, 0], [0, 1, 0, 0]]。然后,您必须将输入展平为 [1, 0, 0, 0, 0, 1, 0, 0],这样您就可以在长度为 2 的 DNA 序列上训练 SVM。
为什么这样做有效?
SVM 将有 8 个权重(忽略偏差项)。第一个权重将衡量腺嘌呤作为第一个核苷酸出现的重要性。第二个权重将衡量具有胞嘧啶作为第一个核苷酸的重要性。第五个权重将衡量腺嘌呤作为第二个核苷酸出现的重要性,依此类推。现在,如果 "AC" DNA 序列出现并且我们想要对其进行分类,则忽略所有权重,除了对应于作为第一个核苷酸出现的腺嘌呤和作为第二个核苷酸出现的胞嘧啶的权重。
如果您的 DNA 序列不是所有的固定长度,您将不得不零填充它们。这意味着在它们的扁平序列表示中附加零,直到它们与数据集中最长的序列一样长。
我正在尝试开发一种使用 LinearSVC 的机器学习算法和另一种使用卷积神经网络对 DNA 序列进行分类的算法。 我不得不对 DNA 序列进行一次热编码,然后将每个序列的结果数组存储在一个列表中。 但是当我进行训练测试拆分步骤时,我无法使用它。
我的DNA序列是这样的(不是我的真实数据集,更大,只是为了举例说明。所有序列都在文件'seqs_for_test.fasta'中):
>TE_seq1 CCATAAACTATCTAAATAAGCACTTTTCTGGCTCTCTGGCCCCCCTTCTTCTTTTTGGGAAGGTGACAG AGGGTAAAAGGGCTCTCTGCCGTGCGAGGCTCCTCACAGACACACAGCAAGAAAGAAGCGCCGCGCAGCA
>TE_seq2 GATAGCCCCTCTCCCAGCCCCAGTCTGATCCCTAACCCTAACTCCACGGCTCCTGTCTCTACCCCCGTCT CTTTCTTCTTGTACCCTAGTCCCCCAGATCATTAGCTCCCTGCTCGGGCCCAGGGTTTTAAGAGAAGCCC
>TE_seq3 TGACTCAAGTCATGCTACCCAGCCCCGTCTTCTTAAAAATGAGACATGTTGAGACACCCTGCTTTTCGCC TACAAACACATCCATTCTCTATACTTAGTCTTATTTAAATTCTATCCTCTGTATGTCTAGTCCTGGGGGT
>RD_seq4 TGCTCGCCCCCCAGGAAGTGCAGAGACCGCCTGGGTGTGACTGTTTTTAGGCCTAACAAAGGCACAGAAA CACCCGTGCGGTCTCTGTATCCCCTGGAGGTATTTCTCCCCATTAGTTTGCTTGACACTAAGTTTTTAAA
>RD_seq5 TAAAAAAAGCTTATTAAGTCCCTAGAACCTGGGACCTATCTACCCAAGTTTTAAAACCTTACTTTTAAGG CTACATTTTTTTATTTTGACTGTTTTACCATAAGGTCACATATAGGAAACCCCCACTGTCCTAATAAAAA
>RD_seq6 CTAATCTCCTGTTGGCTGACTTACATCAGTTTGGGAAGTTGTTCATGATGACTCTGCGACGATCAAGAAG GACCAGGACTCTCCCTGGACACCTCAGGGACTTCTTGCTGGAGGGCACCATACATCAGTTTGCCAGCAAA
这是我的 LinearSVC 代码:
import pandas as pd
import numpy as np
from numpy import array
from numpy import argmax
from Bio import SeqIO
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
with open('../fasta/seqs_for_test.fasta') as fasta_file: # Will close handle cleanly
identifiers = []
sequences = []
for seq_record in SeqIO.parse(fasta_file, 'fasta'): # (generator)
identifiers.append(seq_record.id)
sequences.append(seq_record.seq.lower())
s1 = pd.Series(identifiers, name='ID')
s2 = pd.Series(sequences, name='sequence')
# Gathering Series into a pandas DataFrame and rename index as ID column
fasta_frame = pd.DataFrame(dict(ID=s1, sequence=s2)).set_index(['ID'])
fasta_frame
label_serie = pd.Series()
fasta_frame.insert(1, "label", label_serie)
# Transposable element (TE) == 0; Random (RD) == 1.
fasta_frame.loc[fasta_frame.index.str.contains(r'TE_'),'label'] = 0
fasta_frame.loc[fasta_frame.index.str.contains(r'RD_'),'label'] = 1
fasta_frame
# empty list to store ohe array sequences
res_arr = []
for index, row in fasta_frame['sequence'].iteritems():
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(row)
# print(integer_encoded)
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
# print(index)
# print(onehot_encoded)
# append ohe arrays
res_arr.append(onehot_encoded)
y = fasta_frame['label']
# y
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(res_arr,
y,
test_size = 0.20,
random_state=42)
# print(x_train)
# print(y_train)
# print(x_test)
# print(y_test)
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
modelo = LinearSVC()
modelo.fit(x_train, y_train)
previsoes = modelo.predict(y_test)
acuracia = accuracy_score(y_test, previsoes) * 100
print("accuracy was %.2f%%" % acuracia)
我尝试过重塑、np.vstack 和其他方式,但没有成功。 如何使用数组列表作为我的训练集?
错误信息:
ValueError: Found array with dim 3. Estimator expected <= 2.
你的问题是,SVM 期望每个训练样例都有固定数量的 n 个维度 1 的特征,然后试图在这个 n 维特征中找到一个分离超平面-space。如果你对长度为 m 的 DNA 序列进行单热编码,你实际上得到了维度 4 的 m 个特征。LinearSVC 实现不适应这种情况(我不确定 SVM 是否通常适用于不是一个的特征-dimensional,space 应该是什么样子,它被任意维度的特征所跨越?)。
如果您想使用 sklearn 的 SVM 实现,您必须找到解决方法 "formaly" 将特征的维度减少到一个。一种可能性是展平你的序列表示。 IE。从一个维度为 [140, 4] 的 DNA 序列开始,您可以通过连接相同维度中的单热表示来创建维度 [560, 1] 的扁平化表示。
也许 示例 是说明性的:
举个例子,DNA 序列 "AC" 被单热编码为 [[1, 0, 0, 0], [0, 1, 0, 0]]。然后,您必须将输入展平为 [1, 0, 0, 0, 0, 1, 0, 0],这样您就可以在长度为 2 的 DNA 序列上训练 SVM。
为什么这样做有效?
SVM 将有 8 个权重(忽略偏差项)。第一个权重将衡量腺嘌呤作为第一个核苷酸出现的重要性。第二个权重将衡量具有胞嘧啶作为第一个核苷酸的重要性。第五个权重将衡量腺嘌呤作为第二个核苷酸出现的重要性,依此类推。现在,如果 "AC" DNA 序列出现并且我们想要对其进行分类,则忽略所有权重,除了对应于作为第一个核苷酸出现的腺嘌呤和作为第二个核苷酸出现的胞嘧啶的权重。
如果您的 DNA 序列不是所有的固定长度,您将不得不零填充它们。这意味着在它们的扁平序列表示中附加零,直到它们与数据集中最长的序列一样长。