【发布时间】:2017-06-20 14:22:35
【问题描述】:
我有一个数据集,我试图从 DNA 组成中预测数据条目的 DNA 类型。例如,字符串ATTAG...ACGAT 可能会转换为EI。可能的输出是EI、IE 或N。可以进一步调查数据集here。我尝试将内核从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~ 列,因为每个 DNA 点可以是A、T、G、C,有时是N。基本上每个输入的所有可能输入都为 0 或 1。 (有没有更好的方法来做到这一点?Sci-kit learn 不支持分类编码,我尽我所能从this。)然后我再次分离数据(我必须合并以便我可以在整个数据空间)。
从这里开始,我只是运行 svm 来适应 x 和 y 标签,然后预测 test_x。我还必须编码/标记y,从字符串版本到数字版本。但是,是的,它总是产生N,我觉得这是错误的。我该如何解决?谢谢!
【问题讨论】:
-
尝试一些其他分类器,如 LinearSVC() 或 KNeighborsClassifer() 并检查它们是否都产生相同的答案。如果是,那么您可能需要检查您的数据。
-
您是按原样使用数据集还是在导入之前进行了修改?
-
我修改了数据集,使每个 DNA 点都是自己的变量,因此我应该有 60 个特征变量和 1 个输出标签。
-
我还使用了 Orange 库来随机化数据集并保存到不同的文件中,这就是为什么我不得不在上述脚本的开头再次组合它们。
标签: python pandas numpy scikit-learn sklearn-pandas