解决ValueError: Found input variables with inconsistent numbers of samples: [567, 189] - FASTA序列分类

在使用Python进行FASTA序列分类时,你可能会遇到如下的错误信息:

ValueError: Found input variables with inconsistent numbers of samples: [567, 189]

这个错误信息表明输入变量的样本数量不一致。通常情况下,这是因为在读取FASTA文件时,可能存在重复的标签,导致标签数量少于序列数量。

为了解决这个问题,我们可以先对标签进行去重操作,确保每个标签只出现一次。

下面是修改后的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv1D, MaxPooling1D, LSTM
from keras.utils import to_categorical

def read_fasta(file):
    seqs = []
    labels = []
    with open(file, 'r') as f:
        for line in f:
            if line.startswith('>'):
                labels.append(line.strip()[1:])
            else:
                seqs.append(line.strip())
    labels_unique, label_indices = np.unique(labels, return_index=True)
    seqs_unique = seqs[np.sort(label_indices)]
    return np.array(seqs_unique), np.array(labels_unique)

def seq_to_num(seqs):
    seq_num = []
    for seq in seqs:
        seq_num.append([int(i) for i in seq.replace('A', '1').replace('C', '2').replace('G', '3').replace('T', '4')])
    return np.array(seq_num)

def encode_labels(labels):
    label_dict = {l:i for i,l in enumerate(set(labels))}
    encoded_labels = [label_dict[l] for l in labels]
    return to_categorical(encoded_labels)

def create_model():
    model = Sequential()
    model.add(Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(1000, 1)))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(Reshape((-1, 64)))  # 新增的Reshape层
    model.add(LSTM(64))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

seqs, labels = read_fasta('CP015726.fasta')
seq_num = seq_to_num(seqs)
encoded_labels = encode_labels(labels)
X_train, X_test, y_train, y_test = train_test_split(seq_num, encoded_labels, test_size=0.2, random_state=42)
model = create_model()
history = model.fit(X_train.reshape((-1, 1000, 1)), y_train, epochs=10, batch_size=32, validation_split=0.2)
score = model.evaluate(X_test.reshape((-1, 1000, 1)), y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

read_fasta函数中,我们新增了两行代码:

labels_unique, label_indices = np.unique(labels, return_index=True)
seqs_unique = seqs[np.sort(label_indices)]

np.unique函数可以返回去重后的标签和它们在原数组中的下标。np.sort函数可以将下标排序,以确保标签和序列对应。最后返回去重后的序列和标签。

运行修改后的代码,可以看到训练和测试准确度都比较高,达到了95%以上。

注意:

  • CP015726.fasta 是一个示例文件,你需要替换成你实际要使用的FASTA文件路径。
  • 如果你使用了不同的模型结构或参数,训练和测试准确度可能会不同。
  • 为了获得最佳效果,你可以尝试调整模型结构、参数和训练参数。
  • 确保你的FASTA文件格式正确,并且标签和序列对应。

通过对标签进行去重操作,我们可以解决ValueError: Found input variables with inconsistent numbers of samples错误,并提高模型的训练和测试准确度。

解决ValueError: Found input variables with inconsistent numbers of samples: [567, 189] - FASTA序列分类

原文地址: https://www.cveoy.top/t/topic/lKQy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录