Ваша проблема в том, что 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 весов (без учета условий смещения). Первый вес определит важность аденина, встречающегося в качестве первого нуклеотида. Второй вес будет учитывать важность наличия цитозина в качестве первого нуклеотида. Пятый вес определит важность аденина, встречающегося в качестве второго нуклеотида и так далее. Теперь, если ДНК-последовательности «АС» появляются, и мы хотим их классифицировать, все веса игнорируются, за исключением весов, соответствующих аденину, встречающемуся в качестве первого нуклеотида, и цитозину, как второму нуклеотиду.
Если вашДНК-последовательности не все имеют фиксированную длину, вам придется нуля их. Это означает добавление к их сплющенным нулям представления последовательности до тех пор, пока они не станут самой длинной последовательностью в вашем наборе данных.