У меня есть набор данных, в котором я пытаюсь предсказать, какая ДНК представляет собой запись данных по составу ДНК. Например, строка ATTAG...ACGAT
может быть преобразована в EI
. Возможные выходные значения: EI
, IE
или N
. Набор данных можно дополнительно изучить здесь< /а>. Пробовал переключать ядра с linear
на rbf
, но результат тот же. Классификатор SVM, похоже, каждый раз выводит N
. Есть идеи, почему? Я новичок в Sci-kit Learn.
import pandas as pd
# 3190 total
training_data = pd.read_csv('new_training.csv')
test_data = pd.read_csv('new_test.csv')
frames = [training_data, test_data]
data = pd.concat(frames)
x = data.iloc[:, 0:59]
y = data.iloc[:, 60]
x = pd.get_dummies(x)
train_x = x.iloc[0:3000, :]
train_y = y.iloc[0:3000]
test_x = x.iloc[3000:3190, :]
test_y = y.iloc[3000:3190]
from sklearn import svm
from sklearn import preprocessing
clf = svm.SVC(kernel="rbf")
label_encoder = preprocessing.LabelEncoder()
label_encoder.fit(y)
print(label_encoder.transform(train_y))
clf.fit(train_x, label_encoder.transform(train_y))
for u in train_y.unique():
print(u)
predictions = clf.predict(test_x)
correct = 0
total = len(predictions)
for i in range(total):
prediction = label_encoder.inverse_transform(predictions[i])
print('predicted %s and actual %s' % (prediction, test_y[i]))
print(len(prediction))
if prediction == test_y[i]:
correct += 1
print('correct %d out of %d' % (correct, total))
Сначала я импортирую обучающие и тестовые данные, объединяю их и разделяю на x (входные данные) или y (выходные данные). Затем я преобразовываю x в версию фиктивной переменной из исходных 60 столбцов примерно в 300~ столбцов, поскольку каждое пятно ДНК может быть A
, T
, G
, C
, а иногда и N
. В основном есть либо 0, либо 1 для всех возможных входов для каждого входа. (Есть ли лучший способ сделать это? Sci-kit Learn не поддерживает категориальное кодирование, и я старался изо всех сил из this.) Затем я снова разделяю данные (мне пришлось объединиться, чтобы я мог генерировать макеты для всего пространства данных).
Отсюда я просто запускаю материал svm, чтобы соответствовать меткам x
и y
, а затем предсказывать test_x
. Мне также пришлось закодировать/пометить y
из строковой версии в числовую версию. Но да, он всегда выдавал N
, что мне кажется неправильным. Как исправить? Благодарю вас!