Как использовать список массивов numpy для обучения алгоритму ML? - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь разработать алгоритм машинного обучения с использованием LinearSVC, а другой - с использованием сверточных нейронных сетей для классификации последовательностей ДНК. Мне нужно было одно горячее кодирование последовательностей ДНК, а затем я сохранил полученные массивы для каждой последовательности в списке. Но когда я делаю шаг разделения поезда-теста, я не смог его использовать.

Мои последовательности ДНК такие (не мой настоящий набор данных, который намного больше, просто для иллюстрации. Все последовательностив файле 'seqs_for_test.fasta'):

> TE_seq1 CCATAAACTATCTAAATAAGCACTTTTCTGGCTCTCTGGCCCCCCTTCTTCTTTTTGGGAAGGTGACAG AGGGTAAAAGGGCTCTCTGCCGTGCGAGGCTCCTCACAGACACACAGCAAGAAAGAAGCGCCGCGCAGCA

1007 *> TE_seq2 GATAGCCCCTCTCCCAGCCCCAGTCTGATCCCTAACCCTAACTCCACGGCTCCTGTCTCTACCCCCGTCT CTTTCTTCTTGTACCCTAGTCCCCCAGATCATTAGCTCCCTGCTCGGGCCCAGGGTTTTAAGAGAAGCCC
1009 *> TE_seq3 TGACTCAAGTCATGCTACCCAGCCCCGTCTTCTTAAAAATGAGACATGTTGAGACACCCTGCTTTTCGCC TACAAACACATCCATTCTCTATACTTAGTCTTATTTAAATTCTATCCTCTGTATGTCTAGTCCTGGGGGT
1011 *>RD_seq4 TGCTCGCCCCCCAGGAAGTGCAGAGACCGCCTGGGTGTGACTGTTTTTAGGCCTAACAAAGGCACAGAAA CACCCGTGCGGTCTCTGTATCCCCTGGAGGTATTTCTCCCCATTAGTTTGCTTGACACTAAGTTTTTAAA
1013 *> RD_seq5 TAAAAAAAGCTTATTAAGTCCCTAGAACCTGGGACCTATCTACCCAAGTTTTAAAACCTTACTTTTAAGG CTACATTTTTTTATTTTGACTGTTTTACCATAAGGTCACATATAGGAAACCCCCACTGTCCTAATAAAAA
1015 *> 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: Найдено массив с dim 3. Ожидается оценщик <= 2. </p>

1 Ответ

1 голос
/ 02 октября 2019

Ваша проблема в том, что SVM ожидает для каждого примера обучения фиксированное количество n объектов измерения 1, а затем пытается найти разделяющую гиперплоскость в этом n-мерном пространстве признаков. Если вы горячо закодируете свои последовательности ДНК длиной m, вы фактически получите m функций измерения 4. Реализация LinearSVC не адаптируется к этой ситуации (я не уверен, что SVM в целом применимы к функциям, которые не являются-пространственный, как должно выглядеть пространство, охватываемое произвольными размерными элементами?).

Если вы хотите использовать SVM-реализации sklearn, вам нужно обойти «формальное» сокращение размеров ваших функций до единицы. Одна из возможностей будет сгладить представление вашей последовательности . Т.е., начиная с одной ДНК-последовательности измерения [140, 4], вы создаете сглаженное представление измерения [560, 1] путем объединения одноразовых представлений в тех же измерениях.

Может быть, пример является иллюстративным:

Приведенный пример последовательности ДНК «AC» кодируется в горячем виде в [[1, 0, 0, 0],[0, 1, 0, 0]]. Затем вы должны сгладить входные данные для [1, 0, 0, 0, 0, 1, 0, 0], чтобы вы могли обучить SVM на последовательностях ДНК длиной 2.

Почему это работает?

У SVM будет 8 весов (без учета условий смещения). Первый вес определит важность аденина, встречающегося в качестве первого нуклеотида. Второй вес будет учитывать важность наличия цитозина в качестве первого нуклеотида. Пятый вес определит важность аденина, встречающегося в качестве второго нуклеотида и так далее. Теперь, если ДНК-последовательности «АС» появляются, и мы хотим их классифицировать, все веса игнорируются, за исключением весов, соответствующих аденину, встречающемуся в качестве первого нуклеотида, и цитозину, как второму нуклеотиду.

Если вашДНК-последовательности не все имеют фиксированную длину, вам придется нуля их. Это означает добавление к их сплющенным нулям представления последовательности до тех пор, пока они не станут самой длинной последовательностью в вашем наборе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...