![](/img/trans.png)
[英]Parse parameter to custom kernel function of SVM in Sci-kit Learn
[英]Prediction always the same while using Sci-kit Learn SVM
我有一個數據集,試圖從DNA構成中預測數據輸入的是哪種DNA。 例如,字符串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〜列,因為每個DNA點可以是A
, T
, G
, C
,有時還可以是N
基本上,每個輸入的所有可能輸入都為0或1。 (有沒有更好的方式來做到這一點?科幻Kit了解不支持絕對編碼,我試圖盡我所能,從這個 。)然后我再次進行數據分開(我不得不合並,這樣我可以生成整體上假人數據空間)。
從這里開始,我只運行svm內容以適合x
和y
標簽,然后根據test_x
進行預測。 我還必須編碼/標記y
,從字符串版本到數字版本。 但是,是的,它總是產生N
,我覺得這是錯誤的。 我該如何解決? 謝謝!
我認為問題在於將數據拆分為訓練和測試的方式。 您已獲取了前3000個樣本進行培訓,其余190個樣本進行了測試。 我發現通過這種訓練,分類器可以為所有測試樣本生成真實的分類標簽( 得分 = 1.0)。 我還注意到,數據集的最后190個樣本具有相同的類標簽 ,即'N'
。 因此,您獲得的結果是正確的。
我建議你通過拆分數據集為訓練和測試ShuffleSplit
與test_size=.06
(這大約相當於三千一百九十零分之一百九十○雖然使結果的可視化更容易我用test_size=.01
下運行示例)。 為了簡單起見,我還建議您使用OneHotEncoder
對功能的分類值進行編碼。
這是完整的代碼(我已自由執行一些重構):
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
注意 :請確保您的sklearn版本為0.18.1,否則上面的代碼可能不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.