Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Sci工具包学习SVM时预测始终相同_Python_Pandas_Numpy_Scikit Learn_Sklearn Pandas - Fatal编程技术网

Python 使用Sci工具包学习SVM时预测始终相同

Python 使用Sci工具包学习SVM时预测始终相同,python,pandas,numpy,scikit-learn,sklearn-pandas,Python,Pandas,Numpy,Scikit Learn,Sklearn Pandas,我有一个数据集,我试图从DNA组成中预测数据输入是什么样的DNA。例如,字符串ATTAG…ACGAT可能会转换为EI。可能的输出为EI、IE或N。数据集可以进一步调查。我尝试将内核从linear切换到rbf,但结果是一样的。SVM分类器似乎每次都输出N。你知道为什么吗?我是Sci工具包的初学者 import pandas as pd # 3190 total training_data = pd.read_csv('new_training.csv') test_data = pd.read_c

我有一个数据集,我试图从DNA组成中预测数据输入是什么样的DNA。例如,字符串
ATTAG…ACGAT
可能会转换为
EI
。可能的输出为
EI
IE
N
。数据集可以进一步调查。我尝试将内核从
linear
切换到
rbf
,但结果是一样的。SVM分类器似乎每次都输出
N
。你知道为什么吗?我是Sci工具包的初学者

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不支持分类编码,我尽了最大努力。)然后我再次分离数据(我必须合并,以便在整个数据空间上生成假人)


从这里开始,我只需运行svm工具来拟合
x
y
标签,然后预测
test\ux
。我还必须编码/标记
y
,从字符串版本到数字版本。但是是的,它总是产生
N
,我觉得这是错误的。我怎么修理?谢谢大家!

我认为问题在于如何将数据分解为训练和测试。您已采集了前3000个样本用于培训,其余190个样本用于测试。我发现,通过这种训练,分类器可以为所有测试样本生成真实的类标签(分数=1.0)。我还注意到,数据集的最后190个样本具有相同的类标签,即
'N'
。因此,您得到的结果是正确的

我建议您使用
test\u size=.06
将数据集分割为序列并进行测试(这大约相当于190/3190,尽管为了更容易显示结果,我在下面的示例运行中使用了
test\u size=.01
)。为了简单起见,我还建议您使用对特性的分类值进行编码

以下是完整的代码(我已经冒昧地执行了一些重构):

演示:


注意:确保您的sklearn版本为0.18.1,否则上述代码可能无法使用。

尝试其他一些分类器,如LinearSVC()或KneighborsClassifier(),并检查它们是否产生相同的答案。如果是,则您可能需要检查数据。您是按原样使用数据集,还是在导入数据集之前进行了修改?我修改了数据集,使每个DNA斑点都是自己的变量,因此我应该有60个特征变量和1个输出标签。我还使用橙色库对数据集进行随机化,并保存到不同的文件中,这就是为什么我必须在上面的脚本开始时再次合并它们。很好!请注意,代码只适用于Python2,而对于Python3,它将是
data=numpy.loadtxt(r'splice.data',delimiter=',,dtype=bytes)。astype(str)
train\u index,test\u index=rs.split(X)。\uu next\uu()
Awesome!谢谢:)我会试试这个,可以确认工作!我会看更多的文档,以便更好地理解。再次感谢@Tonechas@Maximilian Peters为什么是
n_值=[60]*X_基形[1]
?我认为
n_值
作为一个数组意味着每个特征的值的数量。为什么不把可能的碱基数设为8?来源:谢谢你发现这一点。抢手货我的意思是
n_values=[8]*60
,但如果所有60个功能都可以接受8个分类值,那么您只需编写
enc=onehotcoder(n_values=len(base))
。我将编辑我的答案以修复此错误。
import numpy as np
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn.model_selection import ShuffleSplit
from sklearn import svm

data = np.loadtxt(r'splice.data', delimiter=',', dtype='string')

bases = {'A': 0, 'C': 1, 'D': 2, 'G': 3, 'N': 4, 'R': 5, 'S': 6, 'T': 7}

X_base = np.asarray([[bases[c] for c in seq.strip()] for seq in data[:, 2]])
y_class = data[:, 0]

enc = OneHotEncoder(n_values=len(bases))
lb = LabelEncoder()

enc.fit(X_base)  
lb.fit(y_class)

X = enc.transform(X_base).toarray()
y = lb.transform(y_class)

rs = ShuffleSplit(n_splits=1, test_size=.01, random_state=0)
train_index, test_index = rs.split(X).next()
train_X, train_y = X[train_index], y[train_index]
test_X, test_y = X[test_index], y[test_index]

clf = svm.SVC(kernel="rbf")
clf.fit(train_X, train_y)

predictions = clf.predict(test_X)
Out[2]: 
array(['IE', 'EI', 'EI', 'EI', 'EI', 'IE', 'N', 'N', 'EI', 'N', 'N', 'IE',
       'IE', 'N', 'N', 'IE', 'EI', 'N', 'N', 'EI', 'IE', 'EI', 'IE', 'N',
       'EI', 'N', 'IE', 'N', 'EI', 'N', 'N', 'EI'], 
      dtype='|S79')

In [3]: y_class[test_index]
Out[3]: 
array(['IE', 'EI', 'EI', 'EI', 'EI', 'IE', 'N', 'N', 'EI', 'N', 'N', 'IE',
       'IE', 'N', 'N', 'IE', 'EI', 'N', 'N', 'EI', 'IE', 'EI', 'IE', 'N',
       'IE', 'N', 'IE', 'N', 'EI', 'N', 'N', 'EI'], 
      dtype='|S79')

In [4]: clf.score(test_X, test_y)
Out[4]: 0.96875